From e77016feddbd7e20ac4acafc4c43bdfd2312b9c6 Mon Sep 17 00:00:00 2001 From: akovylyaeva Date: Tue, 25 Nov 2025 17:19:04 +0500 Subject: [PATCH 01/11] feat: proposal for api reorganization --- Api/Controllers/ItemsController.cs | 101 ------------------ Api/DependencyInjection.cs | 5 + .../Handlers/CreateItem/CreateItemHandler.cs | 34 ++++++ .../Handlers/CreateItem}/CreateItemRequest.cs | 2 +- .../CreateItem}/CreateItemResponse.cs | 2 +- .../GetAllItems/GetAllItemsHandler.cs | 48 +++++++++ .../GetAllItems}/HolderEmployeeMapper.cs | 3 +- .../GetAllItems}/HolderEmployeeMapperTests.cs | 2 +- .../Handlers/GetAllItems}/ItemsResponse.cs | 4 +- .../Items/Handlers/ItemsController.cs | 58 ++++++++++ 10 files changed, 152 insertions(+), 107 deletions(-) delete mode 100644 Api/Controllers/ItemsController.cs create mode 100644 Api/Features/Items/Handlers/CreateItem/CreateItemHandler.cs rename Api/{Requests => Features/Items/Handlers/CreateItem}/CreateItemRequest.cs (91%) rename Api/{Responses => Features/Items/Handlers/CreateItem}/CreateItemResponse.cs (63%) create mode 100644 Api/Features/Items/Handlers/GetAllItems/GetAllItemsHandler.cs rename Api/{Mappers => Features/Items/Handlers/GetAllItems}/HolderEmployeeMapper.cs (92%) rename Api/{Mappers => Features/Items/Handlers/GetAllItems}/HolderEmployeeMapperTests.cs (92%) rename Api/{Responses => Features/Items/Handlers/GetAllItems}/ItemsResponse.cs (89%) create mode 100644 Api/Features/Items/Handlers/ItemsController.cs diff --git a/Api/Controllers/ItemsController.cs b/Api/Controllers/ItemsController.cs deleted file mode 100644 index 74446ed..0000000 --- a/Api/Controllers/ItemsController.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using Api.EnternalDeps.EmployeesApi; -using Api.Mappers; -using Api.Requests; -using Api.Responses; -using Application.Commands; -using Application.Queries; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; - -namespace Api.Controllers; - -[Authorize] -[ApiController] -[Route("api/items")] -public class ItemsController : ControllerBase -{ - /// - /// Get all items - /// - [RequiresPermission(UserClaimsProvider.CanViewItems)] - [HttpGet] - public async Task GetAllItemsAsync( - [FromServices] AllItemsQuery allItemsQuery, - [FromServices] EmployeesApi employeesApi - ) - { - var items = await allItemsQuery.GetAsync(); - - var allEmployeesResponse = await employeesApi.GetAllEmployeesAsync(); - - return new ItemsResponse - { - Items = items - .Select(x => new ItemDto - { - Id = x.Id, - Name = x.Name, - SerialNumber = x.SerialNumber, - ItemType = new ItemTypeDto - { - Id = x.ItemType.Id, - Name = x.ItemType.Name - }, - Price = x.Price, - Description = x.Description, - PurchaseDate = x.PurchaseDate, - HolderEmployee = HolderEmployeeMapper.MapToEmployeeDto(x.HolderEmployeeId, allEmployeesResponse) - }) - .ToList() - }; - } - - /// - /// Add an item - /// - /// - [RequiresPermission(UserClaimsProvider.CanManageItems)] - [HttpPost] - public async Task CreateItemAsync( - [FromServices] CreateItemCommand createItemCommand, - [Required][FromBody] CreateItemRequest createItemRequest - ) - { - var createItemCommandParams = new CreateItemCommandParams - { - Name = createItemRequest.Name, - SerialNumber = createItemRequest.SerialNumber, - ItemTypeId = createItemRequest.ItemTypeId, - Price = createItemRequest.Price, - Description = createItemRequest.Description, - PurchaseDate = createItemRequest.PurchaseDate, - HolderEmployeeId = createItemRequest.HolderEmployeeId - }; - - var newItemId = await createItemCommand.ExecuteAsync(createItemCommandParams); - - return new CreateItemResponse() - { - NewItemId = newItemId - }; - } - - /// - /// Deletes specific item - /// - /// - [RequiresPermission(UserClaimsProvider.AUTO_TESTS_ONLY_IsItemsHardDeleteAllowed)] - [HttpDelete("{itemId}/hard-delete")] - public async Task HardDeleteItemAsync( - [FromServices] HardDeleteItemCommand hardDeleteItemCommand, - [Required][FromRoute] long itemId - ) - { - return new - { - isDeleted = await hardDeleteItemCommand.ExecuteAsync(itemId) - }; - } -} diff --git a/Api/DependencyInjection.cs b/Api/DependencyInjection.cs index b94215c..8dfd436 100644 --- a/Api/DependencyInjection.cs +++ b/Api/DependencyInjection.cs @@ -1,4 +1,6 @@ using Api.EnternalDeps.EmployeesApi; +using Api.Features.Items.Handlers.CreateItem; +using Api.Features.Items.Handlers.GetAllItems; using Application; using Application.Commands; using Application.Queries; @@ -36,5 +38,8 @@ public static void AddApplication(this IServiceCollection services, IConfigurati services.AddTransient(); services.AddTransient(); services.AddTransient(); + + services.AddScoped(); + services.AddScoped(); } } diff --git a/Api/Features/Items/Handlers/CreateItem/CreateItemHandler.cs b/Api/Features/Items/Handlers/CreateItem/CreateItemHandler.cs new file mode 100644 index 0000000..907dee8 --- /dev/null +++ b/Api/Features/Items/Handlers/CreateItem/CreateItemHandler.cs @@ -0,0 +1,34 @@ +using Application.Commands; + +namespace Api.Features.Items.Handlers.CreateItem; + +public class CreateItemHandler +{ + private readonly CreateItemCommand _createItemCommand; + + public CreateItemHandler(CreateItemCommand createItemCommand) + { + _createItemCommand = createItemCommand; + } + + public async Task HandleAsync(CreateItemRequest createItemRequest) + { + var createItemCommandParams = new CreateItemCommandParams + { + Name = createItemRequest.Name, + SerialNumber = createItemRequest.SerialNumber, + ItemTypeId = createItemRequest.ItemTypeId, + Price = createItemRequest.Price, + Description = createItemRequest.Description, + PurchaseDate = createItemRequest.PurchaseDate, + HolderEmployeeId = createItemRequest.HolderEmployeeId + }; + + var newItemId = await _createItemCommand.ExecuteAsync(createItemCommandParams); + + return new CreateItemResponse() + { + NewItemId = newItemId + }; + } +} diff --git a/Api/Requests/CreateItemRequest.cs b/Api/Features/Items/Handlers/CreateItem/CreateItemRequest.cs similarity index 91% rename from Api/Requests/CreateItemRequest.cs rename to Api/Features/Items/Handlers/CreateItem/CreateItemRequest.cs index 4f427ca..7606e9f 100644 --- a/Api/Requests/CreateItemRequest.cs +++ b/Api/Features/Items/Handlers/CreateItem/CreateItemRequest.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Api.Requests; +namespace Api.Features.Items.Handlers.CreateItem; public class CreateItemRequest { diff --git a/Api/Responses/CreateItemResponse.cs b/Api/Features/Items/Handlers/CreateItem/CreateItemResponse.cs similarity index 63% rename from Api/Responses/CreateItemResponse.cs rename to Api/Features/Items/Handlers/CreateItem/CreateItemResponse.cs index 0fac7f6..5879b00 100644 --- a/Api/Responses/CreateItemResponse.cs +++ b/Api/Features/Items/Handlers/CreateItem/CreateItemResponse.cs @@ -1,4 +1,4 @@ -namespace Api.Responses; +namespace Api.Features.Items.Handlers.CreateItem; public class CreateItemResponse { diff --git a/Api/Features/Items/Handlers/GetAllItems/GetAllItemsHandler.cs b/Api/Features/Items/Handlers/GetAllItems/GetAllItemsHandler.cs new file mode 100644 index 0000000..e83f443 --- /dev/null +++ b/Api/Features/Items/Handlers/GetAllItems/GetAllItemsHandler.cs @@ -0,0 +1,48 @@ +using Api.EnternalDeps.EmployeesApi; +using Api.Responses; +using Application.Queries; + +namespace Api.Features.Items.Handlers.GetAllItems; + +public class GetAllItemsHandler +{ + private readonly AllItemsQuery _allItemsQuery; + private readonly EmployeesApi _employeesApi; + + public GetAllItemsHandler( + AllItemsQuery allItemsQuery, + EmployeesApi employeesApi + ) + { + _allItemsQuery = allItemsQuery; + _employeesApi = employeesApi; + } + + public async Task HandleAsync() + { + var items = await _allItemsQuery.GetAsync(); + + var allEmployeesResponse = await _employeesApi.GetAllEmployeesAsync(); + + return new ItemsResponse + { + Items = items + .Select(x => new ItemDto + { + Id = x.Id, + Name = x.Name, + SerialNumber = x.SerialNumber, + ItemType = new ItemTypeDto + { + Id = x.ItemType.Id, + Name = x.ItemType.Name + }, + Price = x.Price, + Description = x.Description, + PurchaseDate = x.PurchaseDate, + HolderEmployee = HolderEmployeeMapper.MapToEmployeeDto(x.HolderEmployeeId, allEmployeesResponse) + }) + .ToList() + }; + } +} diff --git a/Api/Mappers/HolderEmployeeMapper.cs b/Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapper.cs similarity index 92% rename from Api/Mappers/HolderEmployeeMapper.cs rename to Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapper.cs index 14643b6..386011c 100644 --- a/Api/Mappers/HolderEmployeeMapper.cs +++ b/Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapper.cs @@ -1,7 +1,6 @@ using Api.EnternalDeps.EmployeesApi.Responses; -using Api.Responses; -namespace Api.Mappers; +namespace Api.Features.Items.Handlers.GetAllItems; public class HolderEmployeeMapper { diff --git a/Api/Mappers/HolderEmployeeMapperTests.cs b/Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapperTests.cs similarity index 92% rename from Api/Mappers/HolderEmployeeMapperTests.cs rename to Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapperTests.cs index cbe5d84..7f02ef1 100644 --- a/Api/Mappers/HolderEmployeeMapperTests.cs +++ b/Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapperTests.cs @@ -1,7 +1,7 @@ using Api.EnternalDeps.EmployeesApi.Responses; using Xunit; -namespace Api.Mappers; +namespace Api.Features.Items.Handlers.GetAllItems; public class HolderEmployeeMapperTests { diff --git a/Api/Responses/ItemsResponse.cs b/Api/Features/Items/Handlers/GetAllItems/ItemsResponse.cs similarity index 89% rename from Api/Responses/ItemsResponse.cs rename to Api/Features/Items/Handlers/GetAllItems/ItemsResponse.cs index 2bf4cf3..b0d6023 100644 --- a/Api/Responses/ItemsResponse.cs +++ b/Api/Features/Items/Handlers/GetAllItems/ItemsResponse.cs @@ -1,4 +1,6 @@ -namespace Api.Responses; +using Api.Responses; + +namespace Api.Features.Items.Handlers.GetAllItems; public class ItemsResponse { diff --git a/Api/Features/Items/Handlers/ItemsController.cs b/Api/Features/Items/Handlers/ItemsController.cs new file mode 100644 index 0000000..b77100e --- /dev/null +++ b/Api/Features/Items/Handlers/ItemsController.cs @@ -0,0 +1,58 @@ +using System.ComponentModel.DataAnnotations; +using Api.Features.Items.Handlers.CreateItem; +using Api.Features.Items.Handlers.GetAllItems; +using Application.Commands; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; + +namespace Api.Features.Items.Handlers; + +[Authorize] +[ApiController] +[Route("api/items")] +public class ItemsController : ControllerBase +{ + /// + /// Get all items + /// + [RequiresPermission(UserClaimsProvider.CanViewItems)] + [HttpGet] + public Task GetAllItemsAsync( + [FromServices] GetAllItemsHandler getAllItemsHandler + ) + { + return getAllItemsHandler.HandleAsync(); + } + + /// + /// Add an item + /// + /// + [RequiresPermission(UserClaimsProvider.CanManageItems)] + [HttpPost] + public Task CreateItemAsync( + [FromServices] CreateItemHandler createItemHandler, + [Required][FromBody] CreateItemRequest createItemRequest + ) + { + return createItemHandler.HandleAsync(createItemRequest); + } + + /// + /// Deletes specific item + /// + /// + [RequiresPermission(UserClaimsProvider.AUTO_TESTS_ONLY_IsItemsHardDeleteAllowed)] + [HttpDelete("{itemId}/hard-delete")] + public async Task HardDeleteItemAsync( + [FromServices] HardDeleteItemCommand hardDeleteItemCommand, + [Required][FromRoute] long itemId + ) + { + return new + { + isDeleted = await hardDeleteItemCommand.ExecuteAsync(itemId) + }; + } +} From b09ed7b00fd63b18fcbd1f6b834683cc9ef79709 Mon Sep 17 00:00:00 2001 From: Workflow Action Date: Tue, 25 Nov 2025 12:21:46 +0000 Subject: [PATCH 02/11] docs(readme): bring test coverage score up to date --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dc12873..af5bae1 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # inner-circle-items-api -[![coverage](https://img.shields.io/badge/e2e_coverage-81.90%25-olivedrab)](https://github.com/TourmalineCore/inner-circle-items-api/actions/workflows/calculate-tests-coverage-on-pull-request.yml) -[![coverage](https://img.shields.io/badge/units_coverage-17.65%25-crimson)](https://github.com/TourmalineCore/inner-circle-items-api/actions/workflows/calculate-tests-coverage-on-pull-request.yml) -[![coverage](https://img.shields.io/badge/full_coverage-89.78%25-olivedrab)](https://github.com/TourmalineCore/inner-circle-items-api/actions/workflows/calculate-tests-coverage-on-pull-request.yml) +[![coverage](https://img.shields.io/badge/e2e_coverage-82.22%25-olivedrab)](https://github.com/TourmalineCore/inner-circle-items-api/actions/workflows/calculate-tests-coverage-on-pull-request.yml) +[![coverage](https://img.shields.io/badge/units_coverage-17.34%25-crimson)](https://github.com/TourmalineCore/inner-circle-items-api/actions/workflows/calculate-tests-coverage-on-pull-request.yml) +[![coverage](https://img.shields.io/badge/full_coverage-89.96%25-olivedrab)](https://github.com/TourmalineCore/inner-circle-items-api/actions/workflows/calculate-tests-coverage-on-pull-request.yml) This repo contains Inner Circle Items API. From de904cdc66baa152d45c269c3f92e9d5ebbc6086 Mon Sep 17 00:00:00 2001 From: Aleksandr Shinkarev Date: Tue, 25 Nov 2025 22:37:16 +0500 Subject: [PATCH 03/11] refactor: move ItemsController.cs one level higner in the folders hierarchy --- Api/Features/Items/{Handlers => }/ItemsController.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Api/Features/Items/{Handlers => }/ItemsController.cs (100%) diff --git a/Api/Features/Items/Handlers/ItemsController.cs b/Api/Features/Items/ItemsController.cs similarity index 100% rename from Api/Features/Items/Handlers/ItemsController.cs rename to Api/Features/Items/ItemsController.cs From b2723483869b5bc56a5ce66901b5477190a854bd Mon Sep 17 00:00:00 2001 From: Aleksandr Shinkarev Date: Tue, 25 Nov 2025 22:56:55 +0500 Subject: [PATCH 04/11] format: try to fail on unnecessary usings --- .editorconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.editorconfig b/.editorconfig index 4701ee2..b94de00 100644 --- a/.editorconfig +++ b/.editorconfig @@ -32,6 +32,9 @@ dotnet_separate_import_directive_groups = false dotnet_sort_system_directives_first = true file_header_template = unset +# no unnecessary usings +dotnet_diagnostic.IDE0005.severity = error + # this. and Me. preferences dotnet_style_qualification_for_event = false dotnet_style_qualification_for_field = false From fa1b865c917475aa53fb1f9252bc3924929c15ea Mon Sep 17 00:00:00 2001 From: Aleksandr Shinkarev Date: Tue, 25 Nov 2025 22:58:53 +0500 Subject: [PATCH 05/11] Revert "format: try to fail on unnecessary usings" This reverts commit b2723483869b5bc56a5ce66901b5477190a854bd. --- .editorconfig | 3 --- 1 file changed, 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index b94de00..4701ee2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -32,9 +32,6 @@ dotnet_separate_import_directive_groups = false dotnet_sort_system_directives_first = true file_header_template = unset -# no unnecessary usings -dotnet_diagnostic.IDE0005.severity = error - # this. and Me. preferences dotnet_style_qualification_for_event = false dotnet_style_qualification_for_field = false From b0a61b842e97744417c9e8659062b7205f4db07c Mon Sep 17 00:00:00 2001 From: akovylyaeva Date: Wed, 26 Nov 2025 10:52:13 +0500 Subject: [PATCH 06/11] chore: change ItemsController namespace --- Api/Features/Items/ItemsController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Api/Features/Items/ItemsController.cs b/Api/Features/Items/ItemsController.cs index b77100e..a80201b 100644 --- a/Api/Features/Items/ItemsController.cs +++ b/Api/Features/Items/ItemsController.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; -namespace Api.Features.Items.Handlers; +namespace Api.Features.Items; [Authorize] [ApiController] From 9096fc030e8e6a26874ebd0dee2a5565dce3a87a Mon Sep 17 00:00:00 2001 From: akovylyaeva Date: Wed, 26 Nov 2025 16:57:41 +0500 Subject: [PATCH 07/11] chore: remove Handlers folder --- Api/DependencyInjection.cs | 4 ++-- .../Items/{Handlers => }/CreateItem/CreateItemHandler.cs | 2 +- .../Items/{Handlers => }/CreateItem/CreateItemRequest.cs | 2 +- .../Items/{Handlers => }/CreateItem/CreateItemResponse.cs | 2 +- .../Items/{Handlers => }/GetAllItems/GetAllItemsHandler.cs | 2 +- .../Items/{Handlers => }/GetAllItems/HolderEmployeeMapper.cs | 2 +- .../{Handlers => }/GetAllItems/HolderEmployeeMapperTests.cs | 2 +- .../Items/{Handlers => }/GetAllItems/ItemsResponse.cs | 2 +- Api/Features/Items/ItemsController.cs | 4 ++-- 9 files changed, 11 insertions(+), 11 deletions(-) rename Api/Features/Items/{Handlers => }/CreateItem/CreateItemHandler.cs (95%) rename Api/Features/Items/{Handlers => }/CreateItem/CreateItemRequest.cs (91%) rename Api/Features/Items/{Handlers => }/CreateItem/CreateItemResponse.cs (63%) rename Api/Features/Items/{Handlers => }/GetAllItems/GetAllItemsHandler.cs (96%) rename Api/Features/Items/{Handlers => }/GetAllItems/HolderEmployeeMapper.cs (92%) rename Api/Features/Items/{Handlers => }/GetAllItems/HolderEmployeeMapperTests.cs (92%) rename Api/Features/Items/{Handlers => }/GetAllItems/ItemsResponse.cs (93%) diff --git a/Api/DependencyInjection.cs b/Api/DependencyInjection.cs index 8dfd436..8dd71a4 100644 --- a/Api/DependencyInjection.cs +++ b/Api/DependencyInjection.cs @@ -1,6 +1,6 @@ using Api.EnternalDeps.EmployeesApi; -using Api.Features.Items.Handlers.CreateItem; -using Api.Features.Items.Handlers.GetAllItems; +using Api.Features.Items.CreateItem; +using Api.Features.Items.GetAllItems; using Application; using Application.Commands; using Application.Queries; diff --git a/Api/Features/Items/Handlers/CreateItem/CreateItemHandler.cs b/Api/Features/Items/CreateItem/CreateItemHandler.cs similarity index 95% rename from Api/Features/Items/Handlers/CreateItem/CreateItemHandler.cs rename to Api/Features/Items/CreateItem/CreateItemHandler.cs index 907dee8..6246b54 100644 --- a/Api/Features/Items/Handlers/CreateItem/CreateItemHandler.cs +++ b/Api/Features/Items/CreateItem/CreateItemHandler.cs @@ -1,6 +1,6 @@ using Application.Commands; -namespace Api.Features.Items.Handlers.CreateItem; +namespace Api.Features.Items.CreateItem; public class CreateItemHandler { diff --git a/Api/Features/Items/Handlers/CreateItem/CreateItemRequest.cs b/Api/Features/Items/CreateItem/CreateItemRequest.cs similarity index 91% rename from Api/Features/Items/Handlers/CreateItem/CreateItemRequest.cs rename to Api/Features/Items/CreateItem/CreateItemRequest.cs index 7606e9f..bebc464 100644 --- a/Api/Features/Items/Handlers/CreateItem/CreateItemRequest.cs +++ b/Api/Features/Items/CreateItem/CreateItemRequest.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Api.Features.Items.Handlers.CreateItem; +namespace Api.Features.Items.CreateItem; public class CreateItemRequest { diff --git a/Api/Features/Items/Handlers/CreateItem/CreateItemResponse.cs b/Api/Features/Items/CreateItem/CreateItemResponse.cs similarity index 63% rename from Api/Features/Items/Handlers/CreateItem/CreateItemResponse.cs rename to Api/Features/Items/CreateItem/CreateItemResponse.cs index 5879b00..40467ea 100644 --- a/Api/Features/Items/Handlers/CreateItem/CreateItemResponse.cs +++ b/Api/Features/Items/CreateItem/CreateItemResponse.cs @@ -1,4 +1,4 @@ -namespace Api.Features.Items.Handlers.CreateItem; +namespace Api.Features.Items.CreateItem; public class CreateItemResponse { diff --git a/Api/Features/Items/Handlers/GetAllItems/GetAllItemsHandler.cs b/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs similarity index 96% rename from Api/Features/Items/Handlers/GetAllItems/GetAllItemsHandler.cs rename to Api/Features/Items/GetAllItems/GetAllItemsHandler.cs index e83f443..8f80075 100644 --- a/Api/Features/Items/Handlers/GetAllItems/GetAllItemsHandler.cs +++ b/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs @@ -2,7 +2,7 @@ using Api.Responses; using Application.Queries; -namespace Api.Features.Items.Handlers.GetAllItems; +namespace Api.Features.Items.GetAllItems; public class GetAllItemsHandler { diff --git a/Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapper.cs b/Api/Features/Items/GetAllItems/HolderEmployeeMapper.cs similarity index 92% rename from Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapper.cs rename to Api/Features/Items/GetAllItems/HolderEmployeeMapper.cs index 386011c..546c914 100644 --- a/Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapper.cs +++ b/Api/Features/Items/GetAllItems/HolderEmployeeMapper.cs @@ -1,6 +1,6 @@ using Api.EnternalDeps.EmployeesApi.Responses; -namespace Api.Features.Items.Handlers.GetAllItems; +namespace Api.Features.Items.GetAllItems; public class HolderEmployeeMapper { diff --git a/Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapperTests.cs b/Api/Features/Items/GetAllItems/HolderEmployeeMapperTests.cs similarity index 92% rename from Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapperTests.cs rename to Api/Features/Items/GetAllItems/HolderEmployeeMapperTests.cs index 7f02ef1..9ee567b 100644 --- a/Api/Features/Items/Handlers/GetAllItems/HolderEmployeeMapperTests.cs +++ b/Api/Features/Items/GetAllItems/HolderEmployeeMapperTests.cs @@ -1,7 +1,7 @@ using Api.EnternalDeps.EmployeesApi.Responses; using Xunit; -namespace Api.Features.Items.Handlers.GetAllItems; +namespace Api.Features.Items.GetAllItems; public class HolderEmployeeMapperTests { diff --git a/Api/Features/Items/Handlers/GetAllItems/ItemsResponse.cs b/Api/Features/Items/GetAllItems/ItemsResponse.cs similarity index 93% rename from Api/Features/Items/Handlers/GetAllItems/ItemsResponse.cs rename to Api/Features/Items/GetAllItems/ItemsResponse.cs index b0d6023..48763f2 100644 --- a/Api/Features/Items/Handlers/GetAllItems/ItemsResponse.cs +++ b/Api/Features/Items/GetAllItems/ItemsResponse.cs @@ -1,6 +1,6 @@ using Api.Responses; -namespace Api.Features.Items.Handlers.GetAllItems; +namespace Api.Features.Items.GetAllItems; public class ItemsResponse { diff --git a/Api/Features/Items/ItemsController.cs b/Api/Features/Items/ItemsController.cs index a80201b..905ec69 100644 --- a/Api/Features/Items/ItemsController.cs +++ b/Api/Features/Items/ItemsController.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -using Api.Features.Items.Handlers.CreateItem; -using Api.Features.Items.Handlers.GetAllItems; +using Api.Features.Items.CreateItem; +using Api.Features.Items.GetAllItems; using Application.Commands; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; From 956958f149e1f11d98913ee37b1a79f5367b7078 Mon Sep 17 00:00:00 2001 From: Aleksandr Shinkarev Date: Wed, 26 Nov 2025 17:55:59 +0500 Subject: [PATCH 08/11] fix!: rename ItemsResponse to GetAllItemsResponse to sync with the rest of naming convention --- Api/Features/Items/GetAllItems/GetAllItemsHandler.cs | 4 ++-- .../GetAllItems/{ItemsResponse.cs => GetAllItemsResponse.cs} | 2 +- Api/Features/Items/ItemsController.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename Api/Features/Items/GetAllItems/{ItemsResponse.cs => GetAllItemsResponse.cs} (95%) diff --git a/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs b/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs index 8f80075..f175317 100644 --- a/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs +++ b/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs @@ -18,13 +18,13 @@ EmployeesApi employeesApi _employeesApi = employeesApi; } - public async Task HandleAsync() + public async Task HandleAsync() { var items = await _allItemsQuery.GetAsync(); var allEmployeesResponse = await _employeesApi.GetAllEmployeesAsync(); - return new ItemsResponse + return new GetAllItemsResponse { Items = items .Select(x => new ItemDto diff --git a/Api/Features/Items/GetAllItems/ItemsResponse.cs b/Api/Features/Items/GetAllItems/GetAllItemsResponse.cs similarity index 95% rename from Api/Features/Items/GetAllItems/ItemsResponse.cs rename to Api/Features/Items/GetAllItems/GetAllItemsResponse.cs index 48763f2..207971d 100644 --- a/Api/Features/Items/GetAllItems/ItemsResponse.cs +++ b/Api/Features/Items/GetAllItems/GetAllItemsResponse.cs @@ -2,7 +2,7 @@ namespace Api.Features.Items.GetAllItems; -public class ItemsResponse +public class GetAllItemsResponse { public required List Items { get; set; } } diff --git a/Api/Features/Items/ItemsController.cs b/Api/Features/Items/ItemsController.cs index 905ec69..df2235c 100644 --- a/Api/Features/Items/ItemsController.cs +++ b/Api/Features/Items/ItemsController.cs @@ -18,7 +18,7 @@ public class ItemsController : ControllerBase /// [RequiresPermission(UserClaimsProvider.CanViewItems)] [HttpGet] - public Task GetAllItemsAsync( + public Task GetAllItemsAsync( [FromServices] GetAllItemsHandler getAllItemsHandler ) { From 388e95f82aefa0b9939338a8bf9c10afc98ef859 Mon Sep 17 00:00:00 2001 From: Aleksandr Shinkarev Date: Wed, 26 Nov 2025 19:07:41 +0500 Subject: [PATCH 09/11] format: fail lint when namespaces aren't in sync with folder names --- .editorconfig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.editorconfig b/.editorconfig index 4701ee2..b664d32 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,6 +4,13 @@ root = true # C# files [*.cs] +# this should be causing namespace missmatch to fail the linting workflow and it does +# however, auto fix of formatting accoring to this rule is broken since 2022 :( +# thus, it is validated but needs manual fix as for now +# https://github.com/dotnet/format/issues/1623 +dotnet_style_namespace_match_folder = true:warning +dotnet_diagnostic.IDE0130.severity = warning + #### Core EditorConfig Options #### # Indentation and spacing From e4a243b9983a763b41e93941b4bc1de55b5cb881 Mon Sep 17 00:00:00 2001 From: Aleksandr Shinkarev Date: Wed, 26 Nov 2025 19:08:23 +0500 Subject: [PATCH 10/11] refactor: fix EnternalDeps typo to ExternalDeps --- Api/DependencyInjection.cs | 2 +- .../EmployeesApi/EmployeesApi.cs | 4 ++-- .../EmployeesApi/Responses/EmployeesResponse.cs | 2 +- Api/{EnternalDeps => ExternalDeps}/ExternalDepsUrls.cs | 0 Api/Features/Items/GetAllItems/GetAllItemsHandler.cs | 2 +- Api/Features/Items/GetAllItems/HolderEmployeeMapper.cs | 2 +- Api/Features/Items/GetAllItems/HolderEmployeeMapperTests.cs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) rename Api/{EnternalDeps => ExternalDeps}/EmployeesApi/EmployeesApi.cs (94%) rename Api/{EnternalDeps => ExternalDeps}/EmployeesApi/Responses/EmployeesResponse.cs (86%) rename Api/{EnternalDeps => ExternalDeps}/ExternalDepsUrls.cs (100%) diff --git a/Api/DependencyInjection.cs b/Api/DependencyInjection.cs index 8dd71a4..771e2e8 100644 --- a/Api/DependencyInjection.cs +++ b/Api/DependencyInjection.cs @@ -1,4 +1,4 @@ -using Api.EnternalDeps.EmployeesApi; +using Api.ExternalDeps.EmployeesApi; using Api.Features.Items.CreateItem; using Api.Features.Items.GetAllItems; using Application; diff --git a/Api/EnternalDeps/EmployeesApi/EmployeesApi.cs b/Api/ExternalDeps/EmployeesApi/EmployeesApi.cs similarity index 94% rename from Api/EnternalDeps/EmployeesApi/EmployeesApi.cs rename to Api/ExternalDeps/EmployeesApi/EmployeesApi.cs index 7036fff..ad8b306 100644 --- a/Api/EnternalDeps/EmployeesApi/EmployeesApi.cs +++ b/Api/ExternalDeps/EmployeesApi/EmployeesApi.cs @@ -1,8 +1,8 @@ -using Api.EnternalDeps.EmployeesApi.Responses; +using Api.ExternalDeps.EmployeesApi.Responses; using Microsoft.Extensions.Options; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -namespace Api.EnternalDeps.EmployeesApi; +namespace Api.ExternalDeps.EmployeesApi; public class EmployeesApi { diff --git a/Api/EnternalDeps/EmployeesApi/Responses/EmployeesResponse.cs b/Api/ExternalDeps/EmployeesApi/Responses/EmployeesResponse.cs similarity index 86% rename from Api/EnternalDeps/EmployeesApi/Responses/EmployeesResponse.cs rename to Api/ExternalDeps/EmployeesApi/Responses/EmployeesResponse.cs index e4c693c..411123a 100644 --- a/Api/EnternalDeps/EmployeesApi/Responses/EmployeesResponse.cs +++ b/Api/ExternalDeps/EmployeesApi/Responses/EmployeesResponse.cs @@ -1,4 +1,4 @@ -namespace Api.EnternalDeps.EmployeesApi.Responses; +namespace Api.ExternalDeps.EmployeesApi.Responses; public class EmployeesResponse { diff --git a/Api/EnternalDeps/ExternalDepsUrls.cs b/Api/ExternalDeps/ExternalDepsUrls.cs similarity index 100% rename from Api/EnternalDeps/ExternalDepsUrls.cs rename to Api/ExternalDeps/ExternalDepsUrls.cs diff --git a/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs b/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs index f175317..4d20ba4 100644 --- a/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs +++ b/Api/Features/Items/GetAllItems/GetAllItemsHandler.cs @@ -1,4 +1,4 @@ -using Api.EnternalDeps.EmployeesApi; +using Api.ExternalDeps.EmployeesApi; using Api.Responses; using Application.Queries; diff --git a/Api/Features/Items/GetAllItems/HolderEmployeeMapper.cs b/Api/Features/Items/GetAllItems/HolderEmployeeMapper.cs index 546c914..0c3eb12 100644 --- a/Api/Features/Items/GetAllItems/HolderEmployeeMapper.cs +++ b/Api/Features/Items/GetAllItems/HolderEmployeeMapper.cs @@ -1,4 +1,4 @@ -using Api.EnternalDeps.EmployeesApi.Responses; +using Api.ExternalDeps.EmployeesApi.Responses; namespace Api.Features.Items.GetAllItems; diff --git a/Api/Features/Items/GetAllItems/HolderEmployeeMapperTests.cs b/Api/Features/Items/GetAllItems/HolderEmployeeMapperTests.cs index 9ee567b..af563f9 100644 --- a/Api/Features/Items/GetAllItems/HolderEmployeeMapperTests.cs +++ b/Api/Features/Items/GetAllItems/HolderEmployeeMapperTests.cs @@ -1,4 +1,4 @@ -using Api.EnternalDeps.EmployeesApi.Responses; +using Api.ExternalDeps.EmployeesApi.Responses; using Xunit; namespace Api.Features.Items.GetAllItems; From e14e045df60f425ce28d79dc9cd412fd2fb174c7 Mon Sep 17 00:00:00 2001 From: akovylyaeva Date: Thu, 27 Nov 2025 11:16:13 +0500 Subject: [PATCH 11/11] chore: change AddScoped to AddTransient --- Api/DependencyInjection.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Api/DependencyInjection.cs b/Api/DependencyInjection.cs index 771e2e8..ecd0766 100644 --- a/Api/DependencyInjection.cs +++ b/Api/DependencyInjection.cs @@ -39,7 +39,7 @@ public static void AddApplication(this IServiceCollection services, IConfigurati services.AddTransient(); services.AddTransient(); - services.AddScoped(); - services.AddScoped(); + services.AddTransient(); + services.AddTransient(); } }