Edit.cshtml.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using SharedKernel.Attributes;
  2. using SharedKernel.Extensions;
  3. using Application.Abstractions.Messaging;
  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.Grade;
  9. public class EditModel(IMediator mediator) : PageModel
  10. {
  11. [BindProperty]
  12. public InputModel Input { get; set; } = new();
  13. public sealed class InputModel
  14. {
  15. [DisplayName("ID")]
  16. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  17. public int ID { get; set; }
  18. public string? Image { get; set; }
  19. [DisplayName("이미지")]
  20. [AllowedExtensions("jpg,jpeg,png,gif,webp", ErrorMessage = "이미지 형식은 jpg, jpeg, png, gif, webp 파일이어야 합니다.")]
  21. public IFormFile? ImageFile { get; set; }
  22. [DisplayName("한글 명")]
  23. [DataType(DataType.Text)]
  24. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  25. [StringLength(240, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
  26. public string KorName { get; set; } = default!;
  27. [DisplayName("영문 명")]
  28. [DataType(DataType.Text)]
  29. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  30. [StringLength(120, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
  31. public string EngName { get; set; } = default!;
  32. [DisplayName("내용")]
  33. [DataType(DataType.Text)]
  34. [StringLength(1000, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
  35. public string? Description { get; set; }
  36. [DisplayName("순서")]
  37. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  38. [Range(-9999, 9999, ErrorMessage = "{0} 입력 범위는 {1} ~ {2} 입니다.")]
  39. public short Order { get; set; } = 0;
  40. [DisplayName("누적 후원 횟수")]
  41. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  42. [Range(0, 1000000000, ErrorMessage = "{0} 입력 범위는 {1} ~ {2} 입니다.")]
  43. public long TotalDonationCount { get; set; } = 0;
  44. [DisplayName("누적 후원 금액")]
  45. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  46. [Range(0, 1000000000, ErrorMessage = "{0} 입력 범위는 {1} ~ {2} 입니다.")]
  47. public int TotalDonationAmount { get; set; } = 0;
  48. [DisplayName("표시 색상")]
  49. [Required(ErrorMessage = "{0}은(는) 필수입니다.")]
  50. [StringLength(7, MinimumLength = 4, ErrorMessage = "{0}은(는) {2}자 이상 {1}자 이하로 입력하세요.")]
  51. public string TextColor { get; set; } = "#000000";
  52. [DisplayName("사용 여부")]
  53. public bool IsActive { get; set; } = false;
  54. public string? UpdatedAt { get; set; }
  55. public string CreatedAt { get; set; } = default!;
  56. }
  57. public async Task OnGetAsync(int id, CancellationToken ct)
  58. {
  59. var gradeResult = await mediator.Send(new GetMemberGrade.Query(id), ct);
  60. if (gradeResult.IsFailure)
  61. {
  62. TempData["ErrorMessages"] = gradeResult.Error.Description;
  63. return;
  64. }
  65. var result = gradeResult.Value;
  66. Input = new InputModel
  67. {
  68. ID = result.ID,
  69. Image = result.Image,
  70. KorName = result.KorName,
  71. EngName = result.EngName,
  72. Description = result.Description,
  73. Order = result.Order,
  74. TotalDonationCount = result.RequiredAttendance,
  75. TotalDonationAmount = result.RequiredExp,
  76. TextColor = result.TextColor ?? "#000000",
  77. IsActive = result.IsActive,
  78. UpdatedAt = result.UpdatedAt.GetDateAt() ?? "-",
  79. CreatedAt = result.CreatedAt.GetDateAt()
  80. };
  81. }
  82. public async Task<IActionResult> OnPostAsync(bool isImageRemove, CancellationToken ct)
  83. {
  84. if (!ModelState.IsValid)
  85. {
  86. TempData["ErrorMessages"] = ModelState.GetErrorMessages();
  87. return Redirect($"/Member/Grade/Edit/{Input.ID}");
  88. }
  89. var result = await mediator.Send(new UpdateMemberGrade.Command(
  90. Input.ID,
  91. Input.KorName,
  92. Input.EngName,
  93. Input.Description,
  94. Input.Order,
  95. Input.ImageFile,
  96. isImageRemove,
  97. Input.TextColor,
  98. Input.TotalDonationAmount,
  99. Input.TotalDonationCount,
  100. Input.IsActive
  101. ), ct);
  102. if (result.IsFailure)
  103. {
  104. TempData["ErrorMessages"] = result.Error.Description;
  105. }
  106. else
  107. {
  108. TempData["SuccessMessage"] = $"{Input.KorName} 회원등급이 수정되었습니다.";
  109. }
  110. return Redirect($"/Member/Grade/Edit/{Input.ID}");
  111. }
  112. }