Index.cshtml.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using SharedKernel.Extensions;
  2. using SharedKernel.Helpers;
  3. using MediatR;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using Microsoft.AspNetCore.Mvc.Rendering;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. namespace Admin.Pages.Forum.Board.List;
  10. public class IndexModel(IMediator mediator) : PageModel
  11. {
  12. [BindProperty(SupportsGet = true)]
  13. public QueryParams Query { get; set; } = new();
  14. public sealed class QueryParams
  15. {
  16. [Range(1, int.MaxValue)]
  17. [DisplayName("페이지 번호")]
  18. public int PageNum { get; set; } = 1;
  19. [Range(1, 100)]
  20. [DisplayName("페이지 목록 수")]
  21. public ushort PerPage { get; set; } = 10;
  22. [DisplayName("게시판 분류")]
  23. public int? BoardGroupID { get; set; }
  24. [DisplayName("검색어")]
  25. public string? Keyword { get; set; }
  26. }
  27. public int Total { get; set; }
  28. public List<(int ID, string Name)> BoardGroups { get; set; } = [];
  29. public List<(
  30. int Num,
  31. int ID,
  32. int BoardGroupID,
  33. string BoardGroupName,
  34. string Code,
  35. string Name,
  36. short Order,
  37. bool IsSearch,
  38. bool IsActive,
  39. int Posts,
  40. int Comments,
  41. string? UpdatedAt,
  42. string CreatedAt,
  43. string EditURL,
  44. List<SelectListItem> SelectBoardGroup
  45. )> Data { get; set; } = [];
  46. public Pagination? Pagination { get; set; }
  47. public async Task OnGetAsync(CancellationToken ct)
  48. {
  49. if (!ModelState.IsValid)
  50. {
  51. return;
  52. }
  53. var groups = await mediator.Send(new GetBoardGroups.Query(), ct);
  54. BoardGroups = [..groups.List.Select(c => (c.ID, c.Name))];
  55. var selectItems = groups.List.Select(c => new SelectListItem
  56. {
  57. Value = c.ID.ToString(),
  58. Text = c.Name
  59. }).ToList();
  60. var result = await mediator.Send(new SearchBoards.Query(Query.BoardGroupID, Query.Keyword, Query.PageNum, Query.PerPage), ct);
  61. Total = result.Total;
  62. Data = [..result.List.Select(c => (
  63. c.Num,
  64. c.ID,
  65. c.BoardGroupID,
  66. c.BoardGroupName,
  67. c.Code,
  68. c.Name,
  69. c.Order,
  70. c.IsSearch,
  71. c.IsActive,
  72. c.Posts,
  73. c.Comments,
  74. c.UpdatedAt.GetDateAt() ?? "-",
  75. c.CreatedAt.GetDateAt(),
  76. EditURL: $"/Forum/Board/List/Edit/{c.ID}{Request.QueryString}",
  77. SelectBoardGroup: selectItems.Select(s => new SelectListItem
  78. {
  79. Value = s.Value,
  80. Text = s.Text,
  81. Selected = s.Value == c.BoardGroupID.ToString()
  82. }).ToList()
  83. ))];
  84. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  85. }
  86. public sealed class UpdateRequest
  87. {
  88. public int ID { get; set; }
  89. public int BoardGroupID { get; set; }
  90. public string Code { get; set; } = "";
  91. public string Name { get; set; } = "";
  92. public short Order { get; set; }
  93. public bool IsSearch { get; set; }
  94. public bool IsActive { get; set; }
  95. }
  96. public async Task<IActionResult> OnPostUpdateAsync(int[] ids, Dictionary<int, UpdateRequest> request, CancellationToken ct)
  97. {
  98. try
  99. {
  100. int count = 0;
  101. foreach (var id in ids)
  102. {
  103. if (request.TryGetValue(id, out var item))
  104. {
  105. await mediator.Send(new UpdateBoard.Command(
  106. id, item.BoardGroupID, item.Code, item.Name, item.Order, item.IsSearch, item.IsActive
  107. ), ct);
  108. count++;
  109. }
  110. }
  111. TempData["SuccessMessage"] = $"{count}건이 수정되었습니다.";
  112. }
  113. catch (Exception e)
  114. {
  115. TempData["ErrorMessages"] = e.Message;
  116. }
  117. return RedirectToPage("/Forum/Board/List/Index", Query);
  118. }
  119. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  120. {
  121. try
  122. {
  123. await mediator.Send(new DeleteBoard.Command(ids), ct);
  124. TempData["SuccessMessage"] = $"{ids.Length}건이 삭제되었습니다.";
  125. }
  126. catch (Exception e)
  127. {
  128. TempData["ErrorMessages"] = e.Message;
  129. }
  130. return RedirectToPage("/Forum/Board/List/Index", Query);
  131. }
  132. }