From 21fe08c04f3d2a75f5f3e648192a5180ecbe2b24 Mon Sep 17 00:00:00 2001 From: max Date: Fri, 11 Apr 2025 20:12:53 +0200 Subject: [PATCH] [CHANGE] Updated ValidationResult to monad version --- .../Managers/AuthorityUserManager.cs | 23 +++++++++--------- .../Models/Validation/ValidationResult.cs | 21 ---------------- .../Monads/ValidationResult.cs | 24 +++++++++---------- .../Validators/IPasswordValidator.cs | 2 +- .../Validators/IUserValidator.cs | 2 +- .../Validators/PasswordEqualsValidator.cs | 3 ++- .../Validators/PasswordOptionsValidator.cs | 3 ++- .../Validators/UserValidator.cs | 5 ++-- 8 files changed, 33 insertions(+), 50 deletions(-) delete mode 100755 DotBased.AspNet.Authority/Models/Validation/ValidationResult.cs diff --git a/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs b/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs index 940c100..81a99e4 100755 --- a/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs +++ b/DotBased.AspNet.Authority/Managers/AuthorityUserManager.cs @@ -1,6 +1,7 @@ using DotBased.AspNet.Authority.Models; using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Validation; +using ValidationResult = DotBased.AspNet.Authority.Monads.ValidationResult; namespace DotBased.AspNet.Authority.Managers; @@ -12,12 +13,12 @@ public partial class AuthorityManager foreach (var validator in PasswordValidators) { var validatorResult = await validator.ValidatePasswordAsync(this, user, password); - if (!validatorResult.Success) + if (!validatorResult.IsSuccess) { - errors.AddRange(validatorResult.Errors); + errors.AddRange(validatorResult.ValidationErrors); } } - return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok(); + return errors.Count > 0 ? ValidationResult.Fail(errors) : ValidationResult.Success(); } public async Task ValidateUserAsync(AuthorityUser user) @@ -26,12 +27,12 @@ public partial class AuthorityManager foreach (var userValidator in UserValidators) { var validationResult = await userValidator.ValidateUserAsync(this, user); - if (!validationResult.Success) + if (!validationResult.IsSuccess) { - errors.AddRange(validationResult.Errors); + errors.AddRange(validationResult.ValidationErrors); } } - return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok(); + return errors.Count > 0 ? ValidationResult.Fail(errors) : ValidationResult.Success(); } public async Task> SearchUsersAsync(string query, int maxResults = 20, int offset = 0, CancellationToken cancellationToken = default) @@ -43,9 +44,9 @@ public partial class AuthorityManager public async Task> UpdatePasswordAsync(AuthorityUser user, string password, CancellationToken cancellationToken = default) { var passwordValidation = await ValidatePasswordAsync(user, password); - if (!passwordValidation.Success) + if (!passwordValidation.IsSuccess) { - return AuthorityResultOldOld.Failed(passwordValidation.Errors, ResultFailReason.Validation); + return AuthorityResultOldOld.Failed(passwordValidation.ValidationErrors, ResultFailReason.Validation); } user.PasswordHash = await PasswordHasher.HashPasswordAsync(password); @@ -59,11 +60,11 @@ public partial class AuthorityManager { var userValidation = await ValidateUserAsync(userModel); var passwordValidation = await ValidatePasswordAsync(userModel, password); - if (!userValidation.Success || !passwordValidation.Success) + if (!userValidation.IsSuccess || !passwordValidation.IsSuccess) { List errors = []; - errors.AddRange(userValidation.Errors); - errors.AddRange(passwordValidation.Errors); + errors.AddRange(userValidation.ValidationErrors); + errors.AddRange(passwordValidation.ValidationErrors); return AuthorityResultOldOld.Failed(errors, ResultFailReason.Validation); } diff --git a/DotBased.AspNet.Authority/Models/Validation/ValidationResult.cs b/DotBased.AspNet.Authority/Models/Validation/ValidationResult.cs deleted file mode 100755 index aea2d80..0000000 --- a/DotBased.AspNet.Authority/Models/Validation/ValidationResult.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace DotBased.AspNet.Authority.Models.Validation; - -public class ValidationResult -{ - public ValidationResult(bool success, IEnumerable? errors = null) - { - if (errors != null) - { - Errors = errors.ToList(); - } - Success = success; - } - - public bool Success { get; } - public IReadOnlyList Errors { get; } = []; - - public static ValidationResult Failed(IEnumerable errors) => new(false, errors); - public static ValidationResult Ok() => new(true); - - public override string ToString() => Success ? "Success" : $"Failed ({Errors.Count} errors)"; -} \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Monads/ValidationResult.cs b/DotBased.AspNet.Authority/Monads/ValidationResult.cs index ed5edc5..a07ff0c 100644 --- a/DotBased.AspNet.Authority/Monads/ValidationResult.cs +++ b/DotBased.AspNet.Authority/Monads/ValidationResult.cs @@ -3,9 +3,9 @@ using DotBased.Monads; namespace DotBased.AspNet.Authority.Monads; -public class ValidationResult : Result +public class ValidationResult : Result { - private ValidationResult(T result) : base(result) + private ValidationResult() { } @@ -25,19 +25,19 @@ public class ValidationResult : Result private readonly List _validationErrors = []; public IReadOnlyList ValidationErrors => _validationErrors; - public static implicit operator ValidationResult(T result) => new(result); - public static implicit operator ValidationResult(Exception exception) => new(exception); - public static implicit operator ValidationResult(ResultError error) => new(error); - public static implicit operator ValidationResult(List validationErrors) => new(validationErrors); + + public static implicit operator ValidationResult(Exception exception) => new(exception); + public static implicit operator ValidationResult(ResultError error) => new(error); + public static implicit operator ValidationResult(List validationErrors) => new(validationErrors); - public static ValidationResult FromResult(Result result) + public static ValidationResult FromResult(Result result) { - var authorityResult = result.Match>( - r => new ValidationResult(r), - error => new ValidationResult(error)); + var authorityResult = result.Match( + () => new ValidationResult(), + error => new ValidationResult(error)); return authorityResult; } - public TMatch Match(Func success, Func, TMatch> failure) => - IsSuccess && Value != null ? success(Value) : failure(Error ?? ResultError.Fail("No error and value is null!"), ValidationErrors); + public new static ValidationResult Success() => new(); + public static ValidationResult Fail(List validationErrors) => new(validationErrors); } \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Validators/IPasswordValidator.cs b/DotBased.AspNet.Authority/Validators/IPasswordValidator.cs index 1208a21..8b529f3 100755 --- a/DotBased.AspNet.Authority/Validators/IPasswordValidator.cs +++ b/DotBased.AspNet.Authority/Validators/IPasswordValidator.cs @@ -1,6 +1,6 @@ using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Models.Authority; -using DotBased.AspNet.Authority.Models.Validation; +using DotBased.AspNet.Authority.Monads; namespace DotBased.AspNet.Authority.Validators; diff --git a/DotBased.AspNet.Authority/Validators/IUserValidator.cs b/DotBased.AspNet.Authority/Validators/IUserValidator.cs index ef07650..afa1429 100755 --- a/DotBased.AspNet.Authority/Validators/IUserValidator.cs +++ b/DotBased.AspNet.Authority/Validators/IUserValidator.cs @@ -1,6 +1,6 @@ using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Models.Authority; -using DotBased.AspNet.Authority.Models.Validation; +using DotBased.AspNet.Authority.Monads; namespace DotBased.AspNet.Authority.Validators; diff --git a/DotBased.AspNet.Authority/Validators/PasswordEqualsValidator.cs b/DotBased.AspNet.Authority/Validators/PasswordEqualsValidator.cs index 8278e13..3033fec 100755 --- a/DotBased.AspNet.Authority/Validators/PasswordEqualsValidator.cs +++ b/DotBased.AspNet.Authority/Validators/PasswordEqualsValidator.cs @@ -1,6 +1,7 @@ using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Validation; +using DotBased.AspNet.Authority.Monads; namespace DotBased.AspNet.Authority.Validators; @@ -17,6 +18,6 @@ public class PasswordEqualsValidator : IPasswordValidator errors.Add(new ValidationError(ValidatorId, $"{ValidationBase}.InUse", "User uses this password already!")); } - return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok(); + return errors.Count > 0 ? ValidationResult.Fail(errors) : ValidationResult.Success(); } } \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Validators/PasswordOptionsValidator.cs b/DotBased.AspNet.Authority/Validators/PasswordOptionsValidator.cs index 41cab40..0d76cf2 100755 --- a/DotBased.AspNet.Authority/Validators/PasswordOptionsValidator.cs +++ b/DotBased.AspNet.Authority/Validators/PasswordOptionsValidator.cs @@ -1,6 +1,7 @@ using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Validation; +using DotBased.AspNet.Authority.Monads; using DotBased.Extensions; namespace DotBased.AspNet.Authority.Validators; @@ -57,7 +58,7 @@ public class PasswordOptionsValidator : IPasswordValidator errors.Add(new ValidationError(ValidatorId, $"{ValidationBase}.UniqueChars", $"Password must contain at least {passwordOptions.MinimalUniqueChars} unique chars.")); } - return await Task.FromResult(errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok()); + return await Task.FromResult(errors.Count > 0 ? ValidationResult.Fail(errors) : ValidationResult.Success()); } private bool ContainsDigit(string strVal) => strVal.Any(char.IsDigit); diff --git a/DotBased.AspNet.Authority/Validators/UserValidator.cs b/DotBased.AspNet.Authority/Validators/UserValidator.cs index cb60dce..668e73f 100755 --- a/DotBased.AspNet.Authority/Validators/UserValidator.cs +++ b/DotBased.AspNet.Authority/Validators/UserValidator.cs @@ -2,6 +2,7 @@ using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Options; using DotBased.AspNet.Authority.Models.Validation; +using ValidationResult = DotBased.AspNet.Authority.Monads.ValidationResult; namespace DotBased.AspNet.Authority.Validators; @@ -53,7 +54,7 @@ public class UserValidator : IUserValidator chars.AddRange(user.UserName.Where(userNameChar => userOptions.UserNameCharacters.Contains(userNameChar))); } - if (chars.Count <= 0) return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok(); + if (chars.Count <= 0) return errors.Count > 0 ? ValidationResult.Fail(errors) : ValidationResult.Success(); var errorCode = ""; var description = ""; switch (userOptions.UserNameCharacterListType) @@ -76,6 +77,6 @@ public class UserValidator : IUserValidator errors.Add(new ValidationError(ValidatorId, $"{ValidationBase}.InvalidUserName", "No username given!")); } - return errors.Count > 0 ? ValidationResult.Failed(errors) : ValidationResult.Ok(); + return errors.Count > 0 ? ValidationResult.Fail(errors) : ValidationResult.Success(); } } \ No newline at end of file