forked from gongxuegit/tiku-backend.net
refactor: consolidate backend into modular monolith
This commit is contained in:
@@ -6,7 +6,6 @@ using Tiku.Application.Security;
|
||||
using Tiku.Domain.Operations;
|
||||
using Tiku.Domain.Platform;
|
||||
using Tiku.Infrastructure.Persistence;
|
||||
using Tiku.Infrastructure.Messaging;
|
||||
|
||||
namespace Tiku.Infrastructure.PlatformBilling;
|
||||
|
||||
@@ -142,13 +141,6 @@ internal sealed class PlatformBillingAdminService(
|
||||
await db.SaveChangesAsync(token);
|
||||
await services.GetRequiredService<ITenantFeatureCacheInvalidator>()
|
||||
.InvalidateAsync(command.TenantId, token);
|
||||
await services.GetRequiredService<ISecurityEventPublisher>().CapabilityChangedAsync(
|
||||
command.TenantId,
|
||||
featureCode,
|
||||
"tenant_feature_override_changed",
|
||||
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
|
||||
$"tenant-feature-override-{item.Id:N}",
|
||||
token);
|
||||
return item;
|
||||
}, cancellationToken);
|
||||
|
||||
|
||||
@@ -7,13 +7,11 @@ using Tiku.Domain.Platform;
|
||||
using Tiku.Domain.Common;
|
||||
using Tiku.Domain.Tenancy;
|
||||
using Tiku.Infrastructure.Persistence;
|
||||
using Tiku.Infrastructure.Messaging;
|
||||
|
||||
namespace Tiku.Infrastructure.PlatformBilling;
|
||||
|
||||
internal sealed class PlatformBillingSettlementService(
|
||||
TikuDbContext dbContext,
|
||||
ISecurityEventPublisher securityEventPublisher,
|
||||
ITenantFeatureCacheInvalidator featureCacheInvalidator) : IPlatformBillingSettlementService
|
||||
{
|
||||
public async Task<PlatformBillingPayment> MarkPaidAsync(
|
||||
@@ -80,10 +78,6 @@ internal sealed class PlatformBillingSettlementService(
|
||||
var subscription = await dbContext.TenantSaasSubscriptions
|
||||
.OrderByDescending(value => value.UpdatedAt)
|
||||
.FirstOrDefaultAsync(value => value.TenantId == order.TenantId, cancellationToken);
|
||||
var oldFeatures = subscription is null
|
||||
? []
|
||||
: await LoadSubscriptionFeaturesAsync(subscription, cancellationToken);
|
||||
|
||||
var now = paidAt;
|
||||
if (subscription is null)
|
||||
{
|
||||
@@ -204,41 +198,9 @@ internal sealed class PlatformBillingSettlementService(
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
await featureCacheInvalidator.InvalidateAsync(order.TenantId, cancellationToken);
|
||||
|
||||
var newFeatures = await LoadSubscriptionFeaturesAsync(subscription, cancellationToken);
|
||||
var changedFeatures = oldFeatures.Concat(newFeatures).Distinct(StringComparer.Ordinal).ToArray();
|
||||
var version = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
foreach (var featureCode in changedFeatures)
|
||||
{
|
||||
await securityEventPublisher.CapabilityChangedAsync(
|
||||
order.TenantId,
|
||||
featureCode,
|
||||
"saas_subscription_changed",
|
||||
version,
|
||||
$"platform-billing-order-{order.Id:N}",
|
||||
cancellationToken);
|
||||
}
|
||||
|
||||
return payment;
|
||||
}
|
||||
|
||||
private async Task<string[]> LoadSubscriptionFeaturesAsync(TenantSaasSubscription subscription, CancellationToken cancellationToken)
|
||||
{
|
||||
var versionIds = await dbContext.TenantSaasSubscriptionItems.AsNoTracking()
|
||||
.Where(value => value.TenantId == subscription.TenantId && value.SubscriptionId == subscription.Id &&
|
||||
value.Status == TenantSaasSubscriptionItemStatus.Active)
|
||||
.Select(value => value.OfferingVersionId)
|
||||
.ToArrayAsync(cancellationToken);
|
||||
if (!versionIds.Contains(subscription.BaseOfferingVersionId))
|
||||
{
|
||||
versionIds = [.. versionIds, subscription.BaseOfferingVersionId];
|
||||
}
|
||||
return await dbContext.SaasOfferingVersionFeatures.AsNoTracking()
|
||||
.Where(value => versionIds.Contains(value.OfferingVersionId))
|
||||
.Select(value => value.FeatureCode)
|
||||
.Distinct()
|
||||
.ToArrayAsync(cancellationToken);
|
||||
}
|
||||
|
||||
private async Task<JsonElement> LoadBillingProfileSnapshotAsync(Guid tenantId, CancellationToken cancellationToken)
|
||||
{
|
||||
var profile = await dbContext.TenantBillingProfiles.AsNoTracking()
|
||||
|
||||
@@ -8,7 +8,6 @@ using Tiku.Application.Tenancy;
|
||||
using Tiku.Domain.Operations;
|
||||
using Tiku.Domain.Platform;
|
||||
using Tiku.Domain.Tenancy;
|
||||
using Tiku.Infrastructure.Messaging;
|
||||
using Tiku.Infrastructure.Persistence;
|
||||
|
||||
namespace Tiku.Infrastructure.PlatformBilling;
|
||||
@@ -93,7 +92,6 @@ internal sealed class SaasSubscriptionLifecycleService(
|
||||
|
||||
var previousStatus = subscription.Status;
|
||||
var previousBaseVersionId = subscription.BaseOfferingVersionId;
|
||||
var oldFeatures = await LoadFeaturesAsync(dbContext, subscription, cancellationToken);
|
||||
var items = await dbContext.TenantSaasSubscriptionItems
|
||||
.Where(value => value.TenantId == tenantId && value.SubscriptionId == subscription.Id)
|
||||
.ToArrayAsync(cancellationToken);
|
||||
@@ -209,23 +207,6 @@ internal sealed class SaasSubscriptionLifecycleService(
|
||||
await services.GetRequiredService<ITenantFeatureCacheInvalidator>()
|
||||
.InvalidateAsync(tenantId, cancellationToken);
|
||||
|
||||
var newFeatures = await LoadFeaturesAsync(dbContext, subscription, cancellationToken);
|
||||
var changedFeatures = oldFeatures.Concat(newFeatures).Distinct(StringComparer.Ordinal).ToArray();
|
||||
var eventPublisher = services.GetRequiredService<ISecurityEventPublisher>();
|
||||
var eventVersion = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
var correlationId = $"saas-subscription-{subscription.Id:N}-lifecycle-{subscription.LifecycleVersion}";
|
||||
foreach (var featureCode in changedFeatures)
|
||||
{
|
||||
await eventPublisher.CapabilityChangedAsync(
|
||||
tenantId,
|
||||
featureCode,
|
||||
transition,
|
||||
eventVersion,
|
||||
correlationId,
|
||||
cancellationToken);
|
||||
}
|
||||
await services.GetRequiredService<ITenantRuntimeCacheInvalidator>()
|
||||
.InvalidateAsync(tenantId, cancellationToken);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -251,26 +232,4 @@ internal sealed class SaasSubscriptionLifecycleService(
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task<string[]> LoadFeaturesAsync(
|
||||
TikuDbContext dbContext,
|
||||
TenantSaasSubscription subscription,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var versionIds = await dbContext.TenantSaasSubscriptionItems.AsNoTracking()
|
||||
.Where(value =>
|
||||
value.TenantId == subscription.TenantId &&
|
||||
value.SubscriptionId == subscription.Id &&
|
||||
value.Status == TenantSaasSubscriptionItemStatus.Active)
|
||||
.Select(value => value.OfferingVersionId)
|
||||
.ToArrayAsync(cancellationToken);
|
||||
if (!versionIds.Contains(subscription.BaseOfferingVersionId))
|
||||
{
|
||||
versionIds = [.. versionIds, subscription.BaseOfferingVersionId];
|
||||
}
|
||||
return await dbContext.SaasOfferingVersionFeatures.AsNoTracking()
|
||||
.Where(value => versionIds.Contains(value.OfferingVersionId))
|
||||
.Select(value => value.FeatureCode)
|
||||
.Distinct()
|
||||
.ToArrayAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user