Files
tiku-backend.net/Tiku.Api/Configuration/TenantProvisioningStartupValidator.cs
xiong c497a3ca8d
Some checks failed
ci / release-gate (push) Has been cancelled
清理代码
2026-08-03 12:31:39 +08:00

54 lines
2.3 KiB
C#

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Tiku.Application.PlatformAdmin;
using Tiku.Application.Security;
using Tiku.Domain.Platform;
using Tiku.Infrastructure.Persistence;
namespace Tiku.Api.Configuration;
internal sealed class TenantProvisioningStartupValidator(
ITenantExecutionScope tenantExecutionScope,
IOptions<TenantProvisioningOptions> options,
ILogger<TenantProvisioningStartupValidator> logger) : IHostedService
{
public async Task StartAsync(CancellationToken cancellationToken)
{
var offeringCode = options.Value.DefaultBaseOfferingCode.Trim().ToLowerInvariant();
var available = await tenantExecutionScope.ExecuteAsync(
new SystemScopeRequest(
null,
SystemScopeCallerType.Platform,
nameof(TenantProvisioningStartupValidator),
"Validate the production default tenant offering",
Guid.NewGuid().ToString("N"),
true),
async (services, token) =>
{
var dbContext = services.GetRequiredService<TikuDbContext>();
var now = DateTimeOffset.UtcNow;
return await (
from offering in dbContext.SaasOfferings.AsNoTracking()
join version in dbContext.SaasOfferingVersions.AsNoTracking()
on offering.Id equals version.OfferingId
where offering.Code == offeringCode &&
offering.Type == SaasOfferingType.BasePlan &&
offering.Status == SaasOfferingStatus.Active &&
version.Status == SaasOfferingVersionStatus.Published &&
(version.EffectiveAt == null || version.EffectiveAt <= now)
select version.Id).AnyAsync(token);
},
cancellationToken);
if (!available)
throw new InvalidOperationException(
$"TenantProvisioning:DefaultBaseOfferingCode '{offeringCode}' does not resolve to an effective published base offering version.");
logger.LogInformation("Validated default tenant provisioning offering {OfferingCode}", offeringCode);
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}