From d200b425f405d7db3a181b0a7b7d70a7c071320d Mon Sep 17 00:00:00 2001 From: Iman Mohammadi Date: Tue, 20 May 2025 22:57:08 +0330 Subject: [PATCH 1/5] new project Applications.Abstractions for results --- Honamic.Framework.sln | 7 ++++++ .../TodoItems/TodoItemsController.cs | 2 +- .../Facade/TodoItems/ITodoItemFacade.cs | 4 ++-- .../Facade/TodoItems/ITodoItemQueryFacade.cs | 4 ++-- TodoSample/Facade/TodoItems/TodoItemFacade.cs | 4 ++-- .../Facade/TodoItems/TodoItemQueryFacade.cs | 2 +- ...Framework.Applications.Abstractions.csproj | 13 +++++++++++ .../Results/HttpStatusCodes.cs | 2 +- .../Results/Result.cs | 2 +- .../Results/ResultMessage.cs | 2 +- .../Results/ResultMessagesExtensions.cs | 2 +- .../Results/ResultStatus.cs | 2 +- .../Extensions/ServiceCollectionExtensions.cs | 15 ++----------- .../Honamic.Framework.Applications.csproj | 1 + .../DomainEventUserInfo.cs | 0 .../Extensions/ServiceCollectionExtensions.cs | 22 +++++++++++++++++++ .../{Applications => Domain}/SystemClock.cs | 0 .../Extensions/ServiceCollectionExtensions.cs | 5 +++-- ...namic.Framework.Facade.Abstractions.csproj | 4 ++++ .../Default/Discovery/FacadeDiscovery.cs | 2 +- .../ExceptionHandlingInterceptor.cs | 2 +- .../Controllers/CrudController.cs | 4 ++-- src/Facade/FastCrud/CrudEntityFacade.cs | 2 +- src/Facade/FastCrud/ICrudEntityFacade.cs | 4 ++-- .../ExceptionToFacadeResultMiddleware.cs | 4 ++-- .../Web/Results/BadRequestFacadeResult.cs | 2 +- src/Facade/Web/Results/ResultToAction.cs | 2 +- .../Facade/Accounts/AccountFacade.cs | 4 ++-- .../Facade/Accounts/IAccountFacade.cs | 4 ++-- src/IdentityPlus/Facade/Users/IUserFacade.cs | 4 ++-- src/IdentityPlus/Facade/Users/UserFacade.cs | 4 ++-- src/IdentityPlus/Razor/Users/List.razor | 2 +- .../WebApi/Users/AccountController.cs | 2 +- .../WebApi/Users/UserController.cs | 2 +- 34 files changed, 87 insertions(+), 50 deletions(-) create mode 100644 src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj rename src/{Facade/Abstractions => Core/Applications.Abstractions}/Results/HttpStatusCodes.cs (99%) rename src/{Facade/Abstractions => Core/Applications.Abstractions}/Results/Result.cs (95%) rename src/{Facade/Abstractions => Core/Applications.Abstractions}/Results/ResultMessage.cs (90%) rename src/{Facade/Abstractions => Core/Applications.Abstractions}/Results/ResultMessagesExtensions.cs (98%) rename src/{Facade/Abstractions => Core/Applications.Abstractions}/Results/ResultStatus.cs (79%) rename src/Core/{Applications => Domain}/DomainEventUserInfo.cs (100%) create mode 100644 src/Core/Domain/Extensions/ServiceCollectionExtensions.cs rename src/Core/{Applications => Domain}/SystemClock.cs (100%) diff --git a/Honamic.Framework.sln b/Honamic.Framework.sln index f5a9804..c02e6ae 100644 --- a/Honamic.Framework.sln +++ b/Honamic.Framework.sln @@ -129,6 +129,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03.Facade", "03.Facade", "{ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Honamic.IdentityPlus.Facade", "src\IdentityPlus\Facade\Honamic.IdentityPlus.Facade.csproj", "{D7D9D8C5-EBDF-480C-A693-E6ED04143FFA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Honamic.Framework.Applications.Abstractions", "src\Core\Applications.Abstractions\Honamic.Framework.Applications.Abstractions.csproj", "{29C37841-0CA2-9A52-9A08-90CA63C5E63A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -299,6 +301,10 @@ Global {D7D9D8C5-EBDF-480C-A693-E6ED04143FFA}.Debug|Any CPU.Build.0 = Debug|Any CPU {D7D9D8C5-EBDF-480C-A693-E6ED04143FFA}.Release|Any CPU.ActiveCfg = Release|Any CPU {D7D9D8C5-EBDF-480C-A693-E6ED04143FFA}.Release|Any CPU.Build.0 = Release|Any CPU + {29C37841-0CA2-9A52-9A08-90CA63C5E63A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29C37841-0CA2-9A52-9A08-90CA63C5E63A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29C37841-0CA2-9A52-9A08-90CA63C5E63A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29C37841-0CA2-9A52-9A08-90CA63C5E63A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -365,6 +371,7 @@ Global {8F5EAEEB-467C-412D-B131-D7469C70D375} = {3F098285-E155-4D9A-9371-E7C4CAEA17F3} {82C3E682-28F0-4F65-93F1-A646085A9198} = {7ACD81EB-9F97-44A5-B91B-2E12C5F45607} {D7D9D8C5-EBDF-480C-A693-E6ED04143FFA} = {82C3E682-28F0-4F65-93F1-A646085A9198} + {29C37841-0CA2-9A52-9A08-90CA63C5E63A} = {BC728FCA-02C3-4522-A7EB-7403B8674BBA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E15D83FC-8F5C-4D9C-9DCD-D114F5609922} diff --git a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs index a4ea2b5..672cf76 100644 --- a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs +++ b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs @@ -1,4 +1,4 @@ -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; using Honamic.Framework.Queries; using Honamic.Todo.Application.TodoItems.Commands; using Honamic.Todo.Facade.TodoItems; diff --git a/TodoSample/Facade/TodoItems/ITodoItemFacade.cs b/TodoSample/Facade/TodoItems/ITodoItemFacade.cs index becc997..fa0a9bb 100644 --- a/TodoSample/Facade/TodoItems/ITodoItemFacade.cs +++ b/TodoSample/Facade/TodoItems/ITodoItemFacade.cs @@ -1,5 +1,5 @@ -using Honamic.Framework.Facade; -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Facade; using Honamic.Todo.Application.TodoItems.Commands; namespace Honamic.Todo.Facade.TodoItems; diff --git a/TodoSample/Facade/TodoItems/ITodoItemQueryFacade.cs b/TodoSample/Facade/TodoItems/ITodoItemQueryFacade.cs index 91a9d00..b2eb962 100644 --- a/TodoSample/Facade/TodoItems/ITodoItemQueryFacade.cs +++ b/TodoSample/Facade/TodoItems/ITodoItemQueryFacade.cs @@ -1,5 +1,5 @@ -using Honamic.Framework.Facade; -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Facade; using Honamic.Framework.Queries; using Honamic.Todo.Query.Domain.TodoItems.Models; using Honamic.Todo.Query.Domain.TodoItems.Queries; diff --git a/TodoSample/Facade/TodoItems/TodoItemFacade.cs b/TodoSample/Facade/TodoItems/TodoItemFacade.cs index cf5efe7..61d0c9c 100644 --- a/TodoSample/Facade/TodoItems/TodoItemFacade.cs +++ b/TodoSample/Facade/TodoItems/TodoItemFacade.cs @@ -1,7 +1,7 @@ -using Honamic.Framework.Commands; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Commands; using Honamic.Framework.Events; using Honamic.Framework.Facade; -using Honamic.Framework.Facade.Results; using Honamic.Todo.Application.TodoItems.Commands; using Honamic.Todo.Domain.TodoItems; using Microsoft.Extensions.Logging; diff --git a/TodoSample/Facade/TodoItems/TodoItemQueryFacade.cs b/TodoSample/Facade/TodoItems/TodoItemQueryFacade.cs index c5aa0b6..304250c 100644 --- a/TodoSample/Facade/TodoItems/TodoItemQueryFacade.cs +++ b/TodoSample/Facade/TodoItems/TodoItemQueryFacade.cs @@ -1,11 +1,11 @@ using Honamic.Framework.Facade; -using Honamic.Framework.Facade.Results; using Honamic.Framework.Queries; using Microsoft.Extensions.Logging; using System.ComponentModel; using Honamic.Todo.Query.Domain.TodoItems.Models; using Honamic.Todo.Query.Domain.TodoItems.Queries; using Honamic.Todo.Query.Domain.TodoItems; +using Honamic.Framework.Applications.Results; namespace Honamic.Todo.Facade.TodoItems; diff --git a/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj b/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj new file mode 100644 index 0000000..295db34 --- /dev/null +++ b/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + $(MSBuildProjectName.Replace(" ", "_").Replace(".Abstractions", "")) + + + + + + diff --git a/src/Facade/Abstractions/Results/HttpStatusCodes.cs b/src/Core/Applications.Abstractions/Results/HttpStatusCodes.cs similarity index 99% rename from src/Facade/Abstractions/Results/HttpStatusCodes.cs rename to src/Core/Applications.Abstractions/Results/HttpStatusCodes.cs index 421f1e8..312193c 100644 --- a/src/Facade/Abstractions/Results/HttpStatusCodes.cs +++ b/src/Core/Applications.Abstractions/Results/HttpStatusCodes.cs @@ -1,4 +1,4 @@ -namespace Honamic.Framework.Facade.Results; +namespace Honamic.Framework.Applications.Results; public static class HttpStatusCodes { diff --git a/src/Facade/Abstractions/Results/Result.cs b/src/Core/Applications.Abstractions/Results/Result.cs similarity index 95% rename from src/Facade/Abstractions/Results/Result.cs rename to src/Core/Applications.Abstractions/Results/Result.cs index 3e2ea35..c89ad1c 100644 --- a/src/Facade/Abstractions/Results/Result.cs +++ b/src/Core/Applications.Abstractions/Results/Result.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; -namespace Honamic.Framework.Facade.Results; +namespace Honamic.Framework.Applications.Results; public class Result { diff --git a/src/Facade/Abstractions/Results/ResultMessage.cs b/src/Core/Applications.Abstractions/Results/ResultMessage.cs similarity index 90% rename from src/Facade/Abstractions/Results/ResultMessage.cs rename to src/Core/Applications.Abstractions/Results/ResultMessage.cs index 110d4eb..c351c67 100644 --- a/src/Facade/Abstractions/Results/ResultMessage.cs +++ b/src/Core/Applications.Abstractions/Results/ResultMessage.cs @@ -1,4 +1,4 @@ -namespace Honamic.Framework.Facade.Results; +namespace Honamic.Framework.Applications.Results; public class ResultMessage { diff --git a/src/Facade/Abstractions/Results/ResultMessagesExtensions.cs b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs similarity index 98% rename from src/Facade/Abstractions/Results/ResultMessagesExtensions.cs rename to src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs index e5e4d33..64477d8 100644 --- a/src/Facade/Abstractions/Results/ResultMessagesExtensions.cs +++ b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs @@ -1,4 +1,4 @@ -namespace Honamic.Framework.Facade.Results; +namespace Honamic.Framework.Applications.Results; public static class ResultMessagesExtensions { diff --git a/src/Facade/Abstractions/Results/ResultStatus.cs b/src/Core/Applications.Abstractions/Results/ResultStatus.cs similarity index 79% rename from src/Facade/Abstractions/Results/ResultStatus.cs rename to src/Core/Applications.Abstractions/Results/ResultStatus.cs index 679bf9c..2e22fdc 100644 --- a/src/Facade/Abstractions/Results/ResultStatus.cs +++ b/src/Core/Applications.Abstractions/Results/ResultStatus.cs @@ -1,4 +1,4 @@ -namespace Honamic.Framework.Facade.Results; +namespace Honamic.Framework.Applications.Results; public enum ResultStatus { diff --git a/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs b/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs index 0d9a1af..c42ac7c 100644 --- a/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs +++ b/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs @@ -2,8 +2,6 @@ using Honamic.Framework.Commands.Extensions; using Honamic.Framework.Commands; using Honamic.Framework.Applications.CommandHandlerDecorators; -using Honamic.Framework.Domain.Defaults; -using Honamic.Framework.Domain; using Honamic.Framework.Events.Extensions; using Honamic.Framework.Queries.Extensions; using Honamic.Framework.Events; @@ -14,23 +12,14 @@ public static class ServiceCollectionExtensions { public static IServiceCollection AddDefaultApplicationsServices(this IServiceCollection services) { + services.AddDefaultDomainsServices(); + services.AddDefaultEventsServices(); services.AddDefaultCommandsServices(); - services.AddDefaultDomainEventsDispatcherServices(); - services.AddSystemClock(); - services.AddDefaultEventBusServices(); services.AddDefaultQueriesServices(); return services; } - public static IServiceCollection AddSystemClock(this IServiceCollection services) - { - services.AddScoped(); - - return services; - - } - public static void AddCommandHandler(this IServiceCollection services) where TCommand : ICommand where TCommandHandler : class, ICommandHandler diff --git a/src/Core/Applications/Honamic.Framework.Applications.csproj b/src/Core/Applications/Honamic.Framework.Applications.csproj index d2f5b49..dd2e5c9 100644 --- a/src/Core/Applications/Honamic.Framework.Applications.csproj +++ b/src/Core/Applications/Honamic.Framework.Applications.csproj @@ -13,6 +13,7 @@ + diff --git a/src/Core/Applications/DomainEventUserInfo.cs b/src/Core/Domain/DomainEventUserInfo.cs similarity index 100% rename from src/Core/Applications/DomainEventUserInfo.cs rename to src/Core/Domain/DomainEventUserInfo.cs diff --git a/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs b/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..c475a68 --- /dev/null +++ b/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.DependencyInjection; +using Honamic.Framework.Domain.Defaults; +using Honamic.Framework.Domain; + +namespace Honamic.Framework.Applications.Extensions; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddDefaultDomainsServices(this IServiceCollection services) + { + services.AddSystemClock(); + return services; + } + + public static IServiceCollection AddSystemClock(this IServiceCollection services) + { + services.AddScoped(); + + return services; + + } +} \ No newline at end of file diff --git a/src/Core/Applications/SystemClock.cs b/src/Core/Domain/SystemClock.cs similarity index 100% rename from src/Core/Applications/SystemClock.cs rename to src/Core/Domain/SystemClock.cs diff --git a/src/Core/Events/Extensions/ServiceCollectionExtensions.cs b/src/Core/Events/Extensions/ServiceCollectionExtensions.cs index 39acf08..e181113 100644 --- a/src/Core/Events/Extensions/ServiceCollectionExtensions.cs +++ b/src/Core/Events/Extensions/ServiceCollectionExtensions.cs @@ -5,9 +5,10 @@ namespace Honamic.Framework.Events.Extensions; public static class ServiceCollectionExtensions { - public static void AddDefaultEventssServices(this IServiceCollection services) + public static void AddDefaultEventsServices(this IServiceCollection services) { - + services.AddDefaultEventBusServices(); + services.AddDefaultDomainEventsDispatcherServices(); } public static void AddDefaultEventBusServices(this IServiceCollection services) diff --git a/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj b/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj index 7bebda1..e33d35b 100644 --- a/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj +++ b/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj @@ -11,5 +11,9 @@ + + + + diff --git a/src/Facade/Default/Discovery/FacadeDiscovery.cs b/src/Facade/Default/Discovery/FacadeDiscovery.cs index 1201731..9deea59 100644 --- a/src/Facade/Default/Discovery/FacadeDiscovery.cs +++ b/src/Facade/Default/Discovery/FacadeDiscovery.cs @@ -1,4 +1,4 @@ -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; using Honamic.Framework.Utilities.Extensions; using System.Reflection; diff --git a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs index 7faa4aa..cbab4c8 100644 --- a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs +++ b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs @@ -1,6 +1,6 @@ using Castle.DynamicProxy; +using Honamic.Framework.Applications.Results; using Honamic.Framework.Facade.Exceptions; -using Honamic.Framework.Facade.Results; using Microsoft.Extensions.Logging; using System.Diagnostics; using System.Reflection; diff --git a/src/Facade/FastCrud.Web/Controllers/CrudController.cs b/src/Facade/FastCrud.Web/Controllers/CrudController.cs index 7b4608a..63d4446 100644 --- a/src/Facade/FastCrud.Web/Controllers/CrudController.cs +++ b/src/Facade/FastCrud.Web/Controllers/CrudController.cs @@ -1,7 +1,7 @@ -using Honamic.Framework.Domain; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Domain; using Honamic.Framework.Endpoints.Web; using Honamic.Framework.Facade.FastCrud.Dtos; -using Honamic.Framework.Facade.Results; using Honamic.Framework.Queries; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; diff --git a/src/Facade/FastCrud/CrudEntityFacade.cs b/src/Facade/FastCrud/CrudEntityFacade.cs index 0e2037e..fd2a1c2 100644 --- a/src/Facade/FastCrud/CrudEntityFacade.cs +++ b/src/Facade/FastCrud/CrudEntityFacade.cs @@ -7,8 +7,8 @@ using Microsoft.Extensions.Logging; using System.Linq.Dynamic.Core; using Honamic.Framework.Utilities.Extensions; -using Honamic.Framework.Facade.Results; using Honamic.Framework.Facade.FastCrud.Dtos; +using Honamic.Framework.Applications.Results; namespace Honamic.Framework.Facade.FastCrud; diff --git a/src/Facade/FastCrud/ICrudEntityFacade.cs b/src/Facade/FastCrud/ICrudEntityFacade.cs index d88107f..c41f902 100644 --- a/src/Facade/FastCrud/ICrudEntityFacade.cs +++ b/src/Facade/FastCrud/ICrudEntityFacade.cs @@ -1,6 +1,6 @@ -using Honamic.Framework.Domain; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Domain; using Honamic.Framework.Facade.FastCrud.Dtos; -using Honamic.Framework.Facade.Results; using Honamic.Framework.Queries; namespace Honamic.Framework.Facade.FastCrud; diff --git a/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs b/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs index 9801cf8..28344f0 100644 --- a/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs +++ b/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs @@ -1,6 +1,6 @@ -using Honamic.Framework.Domain; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Domain; using Honamic.Framework.Facade.Exceptions; -using Honamic.Framework.Facade.Results; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; diff --git a/src/Facade/Web/Results/BadRequestFacadeResult.cs b/src/Facade/Web/Results/BadRequestFacadeResult.cs index ccb4ada..7f265a9 100644 --- a/src/Facade/Web/Results/BadRequestFacadeResult.cs +++ b/src/Facade/Web/Results/BadRequestFacadeResult.cs @@ -1,4 +1,4 @@ -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; diff --git a/src/Facade/Web/Results/ResultToAction.cs b/src/Facade/Web/Results/ResultToAction.cs index c8a54ef..d97d3f6 100644 --- a/src/Facade/Web/Results/ResultToAction.cs +++ b/src/Facade/Web/Results/ResultToAction.cs @@ -1,4 +1,4 @@ -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; using Microsoft.AspNetCore.Mvc; namespace Honamic.Framework.Facade.Web.Results; diff --git a/src/IdentityPlus/Facade/Accounts/AccountFacade.cs b/src/IdentityPlus/Facade/Accounts/AccountFacade.cs index 2ae1327..4cb733c 100644 --- a/src/IdentityPlus/Facade/Accounts/AccountFacade.cs +++ b/src/IdentityPlus/Facade/Accounts/AccountFacade.cs @@ -1,6 +1,6 @@ -using Honamic.Framework.Commands; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Commands; using Honamic.Framework.Facade; -using Honamic.Framework.Facade.Results; using Honamic.Framework.Queries; using Honamic.IdentityPlus.Application.Accounts.Commands; using Honamic.IdentityPlus.Application.Accounts.Commands.Register; diff --git a/src/IdentityPlus/Facade/Accounts/IAccountFacade.cs b/src/IdentityPlus/Facade/Accounts/IAccountFacade.cs index 51106fe..51dcd01 100644 --- a/src/IdentityPlus/Facade/Accounts/IAccountFacade.cs +++ b/src/IdentityPlus/Facade/Accounts/IAccountFacade.cs @@ -1,5 +1,5 @@ -using Honamic.Framework.Facade; -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Facade; using Honamic.IdentityPlus.Application.Accounts.Commands; using Honamic.IdentityPlus.Application.Accounts.Commands.Register; using Microsoft.AspNetCore.Http.HttpResults; diff --git a/src/IdentityPlus/Facade/Users/IUserFacade.cs b/src/IdentityPlus/Facade/Users/IUserFacade.cs index 63671b4..9510813 100644 --- a/src/IdentityPlus/Facade/Users/IUserFacade.cs +++ b/src/IdentityPlus/Facade/Users/IUserFacade.cs @@ -1,5 +1,5 @@ -using Honamic.Framework.Facade; -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Facade; using Honamic.Framework.Queries; using Honamic.IdentityPlus.Application.Users.Queries; diff --git a/src/IdentityPlus/Facade/Users/UserFacade.cs b/src/IdentityPlus/Facade/Users/UserFacade.cs index 7cfa8fe..b3a28a0 100644 --- a/src/IdentityPlus/Facade/Users/UserFacade.cs +++ b/src/IdentityPlus/Facade/Users/UserFacade.cs @@ -1,6 +1,6 @@ -using Honamic.Framework.Commands; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Commands; using Honamic.Framework.Facade; -using Honamic.Framework.Facade.Results; using Honamic.Framework.Queries; using Honamic.IdentityPlus.Application.Users.Queries; using Microsoft.Extensions.Logging; diff --git a/src/IdentityPlus/Razor/Users/List.razor b/src/IdentityPlus/Razor/Users/List.razor index 23fd0f2..e7113e8 100644 --- a/src/IdentityPlus/Razor/Users/List.razor +++ b/src/IdentityPlus/Razor/Users/List.razor @@ -1,6 +1,6 @@ @inject IStringLocalizer L @page "/Users/list" -@using Honamic.Framework.Facade.Results +@using Honamic.Framework.Applications.Results @using Honamic.Framework.Queries @using Honamic.IdentityPlus.Application.Users.Queries Users diff --git a/src/IdentityPlus/WebApi/Users/AccountController.cs b/src/IdentityPlus/WebApi/Users/AccountController.cs index 8ef777c..8f30f2d 100644 --- a/src/IdentityPlus/WebApi/Users/AccountController.cs +++ b/src/IdentityPlus/WebApi/Users/AccountController.cs @@ -1,4 +1,4 @@ -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; using Honamic.Framework.Facade.Web.Results; using Honamic.IdentityPlus.Application.Accounts.Commands; using Honamic.IdentityPlus.Application.Accounts.Commands.Register; diff --git a/src/IdentityPlus/WebApi/Users/UserController.cs b/src/IdentityPlus/WebApi/Users/UserController.cs index 94544d0..2cadabe 100644 --- a/src/IdentityPlus/WebApi/Users/UserController.cs +++ b/src/IdentityPlus/WebApi/Users/UserController.cs @@ -1,4 +1,4 @@ -using Honamic.Framework.Facade.Results; +using Honamic.Framework.Applications.Results; using Honamic.Framework.Queries; using Honamic.IdentityPlus.Application.Users.Queries; using Honamic.IdentityPlus.Facade.Accounts; From 4b743d91478c670c9084b123b5aa5c7568991347 Mon Sep 17 00:00:00 2001 From: Iman Mohammadi Date: Tue, 20 May 2025 23:11:34 +0330 Subject: [PATCH 2/5] update packages --- TodoSample/Core/Application/Honamic.Todo.Application.csproj | 1 - .../Honamic.Framework.Applications.Abstractions.csproj | 4 ---- .../Applications/Extensions/ServiceCollectionExtensions.cs | 3 ++- src/Core/Applications/Honamic.Framework.Applications.csproj | 5 ++--- .../Honamic.Framework.Commands.Abstractions.csproj | 4 ---- src/Core/Commands/Honamic.Framework.Commands.csproj | 2 +- src/Core/Domain/DomainEventUserInfo.cs | 2 +- src/Core/Domain/Extensions/ServiceCollectionExtensions.cs | 6 ++---- src/Core/Domain/Honamic.Framework.Domain.csproj | 2 +- src/Core/Domain/SystemClock.cs | 2 +- src/Core/Events/Honamic.Framework.Events.csproj | 2 +- .../Honamic.Framework.Queries.Abstractions.csproj | 4 ---- src/Core/Queries/Honamic.Framework.Queries.csproj | 4 ++-- .../Query/Honamic.Framework.EntityFramework.Query.csproj | 2 +- .../Application/Honamic.IdentityPlus.Application.csproj | 1 - src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj | 3 --- 16 files changed, 14 insertions(+), 33 deletions(-) diff --git a/TodoSample/Core/Application/Honamic.Todo.Application.csproj b/TodoSample/Core/Application/Honamic.Todo.Application.csproj index bb8f57a..d9b724b 100644 --- a/TodoSample/Core/Application/Honamic.Todo.Application.csproj +++ b/TodoSample/Core/Application/Honamic.Todo.Application.csproj @@ -9,7 +9,6 @@ - diff --git a/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj b/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj index 295db34..76b8d66 100644 --- a/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj +++ b/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj @@ -6,8 +6,4 @@ enable $(MSBuildProjectName.Replace(" ", "_").Replace(".Abstractions", "")) - - - - diff --git a/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs b/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs index c42ac7c..a317134 100644 --- a/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs +++ b/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs @@ -5,6 +5,7 @@ using Honamic.Framework.Events.Extensions; using Honamic.Framework.Queries.Extensions; using Honamic.Framework.Events; +using Honamic.Framework.Domain.Extensions; namespace Honamic.Framework.Applications.Extensions; @@ -12,7 +13,7 @@ public static class ServiceCollectionExtensions { public static IServiceCollection AddDefaultApplicationsServices(this IServiceCollection services) { - services.AddDefaultDomainsServices(); + services.AddDefaultDomainServices(); services.AddDefaultEventsServices(); services.AddDefaultCommandsServices(); services.AddDefaultQueriesServices(); diff --git a/src/Core/Applications/Honamic.Framework.Applications.csproj b/src/Core/Applications/Honamic.Framework.Applications.csproj index dd2e5c9..3e62d05 100644 --- a/src/Core/Applications/Honamic.Framework.Applications.csproj +++ b/src/Core/Applications/Honamic.Framework.Applications.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -8,8 +8,7 @@ - - + diff --git a/src/Core/Commands.Abstractions/Honamic.Framework.Commands.Abstractions.csproj b/src/Core/Commands.Abstractions/Honamic.Framework.Commands.Abstractions.csproj index 295db34..76b8d66 100644 --- a/src/Core/Commands.Abstractions/Honamic.Framework.Commands.Abstractions.csproj +++ b/src/Core/Commands.Abstractions/Honamic.Framework.Commands.Abstractions.csproj @@ -6,8 +6,4 @@ enable $(MSBuildProjectName.Replace(" ", "_").Replace(".Abstractions", "")) - - - - diff --git a/src/Core/Commands/Honamic.Framework.Commands.csproj b/src/Core/Commands/Honamic.Framework.Commands.csproj index 1816dec..c771a69 100644 --- a/src/Core/Commands/Honamic.Framework.Commands.csproj +++ b/src/Core/Commands/Honamic.Framework.Commands.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Core/Domain/DomainEventUserInfo.cs b/src/Core/Domain/DomainEventUserInfo.cs index 1496c2c..ef09609 100644 --- a/src/Core/Domain/DomainEventUserInfo.cs +++ b/src/Core/Domain/DomainEventUserInfo.cs @@ -1,6 +1,6 @@ using Honamic.Framework.Events; -namespace Honamic.Framework.Domain.Defaults; +namespace Honamic.Framework.Domain; public class DomainEventUserInfo : IEventUserInfo { diff --git a/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs b/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs index c475a68..0c1fafd 100644 --- a/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs +++ b/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs @@ -1,12 +1,10 @@ using Microsoft.Extensions.DependencyInjection; -using Honamic.Framework.Domain.Defaults; -using Honamic.Framework.Domain; -namespace Honamic.Framework.Applications.Extensions; +namespace Honamic.Framework.Domain.Extensions; public static class ServiceCollectionExtensions { - public static IServiceCollection AddDefaultDomainsServices(this IServiceCollection services) + public static IServiceCollection AddDefaultDomainServices(this IServiceCollection services) { services.AddSystemClock(); return services; diff --git a/src/Core/Domain/Honamic.Framework.Domain.csproj b/src/Core/Domain/Honamic.Framework.Domain.csproj index f4619bb..986fbc6 100644 --- a/src/Core/Domain/Honamic.Framework.Domain.csproj +++ b/src/Core/Domain/Honamic.Framework.Domain.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/Core/Domain/SystemClock.cs b/src/Core/Domain/SystemClock.cs index 7a46416..efa7570 100644 --- a/src/Core/Domain/SystemClock.cs +++ b/src/Core/Domain/SystemClock.cs @@ -1,4 +1,4 @@ -namespace Honamic.Framework.Domain.Defaults; +namespace Honamic.Framework.Domain; public class SystemClock : IClock { diff --git a/src/Core/Events/Honamic.Framework.Events.csproj b/src/Core/Events/Honamic.Framework.Events.csproj index 77062b6..2c0a927 100644 --- a/src/Core/Events/Honamic.Framework.Events.csproj +++ b/src/Core/Events/Honamic.Framework.Events.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Core/Queries.Abstractions/Honamic.Framework.Queries.Abstractions.csproj b/src/Core/Queries.Abstractions/Honamic.Framework.Queries.Abstractions.csproj index 77062b6..4c07ce3 100644 --- a/src/Core/Queries.Abstractions/Honamic.Framework.Queries.Abstractions.csproj +++ b/src/Core/Queries.Abstractions/Honamic.Framework.Queries.Abstractions.csproj @@ -7,10 +7,6 @@ $(MSBuildProjectName.Replace(" ", "_").Replace(".Abstractions", "")) - - - - diff --git a/src/Core/Queries/Honamic.Framework.Queries.csproj b/src/Core/Queries/Honamic.Framework.Queries.csproj index 34e2848..243bee4 100644 --- a/src/Core/Queries/Honamic.Framework.Queries.csproj +++ b/src/Core/Queries/Honamic.Framework.Queries.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/src/EntityFramework/Query/Honamic.Framework.EntityFramework.Query.csproj b/src/EntityFramework/Query/Honamic.Framework.EntityFramework.Query.csproj index cfd4278..5222333 100644 --- a/src/EntityFramework/Query/Honamic.Framework.EntityFramework.Query.csproj +++ b/src/EntityFramework/Query/Honamic.Framework.EntityFramework.Query.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj b/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj index 11b0f26..b20e11c 100644 --- a/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj +++ b/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj @@ -11,7 +11,6 @@ - diff --git a/src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj b/src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj index 898dd60..c320604 100644 --- a/src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj +++ b/src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj @@ -6,9 +6,6 @@ enable - - - From d444e441a2b173307639ea732b9e8dba6b955d8e Mon Sep 17 00:00:00 2001 From: Iman Mohammadi Date: Tue, 20 May 2025 23:19:32 +0330 Subject: [PATCH 3/5] update ef packages --- .../Honamic.Todo.Endpoints.WebApi.csproj | 2 +- TodoSample/Facade/Honamic.Todo.Facade.csproj | 2 +- .../Honamic.Todo.Persistence.EntityFramework.csproj | 7 +++---- .../Infra/Query/Honamic.Todo.Query.EntityFramework.csproj | 4 ++-- .../Default/Honamic.Framework.EntityFramework.csproj | 2 +- .../Persistence/Honamic.IdentityPlus.Persistence.csproj | 4 ++-- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj index 4581814..06b117c 100644 --- a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj +++ b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj @@ -11,7 +11,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/TodoSample/Facade/Honamic.Todo.Facade.csproj b/TodoSample/Facade/Honamic.Todo.Facade.csproj index 9aaa471..d7bcfda 100644 --- a/TodoSample/Facade/Honamic.Todo.Facade.csproj +++ b/TodoSample/Facade/Honamic.Todo.Facade.csproj @@ -8,7 +8,7 @@ - + diff --git a/TodoSample/Infra/Persistence/Honamic.Todo.Persistence.EntityFramework.csproj b/TodoSample/Infra/Persistence/Honamic.Todo.Persistence.EntityFramework.csproj index c53ea5e..b4beb54 100644 --- a/TodoSample/Infra/Persistence/Honamic.Todo.Persistence.EntityFramework.csproj +++ b/TodoSample/Infra/Persistence/Honamic.Todo.Persistence.EntityFramework.csproj @@ -10,14 +10,13 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/TodoSample/Infra/Query/Honamic.Todo.Query.EntityFramework.csproj b/TodoSample/Infra/Query/Honamic.Todo.Query.EntityFramework.csproj index c082588..53c5d91 100644 --- a/TodoSample/Infra/Query/Honamic.Todo.Query.EntityFramework.csproj +++ b/TodoSample/Infra/Query/Honamic.Todo.Query.EntityFramework.csproj @@ -9,8 +9,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj b/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj index c95ae15..75186c7 100644 --- a/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj +++ b/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/IdentityPlus/Persistence/Honamic.IdentityPlus.Persistence.csproj b/src/IdentityPlus/Persistence/Honamic.IdentityPlus.Persistence.csproj index fe17574..9e76f99 100644 --- a/src/IdentityPlus/Persistence/Honamic.IdentityPlus.Persistence.csproj +++ b/src/IdentityPlus/Persistence/Honamic.IdentityPlus.Persistence.csproj @@ -7,8 +7,8 @@ - - + + From ae10d88ae5befe855dd2e88b9119af924b53b99e Mon Sep 17 00:00:00 2001 From: Iman Mohammadi Date: Tue, 20 May 2025 23:31:38 +0330 Subject: [PATCH 4/5] update packages --- TodoSample/Core/Domain/Honamic.Todo.Domain.csproj | 2 +- .../Honamic.Todo.Endpoints.WebApi.csproj | 4 ++-- src/Core/Queries/Honamic.Framework.Queries.csproj | 2 +- .../Default/Honamic.Framework.EntityFramework.csproj | 2 +- .../Honamic.Framework.Facade.Abstractions.csproj | 2 +- src/Facade/Default/Honamic.Framework.Facade.csproj | 5 ++--- .../FastCrud/Honamic.Framework.Facade.FastCrud.csproj | 8 ++++---- src/Facade/Web/Honamic.Framework.Facade.Web.csproj | 2 +- .../Application/Honamic.IdentityPlus.Application.csproj | 2 +- .../Honamic.Framework.Tools.IdGenerators.csproj | 4 ++-- src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj | 2 +- 11 files changed, 17 insertions(+), 18 deletions(-) diff --git a/TodoSample/Core/Domain/Honamic.Todo.Domain.csproj b/TodoSample/Core/Domain/Honamic.Todo.Domain.csproj index 5232606..cae907c 100644 --- a/TodoSample/Core/Domain/Honamic.Todo.Domain.csproj +++ b/TodoSample/Core/Domain/Honamic.Todo.Domain.csproj @@ -8,7 +8,7 @@ - + diff --git a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj index 06b117c..89ca733 100644 --- a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj +++ b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj @@ -15,8 +15,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/Core/Queries/Honamic.Framework.Queries.csproj b/src/Core/Queries/Honamic.Framework.Queries.csproj index 243bee4..5ff0376 100644 --- a/src/Core/Queries/Honamic.Framework.Queries.csproj +++ b/src/Core/Queries/Honamic.Framework.Queries.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj b/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj index 75186c7..f1fc1aa 100644 --- a/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj +++ b/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj b/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj index e33d35b..ef90923 100644 --- a/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj +++ b/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Facade/Default/Honamic.Framework.Facade.csproj b/src/Facade/Default/Honamic.Framework.Facade.csproj index 494fa1a..d9694b7 100644 --- a/src/Facade/Default/Honamic.Framework.Facade.csproj +++ b/src/Facade/Default/Honamic.Framework.Facade.csproj @@ -8,10 +8,9 @@ - - + - + diff --git a/src/Facade/FastCrud/Honamic.Framework.Facade.FastCrud.csproj b/src/Facade/FastCrud/Honamic.Framework.Facade.FastCrud.csproj index e1b0465..6261134 100644 --- a/src/Facade/FastCrud/Honamic.Framework.Facade.FastCrud.csproj +++ b/src/Facade/FastCrud/Honamic.Framework.Facade.FastCrud.csproj @@ -8,10 +8,10 @@ - - - - + + + + diff --git a/src/Facade/Web/Honamic.Framework.Facade.Web.csproj b/src/Facade/Web/Honamic.Framework.Facade.Web.csproj index 9841509..7693cbd 100644 --- a/src/Facade/Web/Honamic.Framework.Facade.Web.csproj +++ b/src/Facade/Web/Honamic.Framework.Facade.Web.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj b/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj index b20e11c..4132c85 100644 --- a/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj +++ b/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/Tools/Honamic.Framework.Tools.IdGenerators/Honamic.Framework.Tools.IdGenerators.csproj b/src/Tools/Honamic.Framework.Tools.IdGenerators/Honamic.Framework.Tools.IdGenerators.csproj index 53b275e..4d70089 100644 --- a/src/Tools/Honamic.Framework.Tools.IdGenerators/Honamic.Framework.Tools.IdGenerators.csproj +++ b/src/Tools/Honamic.Framework.Tools.IdGenerators/Honamic.Framework.Tools.IdGenerators.csproj @@ -8,9 +8,9 @@ - + - + diff --git a/src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj b/src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj index 9e27e34..d974b3c 100644 --- a/src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj +++ b/src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj @@ -7,7 +7,7 @@ - + From 9f84c2cc9f542945b7dfa97b427492599cbd395c Mon Sep 17 00:00:00 2001 From: Iman Mohammadi Date: Wed, 21 May 2025 00:59:01 +0330 Subject: [PATCH 5/5] Created `ResultOrientedCommandHandlerDecorator.cs` for structured command execution and error handling. --- .../Honamic.Todo.Application.Contracts.csproj | 2 + .../Commands/CreateTodoItemCommand.cs | 14 +++ .../ApplicationServiceCollectionExtensions.cs | 6 + .../CreateTodoItem2CommandHandler.cs | 33 ++++++ .../TodoItems/TodoItems2Controller.cs | 30 +++++ .../TodoItems/TodoItemsController.cs | 6 + .../Exceptions/UnauthenticatedException.cs | 2 +- .../Exceptions/UnauthorizedException.cs | 2 +- .../ResultOrientedCommandHandlerDecorator.cs | 107 ++++++++++++++++++ .../Extensions/ServiceCollectionExtensions.cs | 2 + .../Interceptors/AuthorizeInterceptor.cs | 2 +- .../ExceptionHandlingInterceptor.cs | 2 +- .../ExceptionToFacadeResultMiddleware.cs | 4 +- 13 files changed, 206 insertions(+), 6 deletions(-) create mode 100644 TodoSample/Core/Application/TodoItems/CommandHandlers/CreateTodoItem2CommandHandler.cs create mode 100644 TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItems2Controller.cs rename src/{Facade/Abstractions => Core/Applications.Abstractions}/Exceptions/UnauthenticatedException.cs (68%) rename src/{Facade/Abstractions => Core/Applications.Abstractions}/Exceptions/UnauthorizedException.cs (85%) create mode 100644 src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs diff --git a/TodoSample/Core/Application.Contracts/Honamic.Todo.Application.Contracts.csproj b/TodoSample/Core/Application.Contracts/Honamic.Todo.Application.Contracts.csproj index dcacb59..859ce99 100644 --- a/TodoSample/Core/Application.Contracts/Honamic.Todo.Application.Contracts.csproj +++ b/TodoSample/Core/Application.Contracts/Honamic.Todo.Application.Contracts.csproj @@ -10,6 +10,8 @@ + + diff --git a/TodoSample/Core/Application.Contracts/TodoItems/Commands/CreateTodoItemCommand.cs b/TodoSample/Core/Application.Contracts/TodoItems/Commands/CreateTodoItemCommand.cs index bb2db74..58febff 100644 --- a/TodoSample/Core/Application.Contracts/TodoItems/Commands/CreateTodoItemCommand.cs +++ b/TodoSample/Core/Application.Contracts/TodoItems/Commands/CreateTodoItemCommand.cs @@ -1,5 +1,19 @@  +using Honamic.Framework.Applications.Results; using Honamic.Framework.Commands; namespace Honamic.Todo.Application.TodoItems.Commands; public record CreateTodoItemCommand(string title, string content, List tags) : ICommand; + + + + +public record CreateTodoItem2Command(string title, string content, List tags) + : ICommand>; + + + +public class CreateTodoItem2ResultCommand +{ + public long Id { get; set; } +} \ No newline at end of file diff --git a/TodoSample/Core/Application/Extensions/ApplicationServiceCollectionExtensions.cs b/TodoSample/Core/Application/Extensions/ApplicationServiceCollectionExtensions.cs index 2dde990..5d8ad7b 100644 --- a/TodoSample/Core/Application/Extensions/ApplicationServiceCollectionExtensions.cs +++ b/TodoSample/Core/Application/Extensions/ApplicationServiceCollectionExtensions.cs @@ -7,6 +7,7 @@ using Honamic.Framework.Tools.IdGenerators; using Honamic.Todo.Application.TodoItems.EventHandlers; using Honamic.IdentityPlus.Domain.Users; +using Honamic.Framework.Applications.Results; namespace Honamic.Todo.Application.Extensions; @@ -25,6 +26,11 @@ private static void AddCommandHandlers(this IServiceCollection services) { services.AddCommandHandler(); services.AddCommandHandler(); + services.AddCommandHandler< + CreateTodoItem2Command, + CreateTodoItem2CommandHandler, + Result>(); + services.AddCommandHandler(); } diff --git a/TodoSample/Core/Application/TodoItems/CommandHandlers/CreateTodoItem2CommandHandler.cs b/TodoSample/Core/Application/TodoItems/CommandHandlers/CreateTodoItem2CommandHandler.cs new file mode 100644 index 0000000..14e57fd --- /dev/null +++ b/TodoSample/Core/Application/TodoItems/CommandHandlers/CreateTodoItem2CommandHandler.cs @@ -0,0 +1,33 @@ +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Commands; +using Honamic.Framework.Domain; +using Honamic.Todo.Application.TodoItems.Commands; +using Honamic.Todo.Domain.TodoItems; + +namespace Honamic.Todo.Application.TodoItems.CommandHandlers; +internal class CreateTodoItem2CommandHandler : + ICommandHandler> +{ + private readonly ITodoItemRepository _todoItemRepository; + private readonly IIdGenerator _idGenerator; + + public CreateTodoItem2CommandHandler(ITodoItemRepository todoItemRepository, IIdGenerator idGenerator) + { + _todoItemRepository = todoItemRepository; + _idGenerator = idGenerator; + } + + public async Task> HandleAsync(CreateTodoItem2Command command, CancellationToken cancellationToken) + { + var todoItem = new TodoItem(_idGenerator.GetNewId(), command.title, command.content, command.tags); + await _todoItemRepository.InsertAsync(todoItem); + + var result = new CreateTodoItem2ResultCommand + { + Id = todoItem.Id + }; + + return result; + } + +} diff --git a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItems2Controller.cs b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItems2Controller.cs new file mode 100644 index 0000000..c3d8436 --- /dev/null +++ b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItems2Controller.cs @@ -0,0 +1,30 @@ +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Commands; +using Honamic.Todo.Application.TodoItems.Commands; +using Microsoft.AspNetCore.Mvc; + +namespace Honamic.Todo.Endpoints.WebApi.Controllers; + +[Route("api/[controller]")] +[ApiController] +public class TodoItems2Controller : ControllerBase +{ + private readonly ILogger _logger; + private readonly ICommandBus _commandBus; + + public TodoItems2Controller(ILogger logger, ICommandBus commandBus) + { + _logger = logger; + _commandBus = commandBus; + } + + [HttpPost] + public async Task> Post([FromBody] CreateTodoItem2Command model, CancellationToken cancellationToken) + { + return await _commandBus + .DispatchAsync> + (model, cancellationToken); + } + + +} diff --git a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs index 672cf76..bf98524 100644 --- a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs +++ b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs @@ -37,6 +37,12 @@ public Task> Get(long id, CancellationToken cancellationTo } + [HttpPost("Create")] + public Task> Create([FromBody] CreateTodoItemCommand model, CancellationToken cancellationToken) + { + return _todoItemFacade.Create(model, cancellationToken); + } + [HttpPost] public Task> Post([FromBody] CreateTodoItemCommand model, CancellationToken cancellationToken) { diff --git a/src/Facade/Abstractions/Exceptions/UnauthenticatedException.cs b/src/Core/Applications.Abstractions/Exceptions/UnauthenticatedException.cs similarity index 68% rename from src/Facade/Abstractions/Exceptions/UnauthenticatedException.cs rename to src/Core/Applications.Abstractions/Exceptions/UnauthenticatedException.cs index 6e4ed3f..0fdaeeb 100644 --- a/src/Facade/Abstractions/Exceptions/UnauthenticatedException.cs +++ b/src/Core/Applications.Abstractions/Exceptions/UnauthenticatedException.cs @@ -1,4 +1,4 @@ -namespace Honamic.Framework.Facade.Exceptions; +namespace Honamic.Framework.Applications.Exceptions; public class UnauthenticatedException : Exception { diff --git a/src/Facade/Abstractions/Exceptions/UnauthorizedException.cs b/src/Core/Applications.Abstractions/Exceptions/UnauthorizedException.cs similarity index 85% rename from src/Facade/Abstractions/Exceptions/UnauthorizedException.cs rename to src/Core/Applications.Abstractions/Exceptions/UnauthorizedException.cs index 39f358f..9ab570d 100644 --- a/src/Facade/Abstractions/Exceptions/UnauthorizedException.cs +++ b/src/Core/Applications.Abstractions/Exceptions/UnauthorizedException.cs @@ -1,4 +1,4 @@ -namespace Honamic.Framework.Facade.Exceptions; +namespace Honamic.Framework.Applications.Exceptions; public class UnauthorizedException : Exception { diff --git a/src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs b/src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs new file mode 100644 index 0000000..05a514c --- /dev/null +++ b/src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs @@ -0,0 +1,107 @@ +using Honamic.Framework.Applications.Exceptions; +using Honamic.Framework.Applications.Results; +using Honamic.Framework.Commands; +using Honamic.Framework.Domain; + +namespace Honamic.Framework.Applications.CommandHandlerDecorators; + +public class ResultOrientedCommandHandlerDecorator : ICommandHandler + where TCommand : ICommand +{ + private readonly ICommandHandler _commandHandler; + + public ResultOrientedCommandHandlerDecorator(ICommandHandler commandHandler) + { + _commandHandler = commandHandler; + } + + public async Task HandleAsync(TCommand command, CancellationToken cancellationToken) + { + TResponse result; + try + { + result = await _commandHandler.HandleAsync(command, cancellationToken); + } + catch (Exception ex) + { + if (IsResultOriented(typeof(TResponse))) + { + result = CreateResultWithError(typeof(TResponse), ex); + return result; + } + + throw; + } + + return result; + } + + private TResponse CreateResultWithError(Type type, Exception ex) + { + var resultObject = CreateResult(type); + + if (resultObject is Result result) + { + switch (ex) + { + case UnauthenticatedException: + result.SetStatusAsUnauthenticated(); + result.AppendError(ex.Message); + break; + case UnauthorizedException: + result.SetStatusAsUnauthorized(); + result.AppendError(ex.Message); + break; + case BusinessException businessException: + result.Status = ResultStatus.ValidationError; + var code = businessException.GetCode(); + var message = businessException.GetMessage(); + result.AppendError(message, null, code); + break; + default: + result.SetStatusAsUnhandledExceptionWithSorryError(); + result.AppendError(ex.ToString(), "Exception"); + break; + } + return resultObject; + } + + // If we can't cast to Result, we have a serious error + throw new ArgumentException($"Expected a Result type but got {type.FullName}"); + } + + private TResponse CreateResult(Type type) + { + // For non-generic Result + if (type == typeof(Result)) + { + return (TResponse)(object)new Result(); + } + + // For Result + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Result<>)) + { + var genericArgType = type.GenericTypeArguments[0]; + var resultType = typeof(Result<>).MakeGenericType(genericArgType); + return (TResponse)Activator.CreateInstance(resultType); + } + + return default; + } + + private bool IsResultOriented(Type type) + { + if (type == typeof(Result)) + { + return true; + } + + if (type.IsGenericType + && type.GetGenericTypeDefinition() == typeof(Result<>)) + { + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs b/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs index a317134..f1309d6 100644 --- a/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs +++ b/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs @@ -27,6 +27,7 @@ public static void AddCommandHandler(this IServiceCol { services.AddTransient, TCommandHandler>(); services.Decorate, TransactionalCommandHandlerDecorator>(); + // Note: No ResultOriented decorator for non-response commands } public static void AddCommandHandler(this IServiceCollection services) @@ -35,6 +36,7 @@ public static void AddCommandHandler(this { services.AddTransient, TCommandHandler>(); services.Decorate, TransactionalCommandHandlerDecorator>(); + services.Decorate, ResultOrientedCommandHandlerDecorator>(); } public static void AddEventHandler(this IServiceCollection services) diff --git a/src/Facade/Default/Interceptors/AuthorizeInterceptor.cs b/src/Facade/Default/Interceptors/AuthorizeInterceptor.cs index 966ba3b..3615657 100644 --- a/src/Facade/Default/Interceptors/AuthorizeInterceptor.cs +++ b/src/Facade/Default/Interceptors/AuthorizeInterceptor.cs @@ -1,5 +1,5 @@ using Castle.DynamicProxy; -using Honamic.Framework.Facade.Exceptions; +using Honamic.Framework.Applications.Exceptions; using Microsoft.Extensions.Logging; using System.Reflection; diff --git a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs index cbab4c8..57524c6 100644 --- a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs +++ b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs @@ -1,6 +1,6 @@ using Castle.DynamicProxy; +using Honamic.Framework.Applications.Exceptions; using Honamic.Framework.Applications.Results; -using Honamic.Framework.Facade.Exceptions; using Microsoft.Extensions.Logging; using System.Diagnostics; using System.Reflection; diff --git a/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs b/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs index 28344f0..6e907de 100644 --- a/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs +++ b/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs @@ -1,6 +1,6 @@ -using Honamic.Framework.Applications.Results; +using Honamic.Framework.Applications.Exceptions; +using Honamic.Framework.Applications.Results; using Honamic.Framework.Domain; -using Honamic.Framework.Facade.Exceptions; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection;