From 1dbc6c68643c1ee4e1c82ea6fd252ecfd8d703b5 Mon Sep 17 00:00:00 2001 From: adimiko Date: Sat, 15 Mar 2025 14:51:45 +0100 Subject: [PATCH] Added new query results --- .../Internals/WebApiResultMapper.cs | 7 +++--- .../Internals/Queries/QueryExecutor.cs | 21 +++++++++++++--- .../Queries/Results/QueryErrorEnum.cs | 12 ++++++---- source/EasyWay/QueryResult.cs | 24 +++++++++++++++++-- 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/source/EasyWay.WebApi/Internals/WebApiResultMapper.cs b/source/EasyWay.WebApi/Internals/WebApiResultMapper.cs index 4b259fd..6f61e0a 100644 --- a/source/EasyWay.WebApi/Internals/WebApiResultMapper.cs +++ b/source/EasyWay.WebApi/Internals/WebApiResultMapper.cs @@ -18,7 +18,7 @@ public IResult Map(CommandResult commandResult) CommandErrorEnum.OperationCanceled => Results.StatusCode(499), CommandErrorEnum.NotFound => Results.StatusCode(404), CommandErrorEnum.Forbidden => Results.StatusCode(404), - _ => Results.StatusCode(500), + CommandErrorEnum.UnknownException or _ => Results.StatusCode(500), }; } @@ -33,7 +33,7 @@ public IResult Map(CommandResult commandResu CommandErrorEnum.OperationCanceled => Results.StatusCode(499), CommandErrorEnum.NotFound => Results.StatusCode(404), CommandErrorEnum.Forbidden => Results.StatusCode(404), - _ => Results.StatusCode(500), + CommandErrorEnum.UnknownException or _ => Results.StatusCode(500), }; } @@ -43,9 +43,10 @@ public IResult Map(QueryResult queryResult) where TReadM { 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), }; } } diff --git a/source/EasyWay/Internals/Queries/QueryExecutor.cs b/source/EasyWay/Internals/Queries/QueryExecutor.cs index d476259..abdaa93 100644 --- a/source/EasyWay/Internals/Queries/QueryExecutor.cs +++ b/source/EasyWay/Internals/Queries/QueryExecutor.cs @@ -12,7 +12,7 @@ public QueryExecutor(IServiceProvider serviceProvider) _serviceProvider = serviceProvider; } - public Task> Execute(TQuery query, CancellationToken cancellationToken = default) + public async Task> Execute(TQuery query, CancellationToken cancellationToken = default) where TModule : EasyWayModule where TQuery : Query where TReadModel : ReadModel @@ -27,11 +27,26 @@ public Task> Execute(TQuery if (errors.Any()) { - return Task.FromResult(QueryResult.Validation(errors)); + return QueryResult.Validation(errors); } } - return _serviceProvider.GetRequiredService>().Handle(query); + QueryResult result; + + try + { + result = await _serviceProvider.GetRequiredService>().Handle(query); + } + catch (OperationCanceledException) + { + return QueryResult.OperationCanceled(); + } + catch (Exception exception) + { + return QueryResult.UnknownException(exception); + } + + return result; } } } diff --git a/source/EasyWay/Internals/Queries/Results/QueryErrorEnum.cs b/source/EasyWay/Internals/Queries/Results/QueryErrorEnum.cs index f085f5d..aec5565 100644 --- a/source/EasyWay/Internals/Queries/Results/QueryErrorEnum.cs +++ b/source/EasyWay/Internals/Queries/Results/QueryErrorEnum.cs @@ -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 } } diff --git a/source/EasyWay/QueryResult.cs b/source/EasyWay/QueryResult.cs index 885ce27..dd450ce 100644 --- a/source/EasyWay/QueryResult.cs +++ b/source/EasyWay/QueryResult.cs @@ -5,34 +5,54 @@ namespace EasyWay public sealed class QueryResult where TReadModel : ReadModel { - internal TReadModel ReadModel { get; } + internal TReadModel? ReadModel { get; } internal QueryErrorEnum Error { get; } internal IDictionary ValidationErrors; + internal Exception? Exception { get; } + private QueryResult(TReadModel readModel) { ReadModel = readModel; + ValidationErrors = new Dictionary(); Error = QueryErrorEnum.None; + Exception = null; } private QueryResult(QueryErrorEnum queryError) { ReadModel = null; + ValidationErrors = new Dictionary(); Error = queryError; + Exception = null; } private QueryResult(IDictionary validationErrors) { + ReadModel = null; ValidationErrors = validationErrors; Error = QueryErrorEnum.Validation; + Exception = null; } - public static QueryResult Ok(TReadModel readModel) => new QueryResult(readModel); + private QueryResult(Exception exception) + { + ReadModel = null; + ValidationErrors = new Dictionary(); + Error = QueryErrorEnum.UnknownException; + Exception = exception; + } internal static QueryResult Validation(IDictionary validationErrors) => new QueryResult(validationErrors); + internal static QueryResult OperationCanceled() => new QueryResult(QueryErrorEnum.OperationCanceled); + + internal static QueryResult UnknownException(Exception exception) => new QueryResult(exception); + + public static QueryResult Ok(TReadModel readModel) => new QueryResult(readModel); + public static QueryResult NotFound => new QueryResult(QueryErrorEnum.NotFound); public static QueryResult Forbidden => new QueryResult(QueryErrorEnum.Forbidden);