Разбить модули Deal.Modules.* по назначению

Application проектов Discovery, Kanban, Pipeline, Settings, Tenants
разделён на Abstractions/Exceptions/Extensions/Models/Registrars/Services;
namespace приведён к путям, using потребителей мигрированы и
дедуплицированы (169 файлов), cref/FQN обновлены.
This commit is contained in:
Rustam Khalimov
2026-09-11 13:18:14 +03:00
parent 31c434ed93
commit cd0b3b606b
356 changed files with 14436 additions and 12906 deletions
@@ -0,0 +1,53 @@
using Deal.Modules.Tenants.Application.Models;
using Deal.SharedKernel.Tenants;
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);
}