Files
tiku-backend.net/Tiku.Infrastructure/TenantAdmin/DomainsAndEngagement/TenantDomainProviderService.cs
xiong 33375a38d7
Some checks failed
ci / release-gate (push) Has been cancelled
refactor(architecture): harden module boundaries
2026-08-04 12:10:36 +08:00

112 lines
4.6 KiB
C#

using System.Text.Json;
using Microsoft.EntityFrameworkCore;
using Tiku.Application.Catalog;
using Tiku.Application.Content;
using Tiku.Application.Notifications;
using Tiku.Application.Tenancy;
using Tiku.Application.TenantAdmin;
using Tiku.Domain.Learning;
using Tiku.Domain.Operations;
using Tiku.Domain.Tenancy;
using Tiku.Infrastructure.Security;
using Tiku.Infrastructure.Tenancy;
namespace Tiku.Infrastructure.TenantAdmin;
internal sealed class TenantDomainProviderService(TenantAdminServiceDependencies dependencies)
: TenantAdminServiceBase(dependencies), ITenantDomainProviderService
{
public async Task<CatalogList<TenantDomainItem>> GetDomainsAsync(
TenantAdminActor actor,
CancellationToken cancellationToken = default)
{
await RequireAllDataScopeAsync(actor, cancellationToken);
var items = await tenancyPersistence.TenantDomains.AsNoTracking()
.Where(item => item.TenantId == actor.TenantId)
.OrderByDescending(item => item.IsPrimary)
.ThenBy(item => item.CreatedAt)
.Select(item => ToDomainItem(item))
.ToArrayAsync(cancellationToken);
return new CatalogList<TenantDomainItem>(items);
}
public async Task<ContentManagementResult<TenantDomainItem>> CreateDomainAsync(
TenantAdminActor actor,
CreateTenantDomainCommand command,
CancellationToken cancellationToken = default)
{
await RequireAllDataScopeAsync(actor, cancellationToken);
TenantDomain generated;
try
{
generated = TenantDomainProvisioning.CreatePrimary(actor.TenantId, command.Host);
}
catch (ArgumentException exception)
{
throw new TenantAdminDirectException(exception.Message, "invalid_domain_host");
}
var host = generated.Host;
if (command.IsPrimary)
{
var primaryDomains = await tenancyPersistence.TenantDomains
.Where(item => item.TenantId == actor.TenantId && item.IsPrimary)
.ToArrayAsync(cancellationToken);
foreach (var domain in primaryDomains) domain.IsPrimary = false;
}
var item = new TenantDomain
{
TenantId = actor.TenantId,
Host = host,
DomainType = ParseEnum(command.DomainType, TenantDomainType.Custom, "invalid_domain_type"),
Status = TenantDomainStatus.Pending,
IsPrimary = command.IsPrimary,
VerificationToken = generated.VerificationToken
};
tenancyPersistence.TenantDomains.Add(item);
await AddAuditAsync(actor, "tenant.domain.created", "tenant_domains", item.Id, cancellationToken);
await unitOfWork.SaveChangesAsync(cancellationToken);
return new ContentManagementResult<TenantDomainItem>(ToDomainItem(item));
}
public async Task<CatalogList<TenantIdentityProviderItem>> GetAuthProvidersAsync(
TenantAdminActor actor,
CancellationToken cancellationToken = default)
{
await RequireAllDataScopeAsync(actor, cancellationToken);
var items = await providerConfigService.GetProvidersAsync(
actor.TenantId,
TenantExternalProviderCapability.Identity,
cancellationToken: cancellationToken);
return new CatalogList<TenantIdentityProviderItem>(items.Select(ToAuthProviderItem).ToArray());
}
public async Task<ContentManagementResult<TenantIdentityProviderItem>> UpsertAuthProviderAsync(
TenantAdminActor actor,
UpsertTenantIdentityProviderCommand command,
CancellationToken cancellationToken = default)
{
await RequireAllDataScopeAsync(actor, cancellationToken);
ArgumentException.ThrowIfNullOrWhiteSpace(command.Provider);
var item = await providerConfigService.UpsertProviderAsync(
actor.TenantId,
new UpsertTenantExternalProviderCommand(
TenantExternalProviderCapability.Identity,
command.Provider,
ParseEnum(command.Status, TenantExternalProviderStatus.Disabled, "invalid_auth_provider_status"),
command.DisplayName,
command.SecretRef,
command.Priority,
command.ConfigPublic,
JsonObjectOrDefault(default)),
cancellationToken);
await AddAuditAsync(actor, "tenant.auth_provider.upserted", "tenant_external_providers", item.Id,
cancellationToken);
await unitOfWork.SaveChangesAsync(cancellationToken);
return new ContentManagementResult<TenantIdentityProviderItem>(ToAuthProviderItem(item));
}
}