Handler.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Application.Features.Api.Studio.Helpers;
  4. using Microsoft.EntityFrameworkCore;
  5. using SharedKernel.Results;
  6. namespace Application.Features.Api.Studio.Wallet.GetWithdraw;
  7. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  8. {
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. // Wallet Donation 잔액
  12. var wallet = await db.Wallet.AsNoTracking()
  13. .Include(w => w.Balances)
  14. .FirstOrDefaultAsync(w => w.MemberID == request.MemberID, ct);
  15. var withdrawableBalance = 0;
  16. if (wallet is not null)
  17. {
  18. var donationBal = wallet.Balances.FirstOrDefault(b => b.Type == Domain.Entities.Wallets.ValueObject.WalletBalanceType.Donation);
  19. if (donationBal is not null)
  20. {
  21. withdrawableBalance = (int)donationBal.Amount.Value;
  22. }
  23. }
  24. // 정산 계좌 목록
  25. var accounts = await db.SettlementAccount.AsNoTracking()
  26. .Where(a => a.MemberID == request.MemberID)
  27. .OrderBy(a => a.CreatedAt)
  28. .Select(a => new AccountInfo(
  29. a.ID,
  30. a.BankName,
  31. a.AccountNumber.Length > 4 ? "****" + a.AccountNumber.Substring(a.AccountNumber.Length - 4) : a.AccountNumber,
  32. a.AccountHolder
  33. ))
  34. .ToListAsync(ct);
  35. // 출금 내역
  36. var (start, end) = PeriodHelper.GetRange(request.Period);
  37. var baseQuery = db.WithdrawalRequest.AsNoTracking()
  38. .Where(w => w.MemberID == request.MemberID && w.RequestedAt >= start && w.RequestedAt <= end);
  39. var total = await baseQuery.CountAsync(ct);
  40. var list = await baseQuery
  41. .OrderByDescending(w => w.RequestedAt)
  42. .Skip((request.Page - 1) * request.PerPage)
  43. .Take(request.PerPage)
  44. .Select(w => new WithdrawItem(
  45. w.ID,
  46. w.RequestedAmount,
  47. w.WithholdingTax,
  48. w.NetAmount,
  49. w.Status.ToString(),
  50. w.BankName,
  51. w.AccountNumber.Length > 4 ? "****" + w.AccountNumber.Substring(w.AccountNumber.Length - 4) : w.AccountNumber,
  52. w.RequestedAt,
  53. w.ProcessedAt,
  54. w.RejectedReason
  55. ))
  56. .ToListAsync(ct);
  57. return Result.Success(new Response(total, withdrawableBalance, accounts, list));
  58. }
  59. }