From 736fdeb9e197f0885218139bd8200508f6afa48e Mon Sep 17 00:00:00 2001 From: Iman Mohammadi Date: Tue, 27 May 2025 19:27:28 +0330 Subject: [PATCH 1/3] added NotFoundBusinessException --- .../Results/ResultMessage.cs | 6 +++--- .../Results/ResultMessagesExtensions.cs | 4 ++-- .../ExceptionCommandHandlerDecorator.cs | 4 ++++ .../ResultOrientedCommandHandlerDecorator.cs | 0 .../NotFoundBusinessException.cs | 9 ++++++++ .../Default/Honamic.Framework.Facade.csproj | 1 + .../ExceptionHandlingInterceptor.cs | 21 +++++++++++++------ 7 files changed, 34 insertions(+), 11 deletions(-) delete mode 100644 src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs create mode 100644 src/Core/Domain.Abstractions/NotFoundBusinessException.cs diff --git a/src/Core/Applications.Abstractions/Results/ResultMessage.cs b/src/Core/Applications.Abstractions/Results/ResultMessage.cs index c351c67..146ee45 100644 --- a/src/Core/Applications.Abstractions/Results/ResultMessage.cs +++ b/src/Core/Applications.Abstractions/Results/ResultMessage.cs @@ -2,7 +2,7 @@ public class ResultMessage { - public ResultMessage(ResultMessageType type, string message, string field = null, string code = null) + public ResultMessage(ResultMessageType type, string message, string? code = null, string? field = null) { Type = type; Message = message; @@ -12,9 +12,9 @@ public ResultMessage(ResultMessageType type, string message, string field = null public string Message { get; set; } - public string Field { get; set; } + public string? Field { get; set; } - public string Code { get; set; } + public string? Code { get; set; } public ResultMessageType Type { get; set; } } diff --git a/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs index 64477d8..d8f43fe 100644 --- a/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs +++ b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs @@ -12,12 +12,12 @@ public static void AppendInfo(this Result result, string message) result.Messages.Add(new ResultMessage(ResultMessageType.Info, message)); } - public static void AppendError(this Result result, string message, string field, string code) + public static void AppendError(this Result result, string message, string? field, string? code) { result.Messages.Add(new ResultMessage(ResultMessageType.Error, message, field, code)); } - public static void AppendError(this Result result, string message, string field) + public static void AppendError(this Result result, string message, string? field) { result.AppendError(message, field, null); } diff --git a/src/Core/Applications/CommandHandlerDecorators/ExceptionCommandHandlerDecorator.cs b/src/Core/Applications/CommandHandlerDecorators/ExceptionCommandHandlerDecorator.cs index 314e6bc..67d6905 100644 --- a/src/Core/Applications/CommandHandlerDecorators/ExceptionCommandHandlerDecorator.cs +++ b/src/Core/Applications/CommandHandlerDecorators/ExceptionCommandHandlerDecorator.cs @@ -52,6 +52,10 @@ private TResponse CreateResultWithError(Type type, Exception ex) result.SetStatusAsUnauthorized(); result.AppendError(ex.Message); break; + case NotFoundBusinessException notFoundEx: + result.Status = ResultStatus.NotFound; + result.AppendError(notFoundEx.GetMessage(), null, notFoundEx.GetCode()); + break; case BusinessException businessException: result.Status = ResultStatus.ValidationError; var code = businessException.GetCode(); diff --git a/src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs b/src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs deleted file mode 100644 index e69de29..0000000 diff --git a/src/Core/Domain.Abstractions/NotFoundBusinessException.cs b/src/Core/Domain.Abstractions/NotFoundBusinessException.cs new file mode 100644 index 0000000..5e129bf --- /dev/null +++ b/src/Core/Domain.Abstractions/NotFoundBusinessException.cs @@ -0,0 +1,9 @@ +namespace Honamic.Framework.Domain; + +public class NotFoundBusinessException : BusinessException +{ + public NotFoundBusinessException(string? message = null, string? code = null) + : base(message ?? "Item not found.", code) + { + } +} \ No newline at end of file diff --git a/src/Facade/Default/Honamic.Framework.Facade.csproj b/src/Facade/Default/Honamic.Framework.Facade.csproj index 317e731..8131534 100644 --- a/src/Facade/Default/Honamic.Framework.Facade.csproj +++ b/src/Facade/Default/Honamic.Framework.Facade.csproj @@ -14,6 +14,7 @@ + diff --git a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs index 57524c6..32fa639 100644 --- a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs +++ b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs @@ -1,6 +1,7 @@ using Castle.DynamicProxy; using Honamic.Framework.Applications.Exceptions; using Honamic.Framework.Applications.Results; +using Honamic.Framework.Domain; using Microsoft.Extensions.Logging; using System.Diagnostics; using System.Reflection; @@ -36,7 +37,7 @@ public void Intercept(IInvocation invocation) { if (invocation.Proxy is IBaseFacade baseFacade) { - baseFacade.Logger.LogError(ex, "Unhandled exception"); + baseFacade.Logger.LogError(ex, "Unhandled exception"); } var result = GetNewResult(invocation, ex); @@ -111,16 +112,24 @@ public void Intercept(IInvocation invocation) switch (ex) { case UnauthenticatedException: - rawResult?.SetStatusAsUnauthenticated(); - rawResult?.AppendError(ex.Message, "Exception"); + rawResult.SetStatusAsUnauthenticated(ex.Message); break; case UnauthorizedException: - rawResult?.SetStatusAsUnauthorized(); - rawResult?.AppendError(ex.Message, "Exception"); + rawResult.SetStatusAsUnauthorized(ex.Message); + break; + case NotFoundBusinessException notFoundEx: + rawResult.SetStatusAsNotFound(); + rawResult.AppendError(notFoundEx.GetMessage(), null, notFoundEx.GetCode()); + break; + case BusinessException businessException: + rawResult.Status = ResultStatus.ValidationError; + var code = businessException.GetCode(); + var message = businessException.GetMessage(); + rawResult.AppendError(message, null, code); break; default: rawResult?.SetStatusAsUnhandledExceptionWithSorryError(); - rawResult?.AppendError(ex.ToString(), "Exception"); + rawResult?.AppendError(ex.Message, "Exception"); break; } From 43659aba41de57551c8876f0e8101547fde3ce3f Mon Sep 17 00:00:00 2001 From: Iman Mohammadi Date: Tue, 27 May 2025 20:05:58 +0330 Subject: [PATCH 2/3] Changed the order of optional parameters in the `ResultMessage` constructor to place `field` before `code`. --- .github/workflows/build.yml | 6 +++++- src/Core/Applications.Abstractions/Results/ResultMessage.cs | 2 +- .../Results/ResultMessagesExtensions.cs | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8dfbbb0..5fa5020 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,10 @@ name: .NET Build -on: [push, pull_request] +on: + push: + branches: [main] + pull_request: + branches: [main] jobs: build: diff --git a/src/Core/Applications.Abstractions/Results/ResultMessage.cs b/src/Core/Applications.Abstractions/Results/ResultMessage.cs index 146ee45..2218f45 100644 --- a/src/Core/Applications.Abstractions/Results/ResultMessage.cs +++ b/src/Core/Applications.Abstractions/Results/ResultMessage.cs @@ -2,7 +2,7 @@ public class ResultMessage { - public ResultMessage(ResultMessageType type, string message, string? code = null, string? field = null) + public ResultMessage(ResultMessageType type, string message, string? field= null, string? code = null) { Type = type; Message = message; diff --git a/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs index d8f43fe..7612e6e 100644 --- a/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs +++ b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs @@ -14,12 +14,12 @@ public static void AppendInfo(this Result result, string message) public static void AppendError(this Result result, string message, string? field, string? code) { - result.Messages.Add(new ResultMessage(ResultMessageType.Error, message, field, code)); + result.Messages.Add(new ResultMessage(ResultMessageType.Error, message, code:code , field: field)); } public static void AppendError(this Result result, string message, string? field) { - result.AppendError(message, field, null); + result.AppendError(message, field: field, null); } public static void AppendError(this Result result, string message) From c34b586ef25a8e49e1dd76460b56a9533705c2f3 Mon Sep 17 00:00:00 2001 From: Iman Mohammadi Date: Tue, 27 May 2025 20:10:33 +0330 Subject: [PATCH 3/3] Add validation error handling and null checks --- .../Results/ResultMessagesExtensions.cs | 5 +++++ .../Interceptors/ExceptionHandlingInterceptor.cs | 12 ++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs index 7612e6e..1fe30f0 100644 --- a/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs +++ b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs @@ -88,4 +88,9 @@ public static void SetStatusAsInvalidDomainState(this Result result, string erro result.Status = ResultStatus.InvalidDomainState; result.AppendError(errorMessage); } + + public static void SetStatusAsValidationError(this Result result) + { + result.Status = ResultStatus.ValidationError; + } } diff --git a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs index 32fa639..423c47a 100644 --- a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs +++ b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs @@ -112,20 +112,20 @@ public void Intercept(IInvocation invocation) switch (ex) { case UnauthenticatedException: - rawResult.SetStatusAsUnauthenticated(ex.Message); + rawResult?.SetStatusAsUnauthenticated(ex.Message); break; case UnauthorizedException: - rawResult.SetStatusAsUnauthorized(ex.Message); + rawResult?.SetStatusAsUnauthorized(ex.Message); break; case NotFoundBusinessException notFoundEx: - rawResult.SetStatusAsNotFound(); - rawResult.AppendError(notFoundEx.GetMessage(), null, notFoundEx.GetCode()); + rawResult?.SetStatusAsNotFound(); + rawResult?.AppendError(notFoundEx.GetMessage(), null, notFoundEx.GetCode()); break; case BusinessException businessException: - rawResult.Status = ResultStatus.ValidationError; + rawResult?.SetStatusAsValidationError(); var code = businessException.GetCode(); var message = businessException.GetMessage(); - rawResult.AppendError(message, null, code); + rawResult?.AppendError(message, null, code); break; default: rawResult?.SetStatusAsUnhandledExceptionWithSorryError();