diff --git a/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs b/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs index bcd8165..6a1dcf2 100644 --- a/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs +++ b/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs @@ -6,66 +6,140 @@ namespace DotBased.AspNet.Authority.EFCore.Repositories; public class UserRepository(IDbContextFactory contextFactory) : IUserRepository { - public async Task> GetAuthorityUsersAsync(int limit = 20, int offset = 0, string search = "", CancellationToken? cancellationToken = null) + public async Task> GetAuthorityUsersAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default) { - await using var context = await contextFactory.CreateDbContextAsync(); - var query = context.Users.AsQueryable(); - if (!string.IsNullOrWhiteSpace(search)) + try { - query = query.Where(u => $"{u.Id} {u.Name} {u.UserName} {u.EmailAddress} {u.PhoneNumber}".Contains(search, StringComparison.CurrentCultureIgnoreCase)); + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + var query = context.Users.AsQueryable(); + if (!string.IsNullOrWhiteSpace(search)) + { + query = query.Where(u => + $"{u.Id} {u.Name} {u.UserName} {u.EmailAddress} {u.PhoneNumber}".Contains(search, + StringComparison.CurrentCultureIgnoreCase)); + } + + var totalCount = query.Count(); + var selected = query.Skip(offset).Take(limit).Select(u => new AuthorityUserItem() + { + Id = u.Id, + UserName = u.UserName, + EmailAddress = u.EmailAddress, + PhoneNumber = u.PhoneNumber + }); + return ListResult.Ok(selected, totalCount, limit, offset); } - var totalCount = query.Count(); - var selected = query.Skip(offset).Take(limit).Select(u => new AuthorityUserItem() + catch (Exception e) { - Id = u.Id, - UserName = u.UserName, - EmailAddress = u.EmailAddress, - PhoneNumber = u.PhoneNumber - }); - return ListResult.Ok(selected, totalCount, limit, offset); + return ListResult.Failed("Failed to get users.", e); + } } - public Task> GetAuthorityUserByIdAsync(string id, CancellationToken? cancellationToken = null) + public async Task> GetAuthorityUserByIdAsync(string id, CancellationToken cancellationToken = default) + { + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + if (!Guid.TryParse(id, out var guid)) + { + return Result.Failed("Invalid id!"); + } + + var user = await context.Users.FirstOrDefaultAsync(u => u.Id == guid, cancellationToken: cancellationToken); + return Result.HandleResult(user, "User not found."); + } + catch (Exception e) + { + return Result.Failed("Failed to get user.", e); + } + } + + public async Task> CreateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) + { + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + if (user.Id == Guid.Empty) + { + return Result.Failed("Id cannot be empty!"); + } + var entity = context.Users.Add(user); + var saveResult = await context.SaveChangesAsync(cancellationToken); + return saveResult <= 0 ? Result.Failed("Failed to create user!") : Result.Ok(entity.Entity); + } + catch (Exception e) + { + return Result.Failed("Failed to create user.", e); + } + } + + public async Task> UpdateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) + { + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + var usr = context.Users.FirstOrDefault(u => u.Id == user.Id); + if (usr == null) + { + return Result.Failed("User not found!"); + } + + if (usr.Version != user.Version || usr.SecurityVersion != user.SecurityVersion) + { + return Result.Failed("Version validation failed!"); + } + + var entity = context.Users.Update(user); + var saveResult = await context.SaveChangesAsync(cancellationToken); + return saveResult <= 0 ? Result.Failed("Failed to save updated user!") : Result.Ok(entity.Entity); + } + catch (Exception e) + { + return Result.Failed("Failed to update user!", e); + } + } + + public async Task DeleteUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) + { + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + var usr = context.Users.FirstOrDefault(u => u.Id == user.Id); + if (usr == null) + { + return Result.Failed("User not found!"); + } + context.Users.Remove(usr); + var saveResult = await context.SaveChangesAsync(cancellationToken); + return saveResult <= 0 ? Result.Failed("Failed to delete user!") : Result.Ok(); + } + catch (Exception e) + { + return Result.Failed("Failed to delete user!", e); + } + } + + public Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } - public Task> CreateUserAsync(AuthorityUser user, CancellationToken? cancellationToken = null) + public Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } - public Task> UpdateUserAsync(AuthorityUser user, CancellationToken? cancellationToken = null) + public Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } - public Task DeleteUserAsync(AuthorityUser user, CancellationToken? cancellationToken = null) + public Task SetSecurityVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } - public Task> GetUserByEmailAsync(string email, CancellationToken? cancellationToken = null) - { - throw new NotImplementedException(); - } - - public Task SetVersionAsync(AuthorityUser user, long version, CancellationToken? cancellationToken = null) - { - throw new NotImplementedException(); - } - - public Task> GetVersionAsync(AuthorityUser user, CancellationToken? cancellationToken = null) - { - throw new NotImplementedException(); - } - - public Task SetSecurityVersionAsync(AuthorityUser user, long version, CancellationToken? cancellationToken = null) - { - throw new NotImplementedException(); - } - - public Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken? cancellationToken = null) + public Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } diff --git a/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs b/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs index 363c49c..cd31157 100755 --- a/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs +++ b/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs @@ -34,13 +34,13 @@ public partial class AuthorityManager return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok(); } - public async Task> SearchUsersAsync(string query, int maxResults = 20, int offset = 0, CancellationToken? cancellationToken = null) + public async Task> SearchUsersAsync(string query, int maxResults = 20, int offset = 0, CancellationToken cancellationToken = default) { var result = await UserRepository.GetAuthorityUsersAsync(maxResults, offset, query, cancellationToken); return result; } - public async Task> UpdatePasswordAsync(AuthorityUser user, string password, CancellationToken? cancellationToken = null) + public async Task> UpdatePasswordAsync(AuthorityUser user, string password, CancellationToken cancellationToken = default) { var passwordValidation = await ValidatePasswordAsync(user, password); if (!passwordValidation.Success) @@ -57,7 +57,7 @@ public partial class AuthorityManager return AuthorityResult.FromResult(updateResult); } - public async Task> CreateUserAsync(AuthorityUser userModel, string password, CancellationToken? cancellationToken = null) + public async Task> CreateUserAsync(AuthorityUser userModel, string password, CancellationToken cancellationToken = default) { var userValidation = await ValidateUserAsync(userModel); var passwordValidation = await ValidatePasswordAsync(userModel, password); @@ -79,13 +79,13 @@ public partial class AuthorityManager return AuthorityResult.FromResult(userCreationResult); } - public async Task> UpdateUserAsync(AuthorityUser model, CancellationToken? cancellationToken = null) + public async Task> UpdateUserAsync(AuthorityUser model, CancellationToken cancellationToken = default) { var updateResult = await UserRepository.UpdateUserAsync(model, cancellationToken); return updateResult; } - public async Task DeleteUserAsync(AuthorityUser model, CancellationToken? cancellationToken = null) + public async Task DeleteUserAsync(AuthorityUser model, CancellationToken cancellationToken = default) { var deleteResult = await UserRepository.DeleteUserAsync(model, cancellationToken); return deleteResult; diff --git a/DotBased.AspNet.Authority/Repositories/IUserRepository.cs b/DotBased.AspNet.Authority/Repositories/IUserRepository.cs index c84448a..01c4165 100755 --- a/DotBased.AspNet.Authority/Repositories/IUserRepository.cs +++ b/DotBased.AspNet.Authority/Repositories/IUserRepository.cs @@ -4,14 +4,14 @@ namespace DotBased.AspNet.Authority.Repositories; public interface IUserRepository { - public Task> GetAuthorityUsersAsync(int limit = 20, int offset = 0, string search = "", CancellationToken? cancellationToken = null); - public Task> GetAuthorityUserByIdAsync(string id, CancellationToken? cancellationToken = null); - public Task> CreateUserAsync(AuthorityUser user, CancellationToken? cancellationToken = null); - public Task> UpdateUserAsync(AuthorityUser user, CancellationToken? cancellationToken = null); - public Task DeleteUserAsync(AuthorityUser user, CancellationToken? cancellationToken = null); - public Task> GetUserByEmailAsync(string email, CancellationToken? cancellationToken = null); - public Task SetVersionAsync(AuthorityUser user, long version, CancellationToken? cancellationToken = null); - public Task> GetVersionAsync(AuthorityUser user, CancellationToken? cancellationToken = null); - public Task SetSecurityVersionAsync(AuthorityUser user, long version, CancellationToken? cancellationToken = null); - public Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken? cancellationToken = null); + public Task> GetAuthorityUsersAsync(int limit = 20, int offset = 0, string search = "", CancellationToken cancellationToken = default); + public Task> GetAuthorityUserByIdAsync(string id, CancellationToken cancellationToken = default); + public Task> CreateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task> UpdateUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task DeleteUserAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default); + public Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default); + public Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default); + public Task SetSecurityVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default); + public Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/DotBased/Result.cs b/DotBased/Result.cs index dcf1b28..4669c28 100755 --- a/DotBased/Result.cs +++ b/DotBased/Result.cs @@ -43,6 +43,11 @@ public class Result : Result public new static Result Failed(string message, Exception? exception = null) => new(false, message, default, exception); + + public new static Result HandleResult(TValue? value, string failedMessage, Exception? exception = null) + { + return value == null ? Failed(failedMessage, exception) : Ok(value); + } } public class ListResult : Result