Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace EasyWay.Internals.Exceptions
{
internal sealed class BrokenBusinessRuleExceptionResponse : ExceptionResponse
{
internal BrokenBusinessRuleExceptionResponse(BrokenBusinessRuleException ex)
internal BrokenBusinessRuleExceptionResponse(Exception ex)
{
Type = "BrokenBusinessRule";
Detail = ex.Message;
Expand Down
16 changes: 10 additions & 6 deletions source/EasyWay.WebApi/Internals/WebApiResultMapper.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using EasyWay.Internals.Commands.CommandsWithResult;
using EasyWay.Internals.Commands;
using EasyWay.Internals.Exceptions;
using EasyWay.Internals.Queries.Results;
using Microsoft.AspNetCore.Http;
Expand All @@ -13,9 +13,11 @@ public IResult Map(CommandResult commandResult)
{
CommandErrorEnum.None => Results.Ok(),
CommandErrorEnum.Validation => Results.BadRequest(commandResult.ValidationErrors),
CommandErrorEnum.BrokenBusinessRule => Results.Conflict(new BrokenBusinessRuleExceptionResponse(commandResult.BrokenBusinessRuleException)),
CommandErrorEnum.BrokenBusinessRule => Results.Conflict(new BrokenBusinessRuleExceptionResponse(commandResult.Exception)),
CommandErrorEnum.ConcurrencyConflict => Results.StatusCode(409),
CommandErrorEnum.OperationCanceled => Results.StatusCode(499),
CommandErrorEnum.NotFound => Results.StatusCode(404),
CommandErrorEnum.Forbidden => Results.StatusCode(403),
CommandErrorEnum.Forbidden => Results.StatusCode(404),
_ => Results.StatusCode(500),
};
}
Expand All @@ -26,9 +28,11 @@ public IResult Map<TOperationResult>(CommandResult<TOperationResult> commandResu
{
CommandErrorEnum.None => Results.Ok(commandResult.OperationResult),
CommandErrorEnum.Validation => Results.BadRequest(commandResult.ValidationErrors),
CommandErrorEnum.BrokenBusinessRule => Results.Conflict(new BrokenBusinessRuleExceptionResponse(commandResult.BrokenBusinessRuleException)),
CommandErrorEnum.BrokenBusinessRule => Results.Conflict(new BrokenBusinessRuleExceptionResponse(commandResult.Exception)),
CommandErrorEnum.ConcurrencyConflict => Results.StatusCode(409),
CommandErrorEnum.OperationCanceled => Results.StatusCode(499),
CommandErrorEnum.NotFound => Results.StatusCode(404),
CommandErrorEnum.Forbidden => Results.StatusCode(403),
CommandErrorEnum.Forbidden => Results.StatusCode(404),
_ => Results.StatusCode(500),
};
}
Expand All @@ -40,7 +44,7 @@ public IResult Map<TReadModel>(QueryResult<TReadModel> queryResult) where TReadM
QueryErrorEnum.None => Results.Ok(queryResult.ReadModel),
QueryErrorEnum.Validation => Results.BadRequest(queryResult.ValidationErrors),
QueryErrorEnum.NotFound => Results.StatusCode(404),
QueryErrorEnum.Forbidden => Results.StatusCode(403),
QueryErrorEnum.Forbidden => Results.StatusCode(404),
_ => Results.StatusCode(500),
};
}
Expand Down
66 changes: 54 additions & 12 deletions source/EasyWay/CommandResult.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using EasyWay.Internals.BusinessRules;
using EasyWay.Internals.Commands.CommandsWithResult;
using EasyWay.Internals;
using EasyWay.Internals.BusinessRules;
using EasyWay.Internals.Commands;
using System.Data;

namespace EasyWay
{
Expand All @@ -9,40 +11,60 @@ public sealed class CommandResult

internal IDictionary<string, string[]> ValidationErrors;

internal BrokenBusinessRuleException? BrokenBusinessRuleException;
internal Exception? Exception;

private CommandResult()
{
Error = CommandErrorEnum.None;
ValidationErrors = new Dictionary<string, string[]>();
BrokenBusinessRuleException = null;
Exception = null;
}

private CommandResult(CommandErrorEnum error)
{
Error = error;
ValidationErrors = new Dictionary<string, string[]>();
BrokenBusinessRuleException = null;
Exception = null;
}

private CommandResult(IDictionary<string, string[]> validationErrors)
{
Error = CommandErrorEnum.Validation;
ValidationErrors = validationErrors;
BrokenBusinessRuleException = null;
Exception = null;
}

private CommandResult(BrokenBusinessRuleException brokenBusinessRuleException)
{
Error = CommandErrorEnum.BrokenBusinessRule;
ValidationErrors = new Dictionary<string, string[]>();
BrokenBusinessRuleException = brokenBusinessRuleException;
Exception = brokenBusinessRuleException;
}

private CommandResult(ConcurrencyException concurrencyException)
{
Error = CommandErrorEnum.ConcurrencyConflict;
ValidationErrors = new Dictionary<string, string[]>();
Exception = concurrencyException;
}

public CommandResult(Exception exception)
{
Error = CommandErrorEnum.UnknownException;
ValidationErrors = new Dictionary<string, string[]>();
Exception = exception;
}

internal static CommandResult BrokenBusinessRule(BrokenBusinessRuleException brokenBusinessRuleException) => new CommandResult(brokenBusinessRuleException);

internal static CommandResult Validation(IDictionary<string, string[]> validationErrors) => new CommandResult(validationErrors);

internal static CommandResult ConcurrencyConflict(ConcurrencyException concurrencyException) => new CommandResult(concurrencyException);

internal static CommandResult OperationCanceled() => new CommandResult(CommandErrorEnum.OperationCanceled);

internal static CommandResult UnknownException(Exception exception) => new CommandResult(exception);

public static CommandResult Ok => new CommandResult();

public static CommandResult NotFound => new CommandResult(CommandErrorEnum.NotFound);
Expand All @@ -59,44 +81,64 @@ public sealed class CommandResult<TOperationResult>

internal IDictionary<string, string[]> ValidationErrors;

internal BrokenBusinessRuleException? BrokenBusinessRuleException;
internal Exception? Exception;

private CommandResult(TOperationResult operationResult)
{
OperationResult = operationResult;
Error = CommandErrorEnum.None;
ValidationErrors = new Dictionary<string, string[]>();
BrokenBusinessRuleException = null;
Exception = null;
}

private CommandResult(IDictionary<string, string[]> validationErrors)
{
OperationResult = null;
Error = CommandErrorEnum.Validation;
ValidationErrors = validationErrors;
BrokenBusinessRuleException = null;
Exception = null;
}

private CommandResult(CommandErrorEnum error)
{
OperationResult = null;
Error = error;
ValidationErrors = new Dictionary<string, string[]>();
BrokenBusinessRuleException = null;
Exception = null;
}

private CommandResult(BrokenBusinessRuleException brokenBusinessRuleException)
{
OperationResult = null;
Error = CommandErrorEnum.BrokenBusinessRule;
ValidationErrors = new Dictionary<string, string[]>();
BrokenBusinessRuleException = brokenBusinessRuleException;
Exception = brokenBusinessRuleException;
}

private CommandResult(ConcurrencyException concurrencyException)
{
Error = CommandErrorEnum.ConcurrencyConflict;
ValidationErrors = new Dictionary<string, string[]>();
Exception = concurrencyException;
}

public CommandResult(Exception exception)
{
Error = CommandErrorEnum.UnknownException;
ValidationErrors = new Dictionary<string, string[]>();
Exception = exception;
}

internal static CommandResult<TOperationResult> Validation(IDictionary<string, string[]> validationErrors) => new CommandResult<TOperationResult>(validationErrors);

internal static CommandResult<TOperationResult> BrokenBusinessRule(BrokenBusinessRuleException brokenBusinessRuleException) => new CommandResult<TOperationResult>(brokenBusinessRuleException);

internal static CommandResult<TOperationResult> ConcurrencyConflict(ConcurrencyException concurrencyException) => new CommandResult<TOperationResult>(concurrencyException);

internal static CommandResult<TOperationResult> OperationCanceled() => new CommandResult<TOperationResult>(CommandErrorEnum.OperationCanceled);

internal static CommandResult<TOperationResult> UnknownException(Exception exception) => new CommandResult<TOperationResult>(exception);

public static CommandResult<TOperationResult> Ok(TOperationResult operationResult) => new CommandResult<TOperationResult>(operationResult);

public static CommandResult<TOperationResult> NotFound => new CommandResult<TOperationResult>(CommandErrorEnum.NotFound);
Expand Down
14 changes: 14 additions & 0 deletions source/EasyWay/Internals/Commands/CommandErrorEnum.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace EasyWay.Internals.Commands
{
internal enum CommandErrorEnum : byte
{
None = 1,
Validation = 2,
BrokenBusinessRule = 3,
ConcurrencyConflict = 4,
OperationCanceled = 5,
NotFound = 6,
Forbidden = 7,
UnknownException = 8
}
}
16 changes: 14 additions & 2 deletions source/EasyWay/Internals/Commands/Commands/CommandExecutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,25 @@ public async Task<CommandResult> Execute<TModule, TCommand>(TCommand command, Ca
commandResult = await _serviceProvider
.GetRequiredService<CommandHandler<TCommand>>()
.Handle(command);

await _unitOfWork.Commit();
}
catch (BrokenBusinessRuleException brokenBusinessRuleException)
{
return CommandResult.BrokenBusinessRule(brokenBusinessRuleException);
}

await _unitOfWork.Commit();
catch (ConcurrencyException concurrencyException)
{
return CommandResult.ConcurrencyConflict(concurrencyException);
}
catch (OperationCanceledException)
{
return CommandResult.OperationCanceled();
}
catch (Exception exception)
{
return CommandResult.UnknownException(exception);
}

return commandResult;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,25 @@ public async Task<CommandResult<TOperationResult>> Command<TModule, TCommand, TO
try
{
commandResult = await commandHandler.Handle(command);

await _unitOfWork.Commit();
}
catch (BrokenBusinessRuleException brokenBusinessRuleException)
{
return CommandResult<TOperationResult>.BrokenBusinessRule(brokenBusinessRuleException);
}

await _unitOfWork.Commit();
catch (ConcurrencyException concurrencyException)
{
return CommandResult<TOperationResult>.ConcurrencyConflict(concurrencyException);
}
catch (OperationCanceledException)
{
return CommandResult<TOperationResult>.OperationCanceled();
}
catch (Exception exception)
{
return CommandResult<TOperationResult>.UnknownException(exception);
}

return commandResult;
}
Expand Down
Loading