Разбить модули Deal.Modules.* по назначению
Application проектов Discovery, Kanban, Pipeline, Settings, Tenants разделён на Abstractions/Exceptions/Extensions/Models/Registrars/Services; namespace приведён к путям, using потребителей мигрированы и дедуплицированы (169 файлов), cref/FQN обновлены.
This commit is contained in:
@@ -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_<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);
|
||||
}
|
||||
Reference in New Issue
Block a user