From 5990b17b4c7ba6da665bbe0a018a2074e1eb11d5 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 22 Jun 2025 20:09:52 +0800 Subject: [PATCH] :sparkles: Subscription status validation on profile --- .../Wallet/SubscriptionRenewalJob.cs | 78 +++++++++++++++++-- 1 file changed, 71 insertions(+), 7 deletions(-) diff --git a/DysonNetwork.Sphere/Wallet/SubscriptionRenewalJob.cs b/DysonNetwork.Sphere/Wallet/SubscriptionRenewalJob.cs index fd54867..2ef632f 100644 --- a/DysonNetwork.Sphere/Wallet/SubscriptionRenewalJob.cs +++ b/DysonNetwork.Sphere/Wallet/SubscriptionRenewalJob.cs @@ -41,11 +41,12 @@ public class SubscriptionRenewalJob( logger.LogInformation("Found {TotalSubscriptions} subscriptions due for renewal", totalSubscriptions); foreach (var subscription in subscriptionsToRenew) - { + { try { processedCount++; - logger.LogDebug("Processing renewal for subscription {SubscriptionId} (Identifier: {Identifier}) for account {AccountId}", + logger.LogDebug( + "Processing renewal for subscription {SubscriptionId} (Identifier: {Identifier}) for account {AccountId}", subscription.Id, subscription.Identifier, subscription.AccountId); // Calculate next cycle duration based on current cycle @@ -72,7 +73,7 @@ public class SubscriptionRenewalJob( { var wallet = await walletService.GetWalletAsync(subscription.AccountId); if (wallet is null) continue; - + // Process automatic payment from wallet await paymentService.PayOrderAsync(order.Id, wallet.Id); @@ -90,14 +91,15 @@ public class SubscriptionRenewalJob( catch (Exception ex) { // If auto-payment fails, mark for manual payment - logger.LogWarning(ex, "Failed to auto-renew subscription {SubscriptionId} with wallet payment", subscription.Id); + logger.LogWarning(ex, "Failed to auto-renew subscription {SubscriptionId} with wallet payment", + subscription.Id); failedCount++; } } else { // For other payment methods, mark as pending payment - logger.LogInformation("Subscription {SubscriptionId} requires manual payment via {PaymentMethod}", + logger.LogInformation("Subscription {SubscriptionId} requires manual payment via {PaymentMethod}", subscription.Id, subscription.PaymentMethod); failedCount++; } @@ -117,7 +119,69 @@ public class SubscriptionRenewalJob( } } - logger.LogInformation("Completed subscription renewal job. Processed: {ProcessedCount}, Renewed: {RenewedCount}, Failed: {FailedCount}", + logger.LogInformation( + "Completed subscription renewal job. Processed: {ProcessedCount}, Renewed: {RenewedCount}, Failed: {FailedCount}", processedCount, renewedCount, failedCount); + + logger.LogInformation("Validating user stellar memberships..."); + + // Get all account IDs with StellarMembership + var accountsWithMemberships = await db.AccountProfiles + .Where(a => a.StellarMembership != null) + .Select(a => new { a.Id, a.StellarMembership }) + .ToListAsync(); + + logger.LogInformation("Found {Count} accounts with stellar memberships to validate", + accountsWithMemberships.Count); + + if (accountsWithMemberships.Count == 0) + { + logger.LogInformation("No stellar memberships found to validate"); + return; + } + + // Get all subscription IDs from StellarMemberships + var memberships = accountsWithMemberships + .Where(a => a.StellarMembership != null) + .Select(a => a.StellarMembership) + .Distinct() + .ToList(); + var membershipIds = memberships.Select(m => m!.Id).ToList(); + + // Get all valid subscriptions in a single query + var validSubscriptions = await db.WalletSubscriptions + .Where(s => membershipIds.Contains(s.Id)) + .Where(s => s.IsActive) + .Where(s => !s.EndedAt.HasValue || s.EndedAt.Value > now) + .Select(s => s.Id) + .ToListAsync(); + + // Identify accounts that need updating (membership expired or not in validSubscriptions) + var accountIdsToUpdate = accountsWithMemberships + .Where(a => a.StellarMembership != null && ( + (a.StellarMembership.EndedAt.HasValue && a.StellarMembership.EndedAt.Value <= now) || + !validSubscriptions.Contains(a.StellarMembership.Id) + )) + .Select(a => a.Id) + .ToList(); + + // Log the IDs that will be updated for debugging + logger.LogDebug("Accounts with expired or invalid memberships: {AccountIds}", + string.Join(", ", accountIdsToUpdate)); + + if (accountIdsToUpdate.Count == 0) + { + logger.LogInformation("No expired/invalid stellar memberships found"); + return; + } + + // Update all accounts in a single batch operation + var updatedCount = await db.AccountProfiles + .Where(a => accountIdsToUpdate.Contains(a.Id)) + .ExecuteUpdateAsync(s => s + .SetProperty(a => a.StellarMembership, p => null) + ); + + logger.LogInformation("Updated {Count} accounts with expired/invalid stellar memberships", updatedCount); } -} +} \ No newline at end of file