Deal.Api/Http -> Services/Models/Extensions; Contracts/Integrations и SharedKernel/Tenants -> Abstractions/Models; extension-классы telegram/ml -> Extensions. namespace/using/FQN мигрированы, using дедуплицированы.
58 lines
2.7 KiB
C#
58 lines
2.7 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// Прикладной сервис реестра тенантов: создание тенанта и его списка.
|
|
/// </summary>
|
|
/// <remarks>Создание тенанта — единая транзакция по смыслу: запись в public.tenants и провижининг схемы.</remarks>
|
|
public sealed class TenantService(ITenantRepository tenantRepository, ITenantProvisioner tenantProvisioner)
|
|
{
|
|
/// <summary>
|
|
/// Создаёт тенанта (id = новый Guid в формате "N") и провижинит его схему.
|
|
/// </summary>
|
|
/// <param name="name">Имя тенанта.</param>
|
|
/// <param name="ct">Токен отмены.</param>
|
|
/// <returns>Идентификатор созданного тенанта (он же имя схемы tenant_<id>).</returns>
|
|
public Task<TenantId> CreateTenantAsync(string name, CancellationToken ct) =>
|
|
CreateTenantAsync(name, Guid.NewGuid(), ct);
|
|
|
|
/// <summary>
|
|
/// Создаёт тенанта с явным id и провижинит его схему (bootstrap дефолтного тенанта, Ruling 8).
|
|
/// </summary>
|
|
/// <param name="name">Имя тенанта.</param>
|
|
/// <param name="id">Идентификатор тенанта (определяет имя схемы).</param>
|
|
/// <param name="ct">Токен отмены.</param>
|
|
/// <returns>Идентификатор созданного тенанта (он же имя схемы tenant_<id>).</returns>
|
|
public async Task<TenantId> 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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Возвращает список всех тенантов.
|
|
/// </summary>
|
|
/// <param name="ct">Токен отмены.</param>
|
|
/// <returns>Список тенантов.</returns>
|
|
public Task<IReadOnlyList<TenantRecordDto>> ListTenantsAsync(CancellationToken ct) =>
|
|
tenantRepository.ListAsync(ct);
|
|
}
|