[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.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<ValidationResult> 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<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)
{
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);
@ -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<ValidationError> errors = [];
errors.AddRange(userValidation.Errors);
errors.AddRange(passwordValidation.Errors);
errors.AddRange(userValidation.ValidationErrors);
errors.AddRange(passwordValidation.ValidationErrors);
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;
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 = [];
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<T>(ResultError error) => new(error);
public static implicit operator ValidationResult<T>(List<ValidationError> 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<ValidationError> validationErrors) => new(validationErrors);
public static ValidationResult<T> FromResult(Result<T> result)
public static ValidationResult FromResult(Result result)
{
var authorityResult = result.Match<ValidationResult<T>>(
r => new ValidationResult<T>(r),
error => new ValidationResult<T>(error));
var authorityResult = result.Match<ValidationResult>(
() => new ValidationResult(),
error => new ValidationResult(error));
return authorityResult;
}
public TMatch Match<TMatch>(Func<T, TMatch> success, Func<ResultError, IReadOnlyList<ValidationError>, 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<ValidationError> validationErrors) => new(validationErrors);
}

View File

@ -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;

View File

@ -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;

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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();
}
}