using DotBased.AspNet.Authority.Models; using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Validation; using DotBased.AspNet.Authority.Monads; using DotBased.Monads; namespace DotBased.AspNet.Authority.Managers; public partial class AuthorityManager { public async Task ValidatePasswordAsync(AuthorityUser user, string password) { List errors = []; foreach (var validator in PasswordValidators) { var validatorResult = await validator.ValidatePasswordAsync(this, user, password); if (!validatorResult.IsSuccess) { errors.AddRange(validatorResult.ValidationErrors); } } return errors.Count > 0 ? ValidationResult.Fail(errors) : ValidationResult.Success(); } public async Task ValidateUserAsync(AuthorityUser user) { List errors = []; foreach (var userValidator in UserValidators) { var validationResult = await userValidator.ValidateUserAsync(this, user); if (!validationResult.IsSuccess) { errors.AddRange(validationResult.ValidationErrors); } } return errors.Count > 0 ? ValidationResult.Fail(errors) : ValidationResult.Success(); } 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 = default) { var passwordValidation = await ValidatePasswordAsync(user, password); if (!passwordValidation.IsSuccess) { return passwordValidation.ValidationErrors.ToList(); } user.PasswordHash = await PasswordHasher.HashPasswordAsync(password); user.SecurityVersion = GenerateVersion(); var updateResult = await UserRepository.UpdateUserAsync(user, cancellationToken); if (updateResult == null) { return ResultError.Fail("Failed to update user password."); } return updateResult; } public async Task> CreateUserAsync(AuthorityUser userModel, string password, CancellationToken cancellationToken = default) { var userValidation = await ValidateUserAsync(userModel); var passwordValidation = await ValidatePasswordAsync(userModel, password); if (!userValidation.IsSuccess || !passwordValidation.IsSuccess) { List errors = []; errors.AddRange(userValidation.ValidationErrors); errors.AddRange(passwordValidation.ValidationErrors); return errors; } userModel.Version = GenerateVersion(); userModel.SecurityVersion = GenerateVersion(); var hashedPassword = await PasswordHasher.HashPasswordAsync(password); userModel.PasswordHash = hashedPassword; var userCreationResult = await UserRepository.CreateUserAsync(userModel, cancellationToken); if (userCreationResult == null) { return ResultError.Fail("Failed to create user."); } return userCreationResult; } public async Task> UpdateUserAsync(AuthorityUser model, CancellationToken cancellationToken = default) { var updateResult = await UserRepository.UpdateUserAsync(model, cancellationToken); if (updateResult == null) { return ResultError.Fail("Failed to update user."); } return updateResult; } public async Task DeleteUserAsync(AuthorityUser model, CancellationToken cancellationToken = default) { var deleteResult = await UserRepository.DeleteUsersAsync([model], cancellationToken); return deleteResult ? Result.Success() : ResultError.Fail("Failed to delete user."); } public async Task IsValidUserAsync(AuthorityUser user, CancellationToken cancellationToken = default) { var usrResult = await UserRepository.GetVersionAsync(user, cancellationToken); return usrResult == 0 ? ResultError.Fail("Invalid user version detected.") : Result.Success(); } }