Files
amrez-nova-eop-services-api/AMREZ.EOP.Infrastructures/Tenancy/TenantProvisioner.cs
Thanakarn Klangkasame 92e614674c Init Git
2025-09-30 11:01:02 +07:00

39 lines
1.3 KiB
C#

using AMREZ.EOP.Abstractions.Applications.Tenancy;
using AMREZ.EOP.Abstractions.Applications.UseCases.Tenancy;
using AMREZ.EOP.Infrastructures.Data;
using AMREZ.EOP.Infrastructures.Options;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
namespace AMREZ.EOP.Infrastructures.Tenancy;
public sealed class TenantProvisioner : ITenantProvisioner
{
private readonly TenantMap _map;
private readonly ITenantDbContextFactory _factory;
private readonly IOptions<AuthOptions> _conn;
public TenantProvisioner(TenantMap map, ITenantDbContextFactory factory, IOptions<AuthOptions> conn)
{ _map = map; _factory = factory; _conn = conn; }
public async Task ProvisionAsync(string tenantKey, CancellationToken ct = default)
{
if (!_map.TryGetBySlug(tenantKey, out var ctx))
{
ctx = new TenantContext
{
Id = tenantKey,
Schema = tenantKey,
ConnectionString = _conn.Value.DefaultConnection,
Mode = AMREZ.EOP.Domain.Shared.Tenancy.TenantMode.Rls
};
_map.UpsertTenant(tenantKey, (TenantContext)ctx);
}
if (_conn.Value.UseSchemaPerTenant)
{
await using var db = _factory.Create<AppDbContext>(ctx);
await db.Database.MigrateAsync(ct); // idempotent
}
}
}