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]