Files
Deal/src/core/Deal.Modules.Tenants/Application/Services/TenantService.cs
T
Rustam Khalimov e3a2692507 Добить структуру Api, Contracts, SharedKernel и сервисов
Deal.Api/Http -> Services/Models/Extensions; Contracts/Integrations
и SharedKernel/Tenants -> Abstractions/Models; extension-классы
telegram/ml -> Extensions. namespace/using/FQN мигрированы, using
дедуплицированы.
2026-09-11 13:25:18 +03:00

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_&lt;id&gt;).</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_&lt;id&gt;).</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);
}