🐛 Fix subscription gift
This commit is contained in:
@@ -53,32 +53,10 @@ public class BroadcastEventHandler(
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Handle subscription orders
|
// Handle subscription orders
|
||||||
if (evt.ProductIdentifier.StartsWith(SubscriptionType.StellarProgram))
|
if (
|
||||||
{
|
evt.ProductIdentifier.StartsWith(SubscriptionType.StellarProgram) &&
|
||||||
logger.LogInformation("Handling stellar program order: {OrderId}", evt.OrderId);
|
evt.Meta?.TryGetValue("gift_id", out var giftIdValue) == true
|
||||||
|
)
|
||||||
await using var scope = serviceProvider.CreateAsyncScope();
|
|
||||||
var db = scope.ServiceProvider.GetRequiredService<AppDatabase>();
|
|
||||||
var subscriptions = scope.ServiceProvider.GetRequiredService<SubscriptionService>();
|
|
||||||
|
|
||||||
var order = await db.PaymentOrders.FindAsync(
|
|
||||||
[evt.OrderId],
|
|
||||||
cancellationToken: stoppingToken
|
|
||||||
);
|
|
||||||
if (order is null)
|
|
||||||
{
|
|
||||||
logger.LogWarning("Order with ID {OrderId} not found. Redelivering.", evt.OrderId);
|
|
||||||
await msg.NakAsync(cancellationToken: stoppingToken);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
await subscriptions.HandleSubscriptionOrder(order);
|
|
||||||
|
|
||||||
logger.LogInformation("Subscription for order {OrderId} handled successfully.", evt.OrderId);
|
|
||||||
await msg.AckAsync(cancellationToken: stoppingToken);
|
|
||||||
}
|
|
||||||
// Handle gift orders
|
|
||||||
else if (evt.Meta?.TryGetValue("gift_id", out var giftIdValue) == true)
|
|
||||||
{
|
{
|
||||||
logger.LogInformation("Handling gift order: {OrderId}", evt.OrderId);
|
logger.LogInformation("Handling gift order: {OrderId}", evt.OrderId);
|
||||||
|
|
||||||
@@ -102,6 +80,30 @@ public class BroadcastEventHandler(
|
|||||||
logger.LogInformation("Gift for order {OrderId} handled successfully.", evt.OrderId);
|
logger.LogInformation("Gift for order {OrderId} handled successfully.", evt.OrderId);
|
||||||
await msg.AckAsync(cancellationToken: stoppingToken);
|
await msg.AckAsync(cancellationToken: stoppingToken);
|
||||||
}
|
}
|
||||||
|
else if (evt.ProductIdentifier.StartsWith(SubscriptionType.StellarProgram))
|
||||||
|
{
|
||||||
|
logger.LogInformation("Handling stellar program order: {OrderId}", evt.OrderId);
|
||||||
|
|
||||||
|
await using var scope = serviceProvider.CreateAsyncScope();
|
||||||
|
var db = scope.ServiceProvider.GetRequiredService<AppDatabase>();
|
||||||
|
var subscriptions = scope.ServiceProvider.GetRequiredService<SubscriptionService>();
|
||||||
|
|
||||||
|
var order = await db.PaymentOrders.FindAsync(
|
||||||
|
[evt.OrderId],
|
||||||
|
cancellationToken: stoppingToken
|
||||||
|
);
|
||||||
|
if (order is null)
|
||||||
|
{
|
||||||
|
logger.LogWarning("Order with ID {OrderId} not found. Redelivering.", evt.OrderId);
|
||||||
|
await msg.NakAsync(cancellationToken: stoppingToken);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
await subscriptions.HandleSubscriptionOrder(order);
|
||||||
|
|
||||||
|
logger.LogInformation("Subscription for order {OrderId} handled successfully.", evt.OrderId);
|
||||||
|
await msg.AckAsync(cancellationToken: stoppingToken);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Not a subscription or gift order, skip
|
// Not a subscription or gift order, skip
|
||||||
|
@@ -662,33 +662,7 @@ public class SubscriptionService(
|
|||||||
db.WalletGifts.Add(gift);
|
db.WalletGifts.Add(gift);
|
||||||
await db.SaveChangesAsync();
|
await db.SaveChangesAsync();
|
||||||
|
|
||||||
// Create order and process payment
|
gift.Gifter = gifter;
|
||||||
var order = await payment.CreateOrderAsync(
|
|
||||||
null, // No specific payee wallet for gifts
|
|
||||||
subscriptionInfo.Currency,
|
|
||||||
finalPrice,
|
|
||||||
appIdentifier: "gift",
|
|
||||||
productIdentifier: subscriptionIdentifier,
|
|
||||||
meta: new Dictionary<string, object>
|
|
||||||
{
|
|
||||||
["gift_id"] = gift.Id.ToString()
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// If payment method is in-app wallet, process payment immediately
|
|
||||||
if (paymentMethod == SubscriptionPaymentMethod.InAppWallet)
|
|
||||||
{
|
|
||||||
var gifterWallet = await db.Wallets.FirstOrDefaultAsync(w => w.AccountId == gifter.Id);
|
|
||||||
if (gifterWallet == null)
|
|
||||||
throw new InvalidOperationException("Gifter wallet not found.");
|
|
||||||
|
|
||||||
await payment.PayOrderAsync(order.Id, gifterWallet);
|
|
||||||
|
|
||||||
// Mark gift as sent after successful payment
|
|
||||||
gift.Status = DysonNetwork.Shared.Models.GiftStatus.Sent;
|
|
||||||
gift.UpdatedAt = SystemClock.Instance.GetCurrentInstant();
|
|
||||||
await db.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
return gift;
|
return gift;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user