mirror of
https://github.com/bitwarden/server.git
synced 2025-05-12 07:02:16 -05: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:
parent
547df25045
commit
5b3d3d6e20
@ -6,10 +6,10 @@ using Bit.Core.AdminConsole.Models.Business;
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
using Bit.Core.Billing.Pricing;
|
using Bit.Core.Billing.Pricing;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
using Bit.Core.Models.Commands;
|
|
||||||
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
@ -76,9 +76,8 @@ public class PostUserCommand(
|
|||||||
var invitedOrganizationUserId = result switch
|
var invitedOrganizationUserId = result switch
|
||||||
{
|
{
|
||||||
Success<ScimInviteOrganizationUsersResponse> success => success.Value.InvitedUser.Id,
|
Success<ScimInviteOrganizationUsersResponse> success => success.Value.InvitedUser.Id,
|
||||||
Failure<ScimInviteOrganizationUsersResponse> failure when failure.Errors
|
Failure<ScimInviteOrganizationUsersResponse> { Error.Message: NoUsersToInviteError.Code } => (Guid?)null,
|
||||||
.Any(x => x.Message == NoUsersToInviteError.Code) => (Guid?)null,
|
Failure<ScimInviteOrganizationUsersResponse> failure => throw MapToBitException(failure.Error),
|
||||||
Failure<ScimInviteOrganizationUsersResponse> failure when failure.Errors.Length != 0 => throw MapToBitException(failure.Errors),
|
|
||||||
_ => throw new InvalidOperationException()
|
_ => throw new InvalidOperationException()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
using Bit.Core.Models.Commands;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace Bit.Api.Utilities;
|
|
||||||
|
|
||||||
public static class CommandResultExtensions
|
|
||||||
{
|
|
||||||
public static IActionResult MapToActionResult<T>(this CommandResult<T> commandResult)
|
|
||||||
{
|
|
||||||
return commandResult switch
|
|
||||||
{
|
|
||||||
NoRecordFoundFailure<T> failure => new ObjectResult(failure.ErrorMessages) { StatusCode = StatusCodes.Status404NotFound },
|
|
||||||
BadRequestFailure<T> failure => new ObjectResult(failure.ErrorMessages) { StatusCode = StatusCodes.Status400BadRequest },
|
|
||||||
Failure<T> failure => new ObjectResult(failure.ErrorMessages) { StatusCode = StatusCodes.Status400BadRequest },
|
|
||||||
Success<T> success => new ObjectResult(success.Value) { StatusCode = StatusCodes.Status200OK },
|
|
||||||
_ => throw new InvalidOperationException($"Unhandled commandResult type: {commandResult.GetType().Name}")
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IActionResult MapToActionResult(this CommandResult commandResult)
|
|
||||||
{
|
|
||||||
return commandResult switch
|
|
||||||
{
|
|
||||||
NoRecordFoundFailure failure => new ObjectResult(failure.ErrorMessages) { StatusCode = StatusCodes.Status404NotFound },
|
|
||||||
BadRequestFailure failure => new ObjectResult(failure.ErrorMessages) { StatusCode = StatusCodes.Status400BadRequest },
|
|
||||||
Failure failure => new ObjectResult(failure.ErrorMessages) { StatusCode = StatusCodes.Status400BadRequest },
|
|
||||||
Success => new ObjectResult(new { }) { StatusCode = StatusCodes.Status200OK },
|
|
||||||
_ => throw new InvalidOperationException($"Unhandled commandResult type: {commandResult.GetType().Name}")
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Requests;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Requests;
|
||||||
using Bit.Core.Models.Commands;
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
using Bit.Core.Models.Commands;
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
||||||
|
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
using Bit.Core.AdminConsole.Entities;
|
using Bit.Core.AdminConsole.Entities;
|
||||||
using Bit.Core.AdminConsole.Enums.Provider;
|
using Bit.Core.AdminConsole.Enums.Provider;
|
||||||
using Bit.Core.AdminConsole.Errors;
|
|
||||||
using Bit.Core.AdminConsole.Interfaces;
|
using Bit.Core.AdminConsole.Interfaces;
|
||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Errors;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
|
||||||
using Bit.Core.AdminConsole.Repositories;
|
using Bit.Core.AdminConsole.Repositories;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Context;
|
using Bit.Core.Context;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Business;
|
using Bit.Core.Models.Business;
|
||||||
using Bit.Core.Models.Commands;
|
|
||||||
using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface;
|
using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
@ -50,11 +50,11 @@ public class InviteOrganizationUsersCommand(IEventService eventService,
|
|||||||
{
|
{
|
||||||
case Failure<InviteOrganizationUsersResponse> failure:
|
case Failure<InviteOrganizationUsersResponse> failure:
|
||||||
return new Failure<ScimInviteOrganizationUsersResponse>(
|
return new Failure<ScimInviteOrganizationUsersResponse>(
|
||||||
failure.Errors.Select(error => new Error<ScimInviteOrganizationUsersResponse>(error.Message,
|
new Error<ScimInviteOrganizationUsersResponse>(failure.Error.Message,
|
||||||
new ScimInviteOrganizationUsersResponse
|
new ScimInviteOrganizationUsersResponse
|
||||||
{
|
{
|
||||||
InvitedUser = error.ErroredValue.InvitedUsers.FirstOrDefault()
|
InvitedUser = failure.Error.ErroredValue.InvitedUsers.FirstOrDefault()
|
||||||
})));
|
}));
|
||||||
|
|
||||||
case Success<InviteOrganizationUsersResponse> success when success.Value.InvitedUsers.Any():
|
case Success<InviteOrganizationUsersResponse> success when success.Value.InvitedUsers.Any():
|
||||||
var user = success.Value.InvitedUsers.First();
|
var user = success.Value.InvitedUsers.First();
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.GlobalSettings;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.GlobalSettings;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.GlobalSettings;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.GlobalSettings;
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.PasswordManager;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.PasswordManager;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Models.Business;
|
using Bit.Core.Models.Business;
|
||||||
using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface;
|
using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Organization;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Organization;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Organization;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Organization;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.PasswordManager;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.PasswordManager;
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.V
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Organization;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Organization;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Provider;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Provider;
|
||||||
using Bit.Core.AdminConsole.Repositories;
|
using Bit.Core.AdminConsole.Repositories;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
using Bit.Core.Settings;
|
using Bit.Core.Settings;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Models;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Payments;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Payments;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Payments;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Payments;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Billing.Constants;
|
using Bit.Core.Billing.Constants;
|
||||||
using Bit.Core.Billing.Enums;
|
using Bit.Core.Billing.Enums;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Provider;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Provider;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Enums.Provider;
|
using Bit.Core.AdminConsole.Enums.Provider;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Billing.Extensions;
|
using Bit.Core.Billing.Extensions;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Provider;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Provider;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
using Bit.Core.AdminConsole.Models.Data;
|
using Bit.Core.AdminConsole.Models.Data;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Requests;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Requests;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Commands;
|
|
||||||
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.Shared.Validation;
|
|
||||||
|
|
||||||
public abstract record ValidationResult<T>;
|
|
||||||
|
|
||||||
public record Valid<T> : ValidationResult<T>
|
|
||||||
{
|
|
||||||
public Valid() { }
|
|
||||||
|
|
||||||
public Valid(T Value)
|
|
||||||
{
|
|
||||||
this.Value = Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T Value { get; init; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public record Invalid<T> : ValidationResult<T>
|
|
||||||
{
|
|
||||||
public IEnumerable<Error<T>> Errors { get; init; } = [];
|
|
||||||
|
|
||||||
public string ErrorMessageString => string.Join(" ", Errors.Select(e => e.Message));
|
|
||||||
|
|
||||||
public Invalid() { }
|
|
||||||
|
|
||||||
public Invalid(Error<T> error) : this([error]) { }
|
|
||||||
|
|
||||||
public Invalid(IEnumerable<Error<T>> errors)
|
|
||||||
{
|
|
||||||
Errors = errors;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ValidationResultMappers
|
|
||||||
{
|
|
||||||
public static ValidationResult<B> Map<A, B>(this ValidationResult<A> validationResult, B invalidValue) =>
|
|
||||||
validationResult switch
|
|
||||||
{
|
|
||||||
Valid<A> => new Valid<B>(invalidValue),
|
|
||||||
Invalid<A> invalid => new Invalid<B>(invalid.Errors.Select(x => x.ToError(invalidValue))),
|
|
||||||
_ => throw new ArgumentOutOfRangeException(nameof(validationResult), "Unhandled validation result type")
|
|
||||||
};
|
|
||||||
}
|
|
51
src/Core/AdminConsole/Utilities/Commands/CommandResult.cs
Normal file
51
src/Core/AdminConsole/Utilities/Commands/CommandResult.cs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#nullable enable
|
||||||
|
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
|
|
||||||
|
namespace Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
|
|
||||||
|
public abstract class CommandResult<T>;
|
||||||
|
|
||||||
|
public class Success<T>(T value) : CommandResult<T>
|
||||||
|
{
|
||||||
|
public T Value { get; } = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Failure<T>(Error<T> error) : CommandResult<T>
|
||||||
|
{
|
||||||
|
public Error<T> Error { get; } = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Partial<T>(IEnumerable<T> successfulItems, IEnumerable<Error<T>> failedItems)
|
||||||
|
: CommandResult<T>
|
||||||
|
{
|
||||||
|
public IEnumerable<T> Successes { get; } = successfulItems;
|
||||||
|
public IEnumerable<Error<T>> Failures { get; } = failedItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
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.Error.ToError(mappingFunction(invalidResult.Error.ErroredValue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Obsolete("Use CommandResult<T> instead. This will be removed once old code is updated.")]
|
||||||
|
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>()) { }
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
namespace Bit.Core.AdminConsole.Errors;
|
namespace Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
public record Error<T>(string Message, T ErroredValue);
|
public record Error<T>(string Message, T ErroredValue);
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
namespace Bit.Core.AdminConsole.Errors;
|
namespace Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
public record InsufficientPermissionsError<T>(string Message, T ErroredValue) : Error<T>(Message, ErroredValue)
|
public record InsufficientPermissionsError<T>(string Message, T ErroredValue) : Error<T>(Message, ErroredValue)
|
||||||
{
|
{
|
@ -1,4 +1,4 @@
|
|||||||
namespace Bit.Core.AdminConsole.Errors;
|
namespace Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
public record InvalidResultTypeError<T>(T Value) : Error<T>(Code, Value)
|
public record InvalidResultTypeError<T>(T Value) : Error<T>(Code, Value)
|
||||||
{
|
{
|
@ -1,4 +1,4 @@
|
|||||||
namespace Bit.Core.AdminConsole.Errors;
|
namespace Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
public record RecordNotFoundError<T>(string Message, T ErroredValue) : Error<T>(Message, ErroredValue)
|
public record RecordNotFoundError<T>(string Message, T ErroredValue) : Error<T>(Message, ErroredValue)
|
||||||
{
|
{
|
@ -1,4 +1,4 @@
|
|||||||
namespace Bit.Core.AdminConsole.Shared.Validation;
|
namespace Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
|
|
||||||
public interface IValidator<T>
|
public interface IValidator<T>
|
||||||
{
|
{
|
@ -0,0 +1,20 @@
|
|||||||
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
|
||||||
|
namespace Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
|
|
||||||
|
public abstract record ValidationResult<T>;
|
||||||
|
|
||||||
|
public record Valid<T>(T Value) : ValidationResult<T>;
|
||||||
|
|
||||||
|
public record Invalid<T>(Error<T> Error) : ValidationResult<T>;
|
||||||
|
|
||||||
|
public static class ValidationResultMappers
|
||||||
|
{
|
||||||
|
public static ValidationResult<B> Map<A, B>(this ValidationResult<A> validationResult, B invalidValue) =>
|
||||||
|
validationResult switch
|
||||||
|
{
|
||||||
|
Valid<A> => new Valid<B>(invalidValue),
|
||||||
|
Invalid<A> invalid => new Invalid<B>(invalid.Error.ToError(invalidValue)),
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(validationResult), "Unhandled validation result type")
|
||||||
|
};
|
||||||
|
}
|
@ -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)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
@ -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))));
|
|
||||||
}
|
|
@ -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)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
|||||||
using Bit.Api.Utilities;
|
|
||||||
using Bit.Core.Models.Commands;
|
|
||||||
using Bit.Core.Vault.Entities;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Xunit;
|
|
||||||
|
|
||||||
namespace Bit.Api.Test.Utilities;
|
|
||||||
|
|
||||||
public class CommandResultExtensionTests
|
|
||||||
{
|
|
||||||
public static IEnumerable<object[]> WithGenericTypeTestCases()
|
|
||||||
{
|
|
||||||
yield return new object[]
|
|
||||||
{
|
|
||||||
new NoRecordFoundFailure<Cipher>(new[] { "Error 1", "Error 2" }),
|
|
||||||
new ObjectResult(new[] { "Error 1", "Error 2" }) { StatusCode = StatusCodes.Status404NotFound }
|
|
||||||
};
|
|
||||||
yield return new object[]
|
|
||||||
{
|
|
||||||
new BadRequestFailure<Cipher>("Error 3"),
|
|
||||||
new ObjectResult(new[] { "Error 3" }) { StatusCode = StatusCodes.Status400BadRequest }
|
|
||||||
};
|
|
||||||
yield return new object[]
|
|
||||||
{
|
|
||||||
new Failure<Cipher>("Error 4"),
|
|
||||||
new ObjectResult(new[] { "Error 4" }) { StatusCode = StatusCodes.Status400BadRequest }
|
|
||||||
};
|
|
||||||
var cipher = new Cipher() { Id = Guid.NewGuid() };
|
|
||||||
|
|
||||||
yield return new object[]
|
|
||||||
{
|
|
||||||
new Success<Cipher>(cipher),
|
|
||||||
new ObjectResult(cipher) { StatusCode = StatusCodes.Status200OK }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Theory]
|
|
||||||
[MemberData(nameof(WithGenericTypeTestCases))]
|
|
||||||
public void MapToActionResult_WithGenericType_ShouldMapToHttpResponse(CommandResult<Cipher> input, ObjectResult expected)
|
|
||||||
{
|
|
||||||
var result = input.MapToActionResult();
|
|
||||||
|
|
||||||
Assert.Equivalent(expected, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void MapToActionResult_WithGenericType_ShouldThrowExceptionForUnhandledCommandResult()
|
|
||||||
{
|
|
||||||
var result = new NotImplementedCommandResult();
|
|
||||||
|
|
||||||
Assert.Throws<InvalidOperationException>(() => result.MapToActionResult());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IEnumerable<object[]> TestCases()
|
|
||||||
{
|
|
||||||
yield return new object[]
|
|
||||||
{
|
|
||||||
new NoRecordFoundFailure(new[] { "Error 1", "Error 2" }),
|
|
||||||
new ObjectResult(new[] { "Error 1", "Error 2" }) { StatusCode = StatusCodes.Status404NotFound }
|
|
||||||
};
|
|
||||||
yield return new object[]
|
|
||||||
{
|
|
||||||
new BadRequestFailure("Error 3"),
|
|
||||||
new ObjectResult(new[] { "Error 3" }) { StatusCode = StatusCodes.Status400BadRequest }
|
|
||||||
};
|
|
||||||
yield return new object[]
|
|
||||||
{
|
|
||||||
new Failure("Error 4"),
|
|
||||||
new ObjectResult(new[] { "Error 4" }) { StatusCode = StatusCodes.Status400BadRequest }
|
|
||||||
};
|
|
||||||
yield return new object[]
|
|
||||||
{
|
|
||||||
new Success(),
|
|
||||||
new ObjectResult(new { }) { StatusCode = StatusCodes.Status200OK }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
[Theory]
|
|
||||||
[MemberData(nameof(TestCases))]
|
|
||||||
public void MapToActionResult_ShouldMapToHttpResponse(CommandResult input, ObjectResult expected)
|
|
||||||
{
|
|
||||||
var result = input.MapToActionResult();
|
|
||||||
|
|
||||||
Assert.Equivalent(expected, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void MapToActionResult_ShouldThrowExceptionForUnhandledCommandResult()
|
|
||||||
{
|
|
||||||
var result = new NotImplementedCommandResult<Cipher>();
|
|
||||||
|
|
||||||
Assert.Throws<InvalidOperationException>(() => result.MapToActionResult());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NotImplementedCommandResult<T> : CommandResult<T>
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NotImplementedCommandResult : CommandResult
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
@ -2,7 +2,6 @@
|
|||||||
using Bit.Core.AdminConsole.Entities;
|
using Bit.Core.AdminConsole.Entities;
|
||||||
using Bit.Core.AdminConsole.Entities.Provider;
|
using Bit.Core.AdminConsole.Entities.Provider;
|
||||||
using Bit.Core.AdminConsole.Enums.Provider;
|
using Bit.Core.AdminConsole.Enums.Provider;
|
||||||
using Bit.Core.AdminConsole.Errors;
|
|
||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.Models.Data.Provider;
|
using Bit.Core.AdminConsole.Models.Data.Provider;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
||||||
@ -11,12 +10,13 @@ using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.M
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.PasswordManager;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.PasswordManager;
|
||||||
using Bit.Core.AdminConsole.Repositories;
|
using Bit.Core.AdminConsole.Repositories;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Billing.Models.StaticStore.Plans;
|
using Bit.Core.Billing.Models.StaticStore.Plans;
|
||||||
using Bit.Core.Entities;
|
using Bit.Core.Entities;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Business;
|
using Bit.Core.Models.Business;
|
||||||
using Bit.Core.Models.Commands;
|
|
||||||
using Bit.Core.Models.Data;
|
using Bit.Core.Models.Data;
|
||||||
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
||||||
using Bit.Core.Models.StaticStore;
|
using Bit.Core.Models.StaticStore;
|
||||||
@ -80,7 +80,7 @@ public class InviteOrganizationUserCommandTests
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.IsType<Failure<ScimInviteOrganizationUsersResponse>>(result);
|
Assert.IsType<Failure<ScimInviteOrganizationUsersResponse>>(result);
|
||||||
Assert.Equal(NoUsersToInviteError.Code, (result as Failure<ScimInviteOrganizationUsersResponse>).ErrorMessage);
|
Assert.Equal(NoUsersToInviteError.Code, (result as Failure<ScimInviteOrganizationUsersResponse>)!.Error.Message);
|
||||||
|
|
||||||
await sutProvider.GetDependency<IPaymentService>()
|
await sutProvider.GetDependency<IPaymentService>()
|
||||||
.DidNotReceiveWithAnyArgs()
|
.DidNotReceiveWithAnyArgs()
|
||||||
@ -209,7 +209,7 @@ public class InviteOrganizationUserCommandTests
|
|||||||
Assert.IsType<Failure<ScimInviteOrganizationUsersResponse>>(result);
|
Assert.IsType<Failure<ScimInviteOrganizationUsersResponse>>(result);
|
||||||
var failure = result as Failure<ScimInviteOrganizationUsersResponse>;
|
var failure = result as Failure<ScimInviteOrganizationUsersResponse>;
|
||||||
|
|
||||||
Assert.Equal(errorMessage, failure!.ErrorMessage);
|
Assert.Equal(errorMessage, failure!.Error.Message);
|
||||||
|
|
||||||
await sutProvider.GetDependency<IOrganizationUserRepository>()
|
await sutProvider.GetDependency<IOrganizationUserRepository>()
|
||||||
.DidNotReceive()
|
.DidNotReceive()
|
||||||
@ -571,7 +571,7 @@ public class InviteOrganizationUserCommandTests
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.IsType<Failure<ScimInviteOrganizationUsersResponse>>(result);
|
Assert.IsType<Failure<ScimInviteOrganizationUsersResponse>>(result);
|
||||||
Assert.Equal(FailedToInviteUsersError.Code, (result as Failure<ScimInviteOrganizationUsersResponse>)!.ErrorMessage);
|
Assert.Equal(FailedToInviteUsersError.Code, (result as Failure<ScimInviteOrganizationUsersResponse>)!.Error.Message);
|
||||||
|
|
||||||
// org user revert
|
// org user revert
|
||||||
await orgUserRepository.Received(1).DeleteManyAsync(Arg.Is<IEnumerable<Guid>>(x => x.Count() == 1));
|
await orgUserRepository.Received(1).DeleteManyAsync(Arg.Is<IEnumerable<Guid>>(x => x.Count() == 1));
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Billing.Models.StaticStore.Plans;
|
using Bit.Core.Billing.Models.StaticStore.Plans;
|
||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
using Bit.Core.Models.Business;
|
using Bit.Core.Models.Business;
|
||||||
@ -156,6 +156,6 @@ public class InviteOrganizationUsersValidatorTests
|
|||||||
var result = await sutProvider.Sut.ValidateAsync(request);
|
var result = await sutProvider.Sut.ValidateAsync(request);
|
||||||
|
|
||||||
Assert.IsType<Invalid<InviteOrganizationUsersValidationRequest>>(result);
|
Assert.IsType<Invalid<InviteOrganizationUsersValidationRequest>>(result);
|
||||||
Assert.Equal("Some Secrets Manager Failure", (result as Invalid<InviteOrganizationUsersValidationRequest>)!.ErrorMessageString);
|
Assert.Equal("Some Secrets Manager Failure", (result as Invalid<InviteOrganizationUsersValidationRequest>)!.Error.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
using Bit.Core.AdminConsole.Entities;
|
using Bit.Core.AdminConsole.Entities;
|
||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Organization;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Organization;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Billing.Models.StaticStore.Plans;
|
using Bit.Core.Billing.Models.StaticStore.Plans;
|
||||||
using Bit.Test.Common.AutoFixture;
|
using Bit.Test.Common.AutoFixture;
|
||||||
using Bit.Test.Common.AutoFixture.Attributes;
|
using Bit.Test.Common.AutoFixture.Attributes;
|
||||||
@ -36,7 +36,7 @@ public class InviteUserOrganizationValidationTests
|
|||||||
var result = await sutProvider.Sut.ValidateAsync(inviteOrganization);
|
var result = await sutProvider.Sut.ValidateAsync(inviteOrganization);
|
||||||
|
|
||||||
Assert.IsType<Invalid<InviteOrganization>>(result);
|
Assert.IsType<Invalid<InviteOrganization>>(result);
|
||||||
Assert.Equal(OrganizationNoPaymentMethodFoundError.Code, (result as Invalid<InviteOrganization>)!.ErrorMessageString);
|
Assert.Equal(OrganizationNoPaymentMethodFoundError.Code, (result as Invalid<InviteOrganization>)!.Error.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
@ -53,6 +53,6 @@ public class InviteUserOrganizationValidationTests
|
|||||||
var result = await sutProvider.Sut.ValidateAsync(inviteOrganization);
|
var result = await sutProvider.Sut.ValidateAsync(inviteOrganization);
|
||||||
|
|
||||||
Assert.IsType<Invalid<InviteOrganization>>(result);
|
Assert.IsType<Invalid<InviteOrganization>>(result);
|
||||||
Assert.Equal(OrganizationNoSubscriptionFoundError.Code, (result as Invalid<InviteOrganization>)!.ErrorMessageString);
|
Assert.Equal(OrganizationNoSubscriptionFoundError.Code, (result as Invalid<InviteOrganization>)!.Error.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ using Bit.Core.AdminConsole.Models.Business;
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Payments;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.Payments;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Billing.Constants;
|
using Bit.Core.Billing.Constants;
|
||||||
using Bit.Core.Billing.Enums;
|
using Bit.Core.Billing.Enums;
|
||||||
using Bit.Core.Billing.Models.StaticStore.Plans;
|
using Bit.Core.Billing.Models.StaticStore.Plans;
|
||||||
@ -39,7 +39,7 @@ public class InviteUserPaymentValidationTests
|
|||||||
});
|
});
|
||||||
|
|
||||||
Assert.IsType<Invalid<PaymentsSubscription>>(result);
|
Assert.IsType<Invalid<PaymentsSubscription>>(result);
|
||||||
Assert.Equal(PaymentCancelledSubscriptionError.Code, (result as Invalid<PaymentsSubscription>)!.ErrorMessageString);
|
Assert.Equal(PaymentCancelledSubscriptionError.Code, (result as Invalid<PaymentsSubscription>)!.Error.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
using Bit.Core.AdminConsole.Entities;
|
using Bit.Core.AdminConsole.Entities;
|
||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.PasswordManager;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Validation.PasswordManager;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Bit.Core.Billing.Enums;
|
using Bit.Core.Billing.Enums;
|
||||||
using Bit.Core.Billing.Models.StaticStore.Plans;
|
using Bit.Core.Billing.Models.StaticStore.Plans;
|
||||||
using Bit.Test.Common.AutoFixture;
|
using Bit.Test.Common.AutoFixture;
|
||||||
@ -67,7 +67,7 @@ public class InviteUsersPasswordManagerValidatorTests
|
|||||||
var result = await sutProvider.Sut.ValidateAsync(subscriptionUpdate);
|
var result = await sutProvider.Sut.ValidateAsync(subscriptionUpdate);
|
||||||
|
|
||||||
Assert.IsType<Invalid<PasswordManagerSubscriptionUpdate>>(result);
|
Assert.IsType<Invalid<PasswordManagerSubscriptionUpdate>>(result);
|
||||||
Assert.Equal(PasswordManagerSeatLimitHasBeenReachedError.Code, (result as Invalid<PasswordManagerSubscriptionUpdate>)!.ErrorMessageString);
|
Assert.Equal(PasswordManagerSeatLimitHasBeenReachedError.Code, (result as Invalid<PasswordManagerSubscriptionUpdate>)!.Error.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
@ -88,6 +88,6 @@ public class InviteUsersPasswordManagerValidatorTests
|
|||||||
var result = await sutProvider.Sut.ValidateAsync(subscriptionUpdate);
|
var result = await sutProvider.Sut.ValidateAsync(subscriptionUpdate);
|
||||||
|
|
||||||
Assert.IsType<Invalid<PasswordManagerSubscriptionUpdate>>(result);
|
Assert.IsType<Invalid<PasswordManagerSubscriptionUpdate>>(result);
|
||||||
Assert.Equal(PasswordManagerPlanDoesNotAllowAdditionalSeatsError.Code, (result as Invalid<PasswordManagerSubscriptionUpdate>)!.ErrorMessageString);
|
Assert.Equal(PasswordManagerPlanDoesNotAllowAdditionalSeatsError.Code, (result as Invalid<PasswordManagerSubscriptionUpdate>)!.Error.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces;
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Requests;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Requests;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.PolicyValidators;
|
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.PolicyValidators;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
using Bit.Core.Auth.Entities;
|
using Bit.Core.Auth.Entities;
|
||||||
using Bit.Core.Auth.Enums;
|
using Bit.Core.Auth.Enums;
|
||||||
using Bit.Core.Auth.Models.Data;
|
using Bit.Core.Auth.Models.Data;
|
||||||
@ -11,7 +12,6 @@ using Bit.Core.Auth.Repositories;
|
|||||||
using Bit.Core.Context;
|
using Bit.Core.Context;
|
||||||
using Bit.Core.Entities;
|
using Bit.Core.Entities;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Commands;
|
|
||||||
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
|
@ -4,11 +4,11 @@ using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces;
|
|||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Requests;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Requests;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.Models;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.PolicyValidators;
|
using Bit.Core.AdminConsole.OrganizationFeatures.Policies.PolicyValidators;
|
||||||
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces;
|
using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces;
|
||||||
using Bit.Core.Context;
|
using Bit.Core.Context;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
using Bit.Core.Models.Commands;
|
|
||||||
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
using Bit.Core.AdminConsole.Shared.Validation;
|
using Bit.Core.AdminConsole.Utilities.Validation;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Bit.Core.Test.AdminConsole.Shared;
|
namespace Bit.Core.Test.AdminConsole.Shared;
|
||||||
@ -22,13 +22,11 @@ public class IValidatorTests
|
|||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(value.Name))
|
if (string.IsNullOrWhiteSpace(value.Name))
|
||||||
{
|
{
|
||||||
return Task.FromResult<ValidationResult<TestClass>>(new Invalid<TestClass>
|
return Task.FromResult<ValidationResult<TestClass>>(
|
||||||
{
|
new Invalid<TestClass>(new InvalidRequestError<TestClass>(value)));
|
||||||
Errors = [new InvalidRequestError<TestClass>(value)]
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.FromResult<ValidationResult<TestClass>>(new Valid<TestClass> { Value = value });
|
return Task.FromResult<ValidationResult<TestClass>>(new Valid<TestClass>(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,7 +39,7 @@ public class IValidatorTests
|
|||||||
|
|
||||||
Assert.IsType<Invalid<TestClass>>(result);
|
Assert.IsType<Invalid<TestClass>>(result);
|
||||||
var invalidResult = result as Invalid<TestClass>;
|
var invalidResult = result as Invalid<TestClass>;
|
||||||
Assert.Equal(InvalidRequestError<TestClass>.Code, invalidResult.Errors.First().Message);
|
Assert.Equal(InvalidRequestError<TestClass>.Code, invalidResult!.Error.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
using Bit.Core.AdminConsole.Errors;
|
using Bit.Core.AdminConsole.Utilities.Commands;
|
||||||
using Bit.Core.Models.Commands;
|
using Bit.Core.AdminConsole.Utilities.Errors;
|
||||||
using Bit.Test.Common.AutoFixture.Attributes;
|
using Bit.Test.Common.AutoFixture.Attributes;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Bit.Core.Test.Models.Commands;
|
namespace Bit.Core.Test.AdminConsole.Utilities.Commands;
|
||||||
|
|
||||||
public class CommandResultTests
|
public class CommandResultTests
|
||||||
{
|
{
|
Loading…
x
Reference in New Issue
Block a user