diff --git a/zero.Raven/DbProviders/RavenIdentityStoreDbProvider.cs b/zero.Raven/DbProviders/RavenIdentityStoreDbProvider.cs index dafc8c6c..02fbac3e 100644 --- a/zero.Raven/DbProviders/RavenIdentityStoreDbProvider.cs +++ b/zero.Raven/DbProviders/RavenIdentityStoreDbProvider.cs @@ -13,8 +13,12 @@ public class RavenIdentityStoreDbProvider : IZeroIdentityStoreDbProvider { Ops = ops; } - - + + + public Task Load(string id, CancellationToken ct = default) where T : ZeroEntity, new() => + Ops.Load(id); + + public Task Find(Expression> expression, CancellationToken ct = default) where T : ZeroEntity => Ops.Session.Query().FirstOrDefaultAsync(expression, ct); diff --git a/zero/Identity/IZeroIdentityStoreDbProvider.cs b/zero/Identity/IZeroIdentityStoreDbProvider.cs index 7aa230f9..0897a64d 100644 --- a/zero/Identity/IZeroIdentityStoreDbProvider.cs +++ b/zero/Identity/IZeroIdentityStoreDbProvider.cs @@ -4,6 +4,8 @@ namespace zero.Identity; public interface IZeroIdentityStoreDbProvider { + Task Load(string id, CancellationToken ct = default) where T : ZeroEntity, new(); + Task Find(Expression> expression, CancellationToken ct = default) where T : ZeroEntity; Task> FindAll(Expression> expression, CancellationToken ct = default) where T : ZeroEntity; diff --git a/zero/Identity/Models/ZeroIdentityUser.cs b/zero/Identity/Models/ZeroIdentityUser.cs index 2924c270..7627fe77 100644 --- a/zero/Identity/Models/ZeroIdentityUser.cs +++ b/zero/Identity/Models/ZeroIdentityUser.cs @@ -52,6 +52,11 @@ public abstract class ZeroIdentityUser : ZeroEntity /// public List RoleIds { get; set; } = new(); + /// + /// Ability to implement ISupportsSoftDelete + /// + public bool IsDeleted { get; set; } + /// diff --git a/zero/Identity/ZeroRoleStore(TRole).cs b/zero/Identity/ZeroRoleStore(TRole).cs index 2c760592..2c0e08c9 100644 --- a/zero/Identity/ZeroRoleStore(TRole).cs +++ b/zero/Identity/ZeroRoleStore(TRole).cs @@ -121,7 +121,7 @@ public class ZeroRoleStore : public async Task FindByIdAsync(string roleId, CancellationToken cancellationToken) { // TODO index - return await Db.Find(x => x.Id == roleId, cancellationToken); + return await Db.Load(roleId); } diff --git a/zero/Identity/ZeroUserStore(TUser).cs b/zero/Identity/ZeroUserStore(TUser).cs index 2269887f..5bd3f09c 100644 --- a/zero/Identity/ZeroUserStore(TUser).cs +++ b/zero/Identity/ZeroUserStore(TUser).cs @@ -1,8 +1,5 @@ -using FluentValidation.Results; -using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity; using System.Security.Claims; -using System.Security.Cryptography; -using zero.Identity; namespace zero.Identity; @@ -60,7 +57,7 @@ public partial class ZeroUserStore : protected virtual async Task IsEmailReserved(TUser user, CancellationToken cancellationToken = default) { // TODO index - TUser existingUser = await Db.Find(x => x.Email == user.Email, cancellationToken); + TUser existingUser = await Db.Find(x => x.Email == user.Email && !x.IsDeleted, cancellationToken); return existingUser != null && existingUser.Id != user.Id; } @@ -104,7 +101,7 @@ public partial class ZeroUserStore : /// public async Task UpdateAsync(TUser user, CancellationToken cancellationToken) { - TUser source = await Db.Find(x => x.Id == user.Id); + TUser source = await Db.Load(user.Id); if (source == null) { @@ -139,7 +136,7 @@ public partial class ZeroUserStore : public async Task FindByIdAsync(string userId, CancellationToken cancellationToken) { // TODO index - return await Db.Find(x => x.Id == userId, cancellationToken); + return await Db.Load(userId); } @@ -147,7 +144,7 @@ public partial class ZeroUserStore : public async Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken) { // TODO index - return await Db.Find(x => x.Username == normalizedUserName, cancellationToken); + return await Db.Find(x => x.Username == normalizedUserName && !x.IsDeleted, cancellationToken); } @@ -211,7 +208,7 @@ public partial class ZeroUserStore : public async Task FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken) { // TODO index - return await Db.Find(x => x.Email == normalizedEmail, cancellationToken); + return await Db.Find(x => x.Email == normalizedEmail && !x.IsDeleted, cancellationToken); } @@ -352,7 +349,7 @@ public partial class ZeroUserStore : { UserClaim userClaim = new(claim); // TODO index - return await Db.FindAll(x => x.Claims.Any(c => c.Type == userClaim.Type && c.Value == userClaim.Value), cancellationToken); + return await Db.FindAll(x => !x.IsDeleted && x.Claims.Any(c => c.Type == userClaim.Type && c.Value == userClaim.Value), cancellationToken); } @@ -419,7 +416,7 @@ public partial class ZeroUserStore : public async Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken) { // TODO index - return await Db.Find(x => x.ExternalLogins.Any(l => l.LoginProvider.Equals(loginProvider, _comparer) && l.ProviderKey.Equals(providerKey, _comparer)), cancellationToken); + return await Db.Find(x => !x.IsDeleted && x.ExternalLogins.Any(l => l.LoginProvider.Equals(loginProvider, _comparer) && l.ProviderKey.Equals(providerKey, _comparer)), cancellationToken); } diff --git a/zero/Identity/ZeroUserStore(TUser,TRole).cs b/zero/Identity/ZeroUserStore(TUser,TRole).cs index b1d2c749..f3a8223a 100644 --- a/zero/Identity/ZeroUserStore(TUser,TRole).cs +++ b/zero/Identity/ZeroUserStore(TUser,TRole).cs @@ -29,7 +29,7 @@ public partial class ZeroUserStore : ZeroUserStore, /// public async Task> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken) { - return await Db.FindAll(x => x.RoleIds.Contains(roleName), cancellationToken); + return await Db.FindAll(x => !x.IsDeleted && x.RoleIds.Contains(roleName), cancellationToken); }