Prefix.cshtml.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using SharedKernel.Extensions;
  2. using MediatR;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.AspNetCore.Mvc.RazorPages;
  5. using System.ComponentModel.DataAnnotations;
  6. using System.ComponentModel;
  7. namespace Admin.Pages.Forum.Board;
  8. public class PrefixModel(IMediator mediator) : PageModel
  9. {
  10. public int BoardID { get; set; }
  11. public List<(int ID, string Name)> BoardList { get; set; } = [];
  12. public string? QueryString { get; set; }
  13. public int Total { get; set; }
  14. public List<(
  15. int ID,
  16. string Name,
  17. string? Color,
  18. short Order,
  19. int Posts,
  20. bool IsActive,
  21. string? UpdatedAt,
  22. string CreatedAt
  23. )> Data { get; set; } = [];
  24. [BindProperty]
  25. public InputModel Input { get; set; } = new();
  26. public sealed class InputModel
  27. {
  28. public string? Name { get; set; }
  29. public string? Color { get; set; }
  30. public short Order { get; set; }
  31. }
  32. [BindProperty]
  33. public List<UpdateItemModel> UpdateItems { get; set; } = [];
  34. public sealed class UpdateItemModel
  35. {
  36. [Required]
  37. [DisplayName("ID")]
  38. public int ID { get; set; }
  39. [Required]
  40. [MaxLength(50)]
  41. [DisplayName("말머리")]
  42. public string Name { get; set; } = default!;
  43. [Required]
  44. [DisplayName("색상")]
  45. public string? Color { get; set; }
  46. [Required]
  47. [Range(-9999, 9999)]
  48. [DisplayName("순서")]
  49. public short Order { get; set; }
  50. [DisplayName("사용 여부")]
  51. public bool IsActive { get; set; }
  52. }
  53. [BindProperty]
  54. public int DeleteID { get; set; }
  55. public async Task OnGetAsync(int id, CancellationToken ct)
  56. {
  57. BoardID = id;
  58. QueryString = Request.QueryString.ToString();
  59. var boards = await mediator.Send(new SearchBoards.Query(null, null, 1, 100), ct);
  60. BoardList = [..boards.List.Select(c => (c.ID, c.Name))];
  61. var result = await mediator.Send(new GetBoardPrefixes.Query(id), ct);
  62. Total = result.Total;
  63. Data = [..result.List.Select(c => (
  64. c.ID,
  65. c.Name,
  66. c.Color,
  67. c.Order,
  68. c.Posts,
  69. c.IsActive,
  70. c.UpdatedAt,
  71. c.CreatedAt
  72. ))];
  73. }
  74. public async Task<IActionResult> OnPostCreateAsync(int id, CancellationToken ct)
  75. {
  76. try
  77. {
  78. if (string.IsNullOrWhiteSpace(Input.Name))
  79. throw new Exception("말머리 이름을 입력하세요.");
  80. await mediator.Send(new SaveBoardPrefixes.Command(
  81. id,
  82. new SaveBoardPrefixes.Command.Create(
  83. Input.Name,
  84. Input.Color,
  85. Input.Order
  86. ),
  87. null,
  88. null
  89. ), ct);
  90. TempData["SuccessMessage"] = "말머리가 추가되었습니다.";
  91. }
  92. catch (Exception e)
  93. {
  94. TempData["ErrorMessages"] = e.Message;
  95. }
  96. return Redirect($"/Forum/Board/Prefix/{id}{Request.QueryString}");
  97. }
  98. public async Task<IActionResult> OnPostSaveAsync(int id, CancellationToken ct)
  99. {
  100. try
  101. {
  102. foreach (var key in ModelState.Keys.Where(k => k.StartsWith("Input.")).ToList())
  103. {
  104. ModelState.Remove(key);
  105. }
  106. if (!ModelState.IsValid)
  107. {
  108. throw new Exception(ModelState.GetErrorMessages());
  109. }
  110. var updates = UpdateItems.Select(x => new SaveBoardPrefixes.Command.Update(
  111. x.ID,
  112. x.Name,
  113. x.Color,
  114. x.Order,
  115. x.IsActive
  116. )).ToList();
  117. await mediator.Send(new SaveBoardPrefixes.Command(
  118. id,
  119. null,
  120. updates,
  121. null
  122. ), ct);
  123. TempData["SuccessMessage"] = "말머리 목록이 저장되었습니다.";
  124. }
  125. catch (Exception e)
  126. {
  127. TempData["ErrorMessages"] = e.Message;
  128. }
  129. return Redirect($"/Forum/Board/Prefix/{id}{Request.QueryString}");
  130. }
  131. public async Task<IActionResult> OnPostDeleteAsync(int id, CancellationToken ct)
  132. {
  133. try
  134. {
  135. ModelState.Clear();
  136. await mediator.Send(new SaveBoardPrefixes.Command(
  137. id,
  138. null,
  139. null,
  140. [DeleteID]
  141. ), ct);
  142. TempData["SuccessMessage"] = "말머리가 삭제되었습니다.";
  143. }
  144. catch (Exception e)
  145. {
  146. TempData["ErrorMessages"] = e.Message;
  147. }
  148. return Redirect($"/Forum/Board/Prefix/{id}{Request.QueryString}");
  149. }
  150. }