Complete subscriptions

This commit is contained in:
LittleSheep 2025-06-22 19:56:42 +08:00
parent 698442ad13
commit de7a2cea09
3 changed files with 44 additions and 6 deletions

View File

@ -136,7 +136,7 @@ public class SubscriptionController(SubscriptionService subscriptions, AppDataba
public class SubscriptionOrderRequest public class SubscriptionOrderRequest
{ {
[Required] public string OrderId { get; set; } = null!; [Required] public Guid OrderId { get; set; }
} }
[HttpPost("order/handle")] [HttpPost("order/handle")]

View File

@ -1,3 +1,4 @@
using System.Text.Json;
using DysonNetwork.Sphere.Storage; using DysonNetwork.Sphere.Storage;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using NodaTime; using NodaTime;
@ -139,16 +140,16 @@ public class SubscriptionService(AppDatabase db, PaymentService payment, ICacheS
public async Task<Subscription> HandleSubscriptionOrder(Order order) public async Task<Subscription> HandleSubscriptionOrder(Order order)
{ {
if (order.AppIdentifier != SubscriptionOrderIdentifier || order.Status != OrderStatus.Paid || if (order.AppIdentifier != SubscriptionOrderIdentifier || order.Status != OrderStatus.Paid ||
order.Meta?["subscription_id"] is not string subscriptionId) order.Meta?["subscription_id"] is not JsonElement subscriptionIdJson)
throw new InvalidOperationException("Invalid order."); throw new InvalidOperationException("Invalid order.");
var subscriptionIdParsed = Guid.TryParse(subscriptionId, out var parsedSubscriptionId) var subscriptionId = Guid.TryParse(subscriptionIdJson.ToString(), out var parsedSubscriptionId)
? parsedSubscriptionId ? parsedSubscriptionId
: Guid.Empty; : Guid.Empty;
if (subscriptionIdParsed == Guid.Empty) if (subscriptionId == Guid.Empty)
throw new InvalidOperationException("Invalid order."); throw new InvalidOperationException("Invalid order.");
var subscription = await db.WalletSubscriptions var subscription = await db.WalletSubscriptions
.Where(s => s.Id == subscriptionIdParsed) .Where(s => s.Id == subscriptionId)
.Include(s => s.Coupon) .Include(s => s.Coupon)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (subscription is null) if (subscription is null)

View File

@ -1,3 +1,5 @@
using System.ComponentModel.DataAnnotations;
using DysonNetwork.Sphere.Permission;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -6,7 +8,7 @@ namespace DysonNetwork.Sphere.Wallet;
[ApiController] [ApiController]
[Route("/wallets")] [Route("/wallets")]
public class WalletController(AppDatabase db, WalletService ws) : ControllerBase public class WalletController(AppDatabase db, WalletService ws, PaymentService payment) : ControllerBase
{ {
[HttpPost] [HttpPost]
[Authorize] [Authorize]
@ -61,4 +63,39 @@ public class WalletController(AppDatabase db, WalletService ws) : ControllerBase
return Ok(transactions); return Ok(transactions);
} }
public class WalletBalanceRequest
{
public string? Remark { get; set; }
[Required] public decimal Amount { get; set; }
[Required] public string Currency { get; set; } = null!;
[Required] public Guid AccountId { get; set; }
}
[HttpPost("balance")]
[Authorize]
[RequiredPermission("maintenance", "wallets.balance.modify")]
public async Task<ActionResult<Transaction>> ModifyWalletBalance([FromBody] WalletBalanceRequest request)
{
var wallet = await ws.GetWalletAsync(request.AccountId);
if (wallet is null) return NotFound("Wallet was not found.");
var transaction = request.Amount >= 0
? await payment.CreateTransactionAsync(
payerWalletId: null,
payeeWalletId: wallet.Id,
currency: request.Currency,
amount: request.Amount,
remarks: request.Remark
)
: await payment.CreateTransactionAsync(
payerWalletId: wallet.Id,
payeeWalletId: null,
currency: request.Currency,
amount: request.Amount,
remarks: request.Remark
);
return Ok(transaction);
}
} }