View.cshtml.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using Infrastructure.Persistence.Identity;
  2. using MediatR;
  3. using Microsoft.AspNetCore.Identity;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using System.ComponentModel;
  7. using System.ComponentModel.DataAnnotations;
  8. namespace Admin.Pages.Member.Wallet.List;
  9. public class ViewModel(IMediator mediator, UserManager<ApplicationUser> userManager) : PageModel
  10. {
  11. public WalletInfo Wallet { get; set; } = new();
  12. public MemberInfo Member { get; set; } = new();
  13. [BindProperty]
  14. [Required(ErrorMessage = "충전 금액을 입력해주세요.")]
  15. [Range(-99999999, 99999999, ErrorMessage = "금액은 -99,999,999 ~ 99,999,999 범위입니다.")]
  16. [DisplayName("충전 금액")]
  17. public long Amount { get; set; }
  18. [BindProperty]
  19. [Required(ErrorMessage = "비밀번호를 입력해주세요.")]
  20. [DisplayName("비밀번호")]
  21. public string Password { get; set; } = default!;
  22. [BindProperty]
  23. [MaxLength(1000, ErrorMessage = "메모는 {1}자 이하로 입력하세요.")]
  24. [DisplayName("메모")]
  25. public string? Memo { get; set; }
  26. public sealed class WalletInfo
  27. {
  28. public int ID { get; set; }
  29. public string Balance { get; set; } = "0";
  30. }
  31. public sealed class MemberInfo
  32. {
  33. public int ID { get; set; }
  34. public string Email { get; set; } = default!;
  35. public string? GradeName { get; set; }
  36. }
  37. public async Task<IActionResult> OnGetAsync(int id, CancellationToken ct)
  38. {
  39. try
  40. {
  41. var result = await mediator.Send(new GetWallet.Query(id), ct);
  42. Wallet = new WalletInfo
  43. {
  44. ID = result.WalletID,
  45. Balance = result.Balance.ToString("N0")
  46. };
  47. Member = new MemberInfo
  48. {
  49. ID = result.MemberID,
  50. Email = result.MemberEmail,
  51. GradeName = result.GradeName
  52. };
  53. }
  54. catch (Exception e)
  55. {
  56. TempData["ErrorMessages"] = e.Message;
  57. return RedirectToPage("Index");
  58. }
  59. return Page();
  60. }
  61. public async Task<IActionResult> OnPostChargeAsync(int id, CancellationToken ct)
  62. {
  63. try
  64. {
  65. if (Amount == 0)
  66. {
  67. throw new ArgumentException("충전 금액을 입력해주세요.");
  68. }
  69. var admin = await userManager.GetUserAsync(User);
  70. if (admin is null || !await userManager.CheckPasswordAsync(admin, Password))
  71. {
  72. throw new UnauthorizedAccessException("비밀번호가 올바르지 않습니다.");
  73. }
  74. await mediator.Send(new ChargeWallet.Command(
  75. id,
  76. Amount,
  77. Memo
  78. ), ct);
  79. TempData["SuccessMessage"] = Amount > 0
  80. ? $"{Amount:N0}P 충전되었습니다."
  81. : $"{Math.Abs(Amount):N0}P 차감되었습니다.";
  82. }
  83. catch (Exception e)
  84. {
  85. TempData["ErrorMessages"] = e.Message;
  86. }
  87. return RedirectToPage("View", new { id });
  88. }
  89. }