From 75de70e09cebff3fc8c3870f3d40d83923f703db Mon Sep 17 00:00:00 2001 From: stepan Date: Sun, 13 Sep 2026 18:49:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=C2=AB=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=B9=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=C2=BB=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D1=83=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TenantAdminService.GetAsync бросает NotFoundException вместо null; эндпоинт деталей без 404-проверки. --- .../Endpoints/OperatorTenantsEndpoints.cs | 7 +------ .../Application/Services/TenantAdminService.cs | 16 +++++++++------- .../Modules/Tenants/TenantAdminServiceTests.cs | 8 +++++--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/core/Deal.Api/Endpoints/OperatorTenantsEndpoints.cs b/src/core/Deal.Api/Endpoints/OperatorTenantsEndpoints.cs index bafc30c..73f8f05 100644 --- a/src/core/Deal.Api/Endpoints/OperatorTenantsEndpoints.cs +++ b/src/core/Deal.Api/Endpoints/OperatorTenantsEndpoints.cs @@ -144,12 +144,7 @@ public static class OperatorTenantsEndpoints return EndpointResults.Unauthorized(AuthHelpers.OperatorUnauthorizedDetail); } - TenantDetailDto? tenant = await tenantAdminService.GetAsync(id, ct); - if (tenant is null) - { - return EndpointResults.NotFound(TenantNotFoundDetail); - } - + TenantDetailDto tenant = await tenantAdminService.GetAsync(id, ct); return Results.Ok(tenant); } diff --git a/src/core/Deal.Modules.Tenants/Application/Services/TenantAdminService.cs b/src/core/Deal.Modules.Tenants/Application/Services/TenantAdminService.cs index 7a4a553..70ec5f5 100644 --- a/src/core/Deal.Modules.Tenants/Application/Services/TenantAdminService.cs +++ b/src/core/Deal.Modules.Tenants/Application/Services/TenantAdminService.cs @@ -1,6 +1,7 @@ using Deal.Modules.Tenants.Application.Abstractions; using Deal.Modules.Tenants.Application.Models; using Deal.SharedKernel; +using Deal.SharedKernel.Errors; using Deal.SharedKernel.Utilities; namespace Deal.Modules.Tenants.Application.Services; @@ -17,6 +18,9 @@ public sealed class TenantAdminService( // Случайные байты одноразового пароля владельца: 12 → ровно 16 символов Base64Url (как InviteCodeGenerator). private const int InitialPasswordRandomByteCount = 12; + // Имя сущности для текста ошибки «не найдено» (пользователь = тенант с его окружением). + private const string TenantEntityName = "Пользователь"; + /// /// Создаёт тенанта оператором /// @@ -103,14 +107,12 @@ public sealed class TenantAdminService( /// Детали тенанта с пользователями /// /// Идентификатор тенанта. - /// Детали и пользователи тенанта (по CreatedAt) или null, если тенанта нет. - public async Task GetAsync(Guid id, CancellationToken ct) + /// Детали и пользователи тенанта (по CreatedAt). + /// Тенант не найден. + public async Task GetAsync(Guid id, CancellationToken ct) { - var tenant = await tenantRepository.FindByIdAsync(id, ct); - if (tenant is null) - { - return null; - } + var tenant = await tenantRepository.FindByIdAsync(id, ct) + ?? throw new NotFoundException(TenantEntityName, id.ToString("N")); IReadOnlyList users = await authStore.ListUsersByTenantIdAsync(id, ct); return new TenantDetailDto(tenant.Id, tenant.Name, tenant.Status, tenant.CreatedAt, users); diff --git a/src/core/tests/Deal.Tests.Unit/Modules/Tenants/TenantAdminServiceTests.cs b/src/core/tests/Deal.Tests.Unit/Modules/Tenants/TenantAdminServiceTests.cs index e0cb343..111639f 100644 --- a/src/core/tests/Deal.Tests.Unit/Modules/Tenants/TenantAdminServiceTests.cs +++ b/src/core/tests/Deal.Tests.Unit/Modules/Tenants/TenantAdminServiceTests.cs @@ -1,7 +1,8 @@ +using Deal.Modules.Tenants.Application.Abstractions; using Deal.Modules.Tenants.Application.Models; using Deal.Modules.Tenants.Application.Services; +using Deal.SharedKernel.Errors; using Deal.Tests.Unit.Support; -using Deal.Modules.Tenants.Application.Abstractions; namespace Deal.Tests.Unit.Modules.Tenants; @@ -148,11 +149,12 @@ public sealed class TenantAdminServiceTests } [Fact] - public async Task GetAsync_ForUnknownTenant_ReturnsNull() + public async Task GetAsync_ForUnknownTenant_ThrowsNotFound() { var service = NewService(new TestTenantStore(), new TestAuthStore()); - Assert.Null(await service.GetAsync(Guid.NewGuid(), CancellationToken.None)); + await Assert.ThrowsAsync( + () => service.GetAsync(Guid.NewGuid(), CancellationToken.None)); } [Fact]