using Deal.Modules.Tenants.Application.Models; using Deal.SharedKernel.Tenants.Abstractions; using Deal.SharedKernel.Tenants.Models; using Deal.Modules.Tenants.Application.Abstractions; using Deal.Modules.Tenants.Application.Extensions; using Deal.Modules.Tenants.Application.Registrars; namespace Deal.Modules.Tenants.Application.Services; /// /// Прикладной сервис реестра тенантов: создание тенанта и его списка. /// /// Создание тенанта — единая транзакция по смыслу: запись в public.tenants и провижининг схемы. public sealed class TenantService(ITenantRepository tenantRepository, ITenantProvisioner tenantProvisioner) { /// /// Создаёт тенанта (id = новый Guid в формате "N") и провижинит его схему. /// /// Имя тенанта. /// Токен отмены. /// Идентификатор созданного тенанта (он же имя схемы tenant_<id>). public Task CreateTenantAsync(string name, CancellationToken ct) => CreateTenantAsync(name, Guid.NewGuid(), ct); /// /// Создаёт тенанта с явным id и провижинит его схему (bootstrap дефолтного тенанта, Ruling 8). /// /// Имя тенанта. /// Идентификатор тенанта (определяет имя схемы). /// Токен отмены. /// Идентификатор созданного тенанта (он же имя схемы tenant_<id>). public async Task CreateTenantAsync( string name, Guid id, CancellationToken ct) { await tenantRepository.CreateAsync( new TenantRecordDto( Id: id, Name: name, Status: TenantStatuses.Active, CreatedAt: DateTimeOffset.UtcNow), ct); var tenantIdValue = id.ToString("N"); await tenantProvisioner.ProvisionAsync(new TenantId(tenantIdValue), ct); return new TenantId(tenantIdValue); } /// /// Возвращает список всех тенантов. /// /// Токен отмены. /// Список тенантов. public Task> ListTenantsAsync(CancellationToken ct) => tenantRepository.ListAsync(ct); }