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
7 changes: 4 additions & 3 deletions source/EasyWay.WebApi/Internals/WebApiResultMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@
{
CommandErrorEnum.None => Results.Ok(),
CommandErrorEnum.Validation => Results.BadRequest(commandResult.ValidationErrors),
CommandErrorEnum.BrokenBusinessRule => Results.Conflict(new BrokenBusinessRuleExceptionResponse(commandResult.Exception)),

Check warning on line 16 in source/EasyWay.WebApi/Internals/WebApiResultMapper.cs

View workflow job for this annotation

GitHub Actions / Build & Tests

Possible null reference argument for parameter 'ex' in 'BrokenBusinessRuleExceptionResponse.BrokenBusinessRuleExceptionResponse(Exception ex)'.
CommandErrorEnum.ConcurrencyConflict => Results.StatusCode(409),
CommandErrorEnum.OperationCanceled => Results.StatusCode(499),
CommandErrorEnum.NotFound => Results.StatusCode(404),
CommandErrorEnum.Forbidden => Results.StatusCode(404),
_ => Results.StatusCode(500),
CommandErrorEnum.UnknownException or _ => Results.StatusCode(500),
};
}

Expand All @@ -28,12 +28,12 @@
{
CommandErrorEnum.None => Results.Ok(commandResult.OperationResult),
CommandErrorEnum.Validation => Results.BadRequest(commandResult.ValidationErrors),
CommandErrorEnum.BrokenBusinessRule => Results.Conflict(new BrokenBusinessRuleExceptionResponse(commandResult.Exception)),

Check warning on line 31 in source/EasyWay.WebApi/Internals/WebApiResultMapper.cs

View workflow job for this annotation

GitHub Actions / Build & Tests

Possible null reference argument for parameter 'ex' in 'BrokenBusinessRuleExceptionResponse.BrokenBusinessRuleExceptionResponse(Exception ex)'.
CommandErrorEnum.ConcurrencyConflict => Results.StatusCode(409),
CommandErrorEnum.OperationCanceled => Results.StatusCode(499),
CommandErrorEnum.NotFound => Results.StatusCode(404),
CommandErrorEnum.Forbidden => Results.StatusCode(404),
_ => Results.StatusCode(500),
CommandErrorEnum.UnknownException or _ => Results.StatusCode(500),
};
}

Expand All @@ -43,9 +43,10 @@
{
QueryErrorEnum.None => Results.Ok(queryResult.ReadModel),
QueryErrorEnum.Validation => Results.BadRequest(queryResult.ValidationErrors),
QueryErrorEnum.OperationCanceled => Results.StatusCode(499),
QueryErrorEnum.NotFound => Results.StatusCode(404),
QueryErrorEnum.Forbidden => Results.StatusCode(404),
_ => Results.StatusCode(500),
QueryErrorEnum.UnknownException or _ => Results.StatusCode(500),
};
}
}
Expand Down
21 changes: 18 additions & 3 deletions source/EasyWay/Internals/Queries/QueryExecutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public QueryExecutor(IServiceProvider serviceProvider)
_serviceProvider = serviceProvider;
}

public Task<QueryResult<TReadModel>> Execute<TModule, TQuery, TReadModel>(TQuery query, CancellationToken cancellationToken = default)
public async Task<QueryResult<TReadModel>> Execute<TModule, TQuery, TReadModel>(TQuery query, CancellationToken cancellationToken = default)
where TModule : EasyWayModule
where TQuery : Query<TReadModel>
where TReadModel : ReadModel
Expand All @@ -27,11 +27,26 @@ public Task<QueryResult<TReadModel>> Execute<TModule, TQuery, TReadModel>(TQuery

if (errors.Any())
{
return Task.FromResult(QueryResult<TReadModel>.Validation(errors));
return QueryResult<TReadModel>.Validation(errors);
}
}

return _serviceProvider.GetRequiredService<QueryHandler<TQuery, TReadModel>>().Handle(query);
QueryResult<TReadModel> result;

try
{
result = await _serviceProvider.GetRequiredService<QueryHandler<TQuery, TReadModel>>().Handle(query);
}
catch (OperationCanceledException)
{
return QueryResult<TReadModel>.OperationCanceled();
}
catch (Exception exception)
{
return QueryResult<TReadModel>.UnknownException(exception);
}

return result;
}
}
}
12 changes: 7 additions & 5 deletions source/EasyWay/Internals/Queries/Results/QueryErrorEnum.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
namespace EasyWay.Internals.Queries.Results
{
internal enum QueryErrorEnum
internal enum QueryErrorEnum : byte
{
None,
Validation,
NotFound,
Forbidden,
None = 1,
Validation = 2,
NotFound = 3,
Forbidden = 4,
OperationCanceled = 5,
UnknownException = 6
}
}
24 changes: 22 additions & 2 deletions source/EasyWay/QueryResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,54 @@ namespace EasyWay
public sealed class QueryResult<TReadModel>
where TReadModel : ReadModel
{
internal TReadModel ReadModel { get; }
internal TReadModel? ReadModel { get; }

internal QueryErrorEnum Error { get; }

internal IDictionary<string, string[]> ValidationErrors;

internal Exception? Exception { get; }

private QueryResult(TReadModel readModel)
{
ReadModel = readModel;
ValidationErrors = new Dictionary<string, string[]>();
Error = QueryErrorEnum.None;
Exception = null;
}

private QueryResult(QueryErrorEnum queryError)
{
ReadModel = null;
ValidationErrors = new Dictionary<string, string[]>();
Error = queryError;
Exception = null;
}

private QueryResult(IDictionary<string, string[]> validationErrors)
{
ReadModel = null;
ValidationErrors = validationErrors;
Error = QueryErrorEnum.Validation;
Exception = null;
}

public static QueryResult<TReadModel> Ok(TReadModel readModel) => new QueryResult<TReadModel>(readModel);
private QueryResult(Exception exception)
{
ReadModel = null;
ValidationErrors = new Dictionary<string, string[]>();
Error = QueryErrorEnum.UnknownException;
Exception = exception;
}

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

internal static QueryResult<TReadModel> OperationCanceled() => new QueryResult<TReadModel>(QueryErrorEnum.OperationCanceled);

internal static QueryResult<TReadModel> UnknownException(Exception exception) => new QueryResult<TReadModel>(exception);

public static QueryResult<TReadModel> Ok(TReadModel readModel) => new QueryResult<TReadModel>(readModel);

public static QueryResult<TReadModel> NotFound => new QueryResult<TReadModel>(QueryErrorEnum.NotFound);

public static QueryResult<TReadModel> Forbidden => new QueryResult<TReadModel>(QueryErrorEnum.Forbidden);
Expand Down
Loading