Files
tiku-backend.net/Tiku.Infrastructure/Tenancy/PublicTenantConfigurationQuery.cs

47 lines
2.1 KiB
C#

using Microsoft.EntityFrameworkCore;
using Tiku.Application.Tenancy;
using Tiku.Domain.Common;
using Tiku.Domain.Operations;
using Tiku.Domain.Tenancy;
using Tiku.Infrastructure.Persistence;
namespace Tiku.Infrastructure.Tenancy;
internal sealed class PublicTenantConfigurationQuery(TikuDbContext dbContext)
: IPublicTenantConfigurationQuery
{
public async Task<PublicTenantConfiguration> GetAsync(
Guid tenantId,
CancellationToken cancellationToken = default)
{
var branding = await dbContext.TenantBrandings.AsNoTracking()
.SingleOrDefaultAsync(item => item.TenantId == tenantId, cancellationToken);
var settings = await dbContext.TenantSettings.AsNoTracking()
.SingleOrDefaultAsync(item => item.TenantId == tenantId, cancellationToken);
var theme = await dbContext.TenantThemeConfigs.AsNoTracking()
.SingleOrDefaultAsync(
item => item.TenantId == tenantId && item.Status == TenantThemeConfigStatus.Published,
cancellationToken);
return new PublicTenantConfiguration(
branding?.BrandName,
branding?.ShortName,
branding?.Slogan,
branding?.LogoUrl,
branding?.FaviconUrl,
branding?.ServiceWechat,
branding?.ServiceAccountName,
IsNonEmptyObject(theme?.ActiveTheme) ? theme!.ActiveTheme.Clone() : CloneOrDefault(branding?.Theme),
IsNonEmptyObject(theme?.ActivePublicAssets) ? theme!.ActivePublicAssets.Clone() : CloneOrDefault(branding?.PublicAssets),
CloneOrDefault(settings?.FeatureFlags),
CloneOrDefault(settings?.AdminFeatureFlags),
CloneOrDefault(settings?.PublicConfig));
}
private static bool IsNonEmptyObject(System.Text.Json.JsonElement? value) =>
value is { ValueKind: System.Text.Json.JsonValueKind.Object } json && json.EnumerateObject().Any();
private static System.Text.Json.JsonElement CloneOrDefault(System.Text.Json.JsonElement? value) =>
value.HasValue ? value.Value.Clone() : JsonDefaults.Object();
}