2025-01-03 00:14:12 +01:00
|
|
|
using DotBased.AspNet.Authority.Models;
|
|
|
|
using DotBased.AspNet.Authority.Models.Authority;
|
|
|
|
using DotBased.AspNet.Authority.Models.Validation;
|
|
|
|
|
|
|
|
namespace DotBased.AspNet.Authority.Managers;
|
|
|
|
|
2025-01-08 16:06:25 +01:00
|
|
|
public partial class AuthorityManager
|
2025-01-03 00:14:12 +01:00
|
|
|
{
|
2025-01-08 15:55:00 +01:00
|
|
|
public async Task<ValidationResult> ValidatePasswordAsync(AuthorityUser user, string password)
|
2025-01-03 00:14:12 +01:00
|
|
|
{
|
|
|
|
List<ValidationError> errors = [];
|
|
|
|
foreach (var validator in PasswordValidators)
|
|
|
|
{
|
|
|
|
var validatorResult = await validator.ValidatePasswordAsync(this, user, password);
|
|
|
|
if (!validatorResult.Success)
|
|
|
|
{
|
|
|
|
errors.AddRange(validatorResult.Errors);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok();
|
|
|
|
}
|
|
|
|
|
2025-01-08 15:55:00 +01:00
|
|
|
public async Task<ValidationResult> ValidateUserAsync(AuthorityUser user)
|
2025-01-03 00:14:12 +01:00
|
|
|
{
|
|
|
|
List<ValidationError> errors = [];
|
|
|
|
foreach (var userValidator in UserValidators)
|
|
|
|
{
|
|
|
|
var validationResult = await userValidator.ValidateUserAsync(this, user);
|
|
|
|
if (!validationResult.Success)
|
|
|
|
{
|
|
|
|
errors.AddRange(validationResult.Errors);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok();
|
|
|
|
}
|
|
|
|
|
2025-02-10 16:11:58 +01:00
|
|
|
public async Task<ListResult<AuthorityUserItem>> SearchUsersAsync(string query, int maxResults = 20, int offset = 0, CancellationToken cancellationToken = default)
|
2025-01-04 00:52:04 +01:00
|
|
|
{
|
2025-02-01 01:02:27 +01:00
|
|
|
var result = await UserRepository.GetAuthorityUsersAsync(maxResults, offset, query, cancellationToken);
|
|
|
|
return result;
|
2025-01-04 00:52:04 +01:00
|
|
|
}
|
|
|
|
|
2025-02-10 16:11:58 +01:00
|
|
|
public async Task<AuthorityResult<AuthorityUser>> UpdatePasswordAsync(AuthorityUser user, string password, CancellationToken cancellationToken = default)
|
2025-01-04 00:52:04 +01:00
|
|
|
{
|
|
|
|
var passwordValidation = await ValidatePasswordAsync(user, password);
|
|
|
|
if (!passwordValidation.Success)
|
|
|
|
{
|
|
|
|
List<ValidationError> errors = [];
|
|
|
|
errors.AddRange(passwordValidation.Errors);
|
2025-01-08 15:55:00 +01:00
|
|
|
return AuthorityResult<AuthorityUser>.Failed(errors, ResultFailReason.Validation);
|
2025-01-04 00:52:04 +01:00
|
|
|
}
|
|
|
|
|
2025-01-08 15:55:00 +01:00
|
|
|
user.PasswordHash = await PasswordHasher.HashPasswordAsync(password);
|
2025-01-08 16:06:25 +01:00
|
|
|
user.SecurityVersion = GenerateVersion();
|
2025-01-04 00:52:04 +01:00
|
|
|
|
2025-01-08 16:22:59 +01:00
|
|
|
var updateResult = await UserRepository.UpdateUserAsync(user, cancellationToken);
|
2025-02-01 01:02:27 +01:00
|
|
|
return AuthorityResult<AuthorityUser>.FromResult(updateResult);
|
2025-01-04 00:52:04 +01:00
|
|
|
}
|
|
|
|
|
2025-02-10 16:11:58 +01:00
|
|
|
public async Task<AuthorityResult<AuthorityUser>> CreateUserAsync(AuthorityUser userModel, string password, CancellationToken cancellationToken = default)
|
2025-01-03 00:14:12 +01:00
|
|
|
{
|
|
|
|
var userValidation = await ValidateUserAsync(userModel);
|
|
|
|
var passwordValidation = await ValidatePasswordAsync(userModel, password);
|
|
|
|
if (!userValidation.Success || !passwordValidation.Success)
|
|
|
|
{
|
|
|
|
List<ValidationError> errors = [];
|
|
|
|
errors.AddRange(userValidation.Errors);
|
|
|
|
errors.AddRange(passwordValidation.Errors);
|
2025-01-08 15:55:00 +01:00
|
|
|
return AuthorityResult<AuthorityUser>.Failed(errors, ResultFailReason.Validation);
|
2025-01-03 00:14:12 +01:00
|
|
|
}
|
|
|
|
|
2025-01-08 16:06:25 +01:00
|
|
|
userModel.Version = GenerateVersion();
|
|
|
|
userModel.SecurityVersion = GenerateVersion();
|
2025-01-03 00:14:12 +01:00
|
|
|
var hashedPassword = await PasswordHasher.HashPasswordAsync(password);
|
2025-01-08 15:55:00 +01:00
|
|
|
userModel.PasswordHash = hashedPassword;
|
2025-01-03 00:14:12 +01:00
|
|
|
|
2025-01-08 16:22:59 +01:00
|
|
|
var userCreationResult = await UserRepository.CreateUserAsync(userModel, cancellationToken);
|
2025-02-01 01:02:27 +01:00
|
|
|
|
|
|
|
return AuthorityResult<AuthorityUser>.FromResult(userCreationResult);
|
2025-01-03 00:14:12 +01:00
|
|
|
}
|
2025-01-04 00:52:04 +01:00
|
|
|
|
2025-02-10 16:11:58 +01:00
|
|
|
public async Task<Result<AuthorityUser>> UpdateUserAsync(AuthorityUser model, CancellationToken cancellationToken = default)
|
2025-01-04 00:52:04 +01:00
|
|
|
{
|
2025-01-08 16:22:59 +01:00
|
|
|
var updateResult = await UserRepository.UpdateUserAsync(model, cancellationToken);
|
2025-02-01 01:02:27 +01:00
|
|
|
return updateResult;
|
2025-01-04 00:52:04 +01:00
|
|
|
}
|
|
|
|
|
2025-02-10 16:11:58 +01:00
|
|
|
public async Task<Result> DeleteUserAsync(AuthorityUser model, CancellationToken cancellationToken = default)
|
2025-01-04 00:52:04 +01:00
|
|
|
{
|
2025-01-08 16:22:59 +01:00
|
|
|
var deleteResult = await UserRepository.DeleteUserAsync(model, cancellationToken);
|
2025-01-04 00:52:04 +01:00
|
|
|
return deleteResult;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2025-01-03 00:14:12 +01:00
|
|
|
}
|