[CHANGE] Updated ValidationResult to monad version

This commit is contained in:
max 2025-04-11 20:12:53 +02:00
parent f0cb7218ac
commit 21fe08c04f
8 changed files with 33 additions and 50 deletions

View File

@ -1,6 +1,7 @@
using DotBased.AspNet.Authority.Models; using DotBased.AspNet.Authority.Models;
using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Authority;
using DotBased.AspNet.Authority.Models.Validation; using DotBased.AspNet.Authority.Models.Validation;
using ValidationResult = DotBased.AspNet.Authority.Monads.ValidationResult;
namespace DotBased.AspNet.Authority.Managers; namespace DotBased.AspNet.Authority.Managers;
@ -12,12 +13,12 @@ public partial class AuthorityManager
foreach (var validator in PasswordValidators) foreach (var validator in PasswordValidators)
{ {
var validatorResult = await validator.ValidatePasswordAsync(this, user, password); 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<ValidationResult> ValidateUserAsync(AuthorityUser user) public async Task<ValidationResult> ValidateUserAsync(AuthorityUser user)
@ -26,12 +27,12 @@ public partial class AuthorityManager
foreach (var userValidator in UserValidators) foreach (var userValidator in UserValidators)
{ {
var validationResult = await userValidator.ValidateUserAsync(this, user); 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<ListResultOld<AuthorityUserItem>> SearchUsersAsync(string query, int maxResults = 20, int offset = 0, CancellationToken cancellationToken = default) public async Task<ListResultOld<AuthorityUserItem>> SearchUsersAsync(string query, int maxResults = 20, int offset = 0, CancellationToken cancellationToken = default)
@ -43,9 +44,9 @@ public partial class AuthorityManager
public async Task<AuthorityResultOldOld<AuthorityUser>> UpdatePasswordAsync(AuthorityUser user, string password, CancellationToken cancellationToken = default) public async Task<AuthorityResultOldOld<AuthorityUser>> UpdatePasswordAsync(AuthorityUser user, string password, CancellationToken cancellationToken = default)
{ {
var passwordValidation = await ValidatePasswordAsync(user, password); var passwordValidation = await ValidatePasswordAsync(user, password);
if (!passwordValidation.Success) if (!passwordValidation.IsSuccess)
{ {
return AuthorityResultOldOld<AuthorityUser>.Failed(passwordValidation.Errors, ResultFailReason.Validation); return AuthorityResultOldOld<AuthorityUser>.Failed(passwordValidation.ValidationErrors, ResultFailReason.Validation);
} }
user.PasswordHash = await PasswordHasher.HashPasswordAsync(password); user.PasswordHash = await PasswordHasher.HashPasswordAsync(password);
@ -59,11 +60,11 @@ public partial class AuthorityManager
{ {
var userValidation = await ValidateUserAsync(userModel); var userValidation = await ValidateUserAsync(userModel);
var passwordValidation = await ValidatePasswordAsync(userModel, password); var passwordValidation = await ValidatePasswordAsync(userModel, password);
if (!userValidation.Success || !passwordValidation.Success) if (!userValidation.IsSuccess || !passwordValidation.IsSuccess)
{ {
List<ValidationError> errors = []; List<ValidationError> errors = [];
errors.AddRange(userValidation.Errors); errors.AddRange(userValidation.ValidationErrors);
errors.AddRange(passwordValidation.Errors); errors.AddRange(passwordValidation.ValidationErrors);
return AuthorityResultOldOld<AuthorityUser>.Failed(errors, ResultFailReason.Validation); return AuthorityResultOldOld<AuthorityUser>.Failed(errors, ResultFailReason.Validation);
} }

View File

@ -1,21 +0,0 @@
namespace DotBased.AspNet.Authority.Models.Validation;
public class ValidationResult
{
public ValidationResult(bool success, IEnumerable<ValidationError>? errors = null)
{
if (errors != null)
{
Errors = errors.ToList();
}
Success = success;
}
public bool Success { get; }
public IReadOnlyList<ValidationError> Errors { get; } = [];
public static ValidationResult Failed(IEnumerable<ValidationError> errors) => new(false, errors);
public static ValidationResult Ok() => new(true);
public override string ToString() => Success ? "Success" : $"Failed ({Errors.Count} errors)";
}

View File

@ -3,9 +3,9 @@ using DotBased.Monads;
namespace DotBased.AspNet.Authority.Monads; namespace DotBased.AspNet.Authority.Monads;
public class ValidationResult<T> : Result<T> public class ValidationResult : Result
{ {
private ValidationResult(T result) : base(result) private ValidationResult()
{ {
} }
@ -25,19 +25,19 @@ public class ValidationResult<T> : Result<T>
private readonly List<ValidationError> _validationErrors = []; private readonly List<ValidationError> _validationErrors = [];
public IReadOnlyList<ValidationError> ValidationErrors => _validationErrors; public IReadOnlyList<ValidationError> ValidationErrors => _validationErrors;
public static implicit operator ValidationResult<T>(T result) => new(result);
public static implicit operator ValidationResult<T>(Exception exception) => new(exception); public static implicit operator ValidationResult(Exception exception) => new(exception);
public static implicit operator ValidationResult<T>(ResultError error) => new(error); public static implicit operator ValidationResult(ResultError error) => new(error);
public static implicit operator ValidationResult<T>(List<ValidationError> validationErrors) => new(validationErrors); public static implicit operator ValidationResult(List<ValidationError> validationErrors) => new(validationErrors);
public static ValidationResult<T> FromResult(Result<T> result) public static ValidationResult FromResult(Result result)
{ {
var authorityResult = result.Match<ValidationResult<T>>( var authorityResult = result.Match<ValidationResult>(
r => new ValidationResult<T>(r), () => new ValidationResult(),
error => new ValidationResult<T>(error)); error => new ValidationResult(error));
return authorityResult; return authorityResult;
} }
public TMatch Match<TMatch>(Func<T, TMatch> success, Func<ResultError, IReadOnlyList<ValidationError>, TMatch> failure) => public new static ValidationResult Success() => new();
IsSuccess && Value != null ? success(Value) : failure(Error ?? ResultError.Fail("No error and value is null!"), ValidationErrors); public static ValidationResult Fail(List<ValidationError> validationErrors) => new(validationErrors);
} }

View File

@ -1,6 +1,6 @@
using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Managers;
using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Authority;
using DotBased.AspNet.Authority.Models.Validation; using DotBased.AspNet.Authority.Monads;
namespace DotBased.AspNet.Authority.Validators; namespace DotBased.AspNet.Authority.Validators;

View File

@ -1,6 +1,6 @@
using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Managers;
using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Authority;
using DotBased.AspNet.Authority.Models.Validation; using DotBased.AspNet.Authority.Monads;
namespace DotBased.AspNet.Authority.Validators; namespace DotBased.AspNet.Authority.Validators;

View File

@ -1,6 +1,7 @@
using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Managers;
using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Authority;
using DotBased.AspNet.Authority.Models.Validation; using DotBased.AspNet.Authority.Models.Validation;
using DotBased.AspNet.Authority.Monads;
namespace DotBased.AspNet.Authority.Validators; 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!")); 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();
} }
} }

View File

@ -1,6 +1,7 @@
using DotBased.AspNet.Authority.Managers; using DotBased.AspNet.Authority.Managers;
using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Authority;
using DotBased.AspNet.Authority.Models.Validation; using DotBased.AspNet.Authority.Models.Validation;
using DotBased.AspNet.Authority.Monads;
using DotBased.Extensions; using DotBased.Extensions;
namespace DotBased.AspNet.Authority.Validators; 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.")); 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); private bool ContainsDigit(string strVal) => strVal.Any(char.IsDigit);

View File

@ -2,6 +2,7 @@ using DotBased.AspNet.Authority.Managers;
using DotBased.AspNet.Authority.Models.Authority; using DotBased.AspNet.Authority.Models.Authority;
using DotBased.AspNet.Authority.Models.Options; using DotBased.AspNet.Authority.Models.Options;
using DotBased.AspNet.Authority.Models.Validation; using DotBased.AspNet.Authority.Models.Validation;
using ValidationResult = DotBased.AspNet.Authority.Monads.ValidationResult;
namespace DotBased.AspNet.Authority.Validators; namespace DotBased.AspNet.Authority.Validators;
@ -53,7 +54,7 @@ public class UserValidator : IUserValidator
chars.AddRange(user.UserName.Where(userNameChar => userOptions.UserNameCharacters.Contains(userNameChar))); 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 errorCode = "";
var description = ""; var description = "";
switch (userOptions.UserNameCharacterListType) switch (userOptions.UserNameCharacterListType)
@ -76,6 +77,6 @@ public class UserValidator : IUserValidator
errors.Add(new ValidationError(ValidatorId, $"{ValidationBase}.InvalidUserName", "No username given!")); 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();
} }
} }