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);
}