1
0
mirror of https://github.com/bitwarden/server synced 2026-01-03 00:53:37 +00:00

CommandResult and ValidationResult tweaks (#5772)

* Simplify and align CommandResult and ValidationResult.
  In particular, 1 error per Failure/Invalid.

* Move these files to a common namespace

* Remove unused code
This commit is contained in:
Thomas Rittson
2025-05-09 10:46:49 +10:00
committed by GitHub
parent 547df25045
commit 5b3d3d6e20
42 changed files with 137 additions and 386 deletions

View File

@@ -1,23 +0,0 @@
namespace Bit.Core.Models.Commands;
public class BadRequestFailure<T> : Failure<T>
{
public BadRequestFailure(IEnumerable<string> errorMessage) : base(errorMessage)
{
}
public BadRequestFailure(string errorMessage) : base(errorMessage)
{
}
}
public class BadRequestFailure : Failure
{
public BadRequestFailure(IEnumerable<string> errorMessage) : base(errorMessage)
{
}
public BadRequestFailure(string errorMessage) : base(errorMessage)
{
}
}

View File

@@ -1,88 +0,0 @@
#nullable enable
using Bit.Core.AdminConsole.Errors;
using Bit.Core.AdminConsole.Shared.Validation;
namespace Bit.Core.Models.Commands;
public class CommandResult(IEnumerable<string> errors)
{
public CommandResult(string error) : this([error]) { }
public bool Success => ErrorMessages.Count == 0;
public bool HasErrors => ErrorMessages.Count > 0;
public List<string> ErrorMessages { get; } = errors.ToList();
public CommandResult() : this(Array.Empty<string>()) { }
}
public class Failure : CommandResult
{
protected Failure(IEnumerable<string> errorMessages) : base(errorMessages)
{
}
public Failure(string errorMessage) : base(errorMessage)
{
}
}
public class Success : CommandResult
{
}
public abstract class CommandResult<T>;
public class Success<T>(T value) : CommandResult<T>
{
public T Value { get; } = value;
}
public class Failure<T>(IEnumerable<string> errorMessages) : CommandResult<T>
{
public List<string> ErrorMessages { get; } = errorMessages.ToList();
public Error<T>[] Errors { get; set; } = [];
public string ErrorMessage => string.Join(" ", ErrorMessages);
public Failure(string error) : this([error])
{
}
public Failure(IEnumerable<Error<T>> errors) : this(errors.Select(e => e.Message))
{
Errors = errors.ToArray();
}
public Failure(Error<T> error) : this([error.Message])
{
Errors = [error];
}
}
public class Partial<T> : CommandResult<T>
{
public T[] Successes { get; set; } = [];
public Error<T>[] Failures { get; set; } = [];
public Partial(IEnumerable<T> successfulItems, IEnumerable<Error<T>> failedItems)
{
Successes = successfulItems.ToArray();
Failures = failedItems.ToArray();
}
}
public static class CommandResultExtensions
{
/// <summary>
/// This is to help map between the InvalidT ValidationResult and the FailureT CommandResult types.
///
/// </summary>
/// <param name="invalidResult">This is the invalid type from validating the object.</param>
/// <param name="mappingFunction">This function will map between the two types for the inner ErrorT</param>
/// <typeparam name="A">Invalid object's type</typeparam>
/// <typeparam name="B">Failure object's type</typeparam>
/// <returns></returns>
public static CommandResult<B> MapToFailure<A, B>(this Invalid<A> invalidResult, Func<A, B> mappingFunction) =>
new Failure<B>(invalidResult.Errors.Select(errorA => errorA.ToError(mappingFunction(errorA.ErroredValue))));
}

View File

@@ -1,24 +0,0 @@
namespace Bit.Core.Models.Commands;
public class NoRecordFoundFailure<T> : Failure<T>
{
public NoRecordFoundFailure(IEnumerable<string> errorMessage) : base(errorMessage)
{
}
public NoRecordFoundFailure(string errorMessage) : base(errorMessage)
{
}
}
public class NoRecordFoundFailure : Failure
{
public NoRecordFoundFailure(IEnumerable<string> errorMessage) : base(errorMessage)
{
}
public NoRecordFoundFailure(string errorMessage) : base(errorMessage)
{
}
}