Index.cshtml.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using Domain.Entities.Forum.ValueObject;
  2. using SharedKernel.Helpers;
  3. using SharedKernel.Extensions;
  4. using Application.Abstractions.Messaging;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.AspNetCore.Mvc.RazorPages;
  7. using Microsoft.AspNetCore.Mvc.Rendering;
  8. using System.ComponentModel;
  9. using System.ComponentModel.DataAnnotations;
  10. namespace Admin.Pages.Forum.Reports.Post
  11. {
  12. public class IndexModel(IMediator mediator) : PageModel
  13. {
  14. [BindProperty(SupportsGet = true)]
  15. public QueryParams Query { get; set; } = new();
  16. public sealed class QueryParams
  17. {
  18. public int? BoardID { get; set; }
  19. public int? PostID { get; set; }
  20. public int? Search { get; set; }
  21. public string? Keyword { get; set; }
  22. public string? StartAt { get; set; }
  23. public string? EndAt { get; set; }
  24. public byte? Status { get; set; }
  25. public byte? Type { get; set; }
  26. [Range(1, int.MaxValue)]
  27. [DisplayName("??? ??")]
  28. public int PageNum { get; set; } = 1;
  29. [Range(1, 100)]
  30. [DisplayName("??? ?? ?")]
  31. public ushort PerPage { get; set; } = 20;
  32. }
  33. public int Total { get; set; } = 0;
  34. public List<SelectListItem> BoardList { get; set; } = [];
  35. public List<(
  36. int Num,
  37. int ID,
  38. int BoardID,
  39. string BoardName,
  40. int PostID,
  41. string PostSubject,
  42. int MemberID,
  43. string? MemberName,
  44. ReportType Type,
  45. string? Reason,
  46. ReportStatus Status,
  47. string? Memo,
  48. string? UpdatedAt,
  49. string CreatedAt
  50. )> List { get; set; } = [];
  51. public Pagination? Pagination { get; set; }
  52. public async Task OnGetAsync(CancellationToken ct)
  53. {
  54. if (!ModelState.IsValid)
  55. {
  56. return;
  57. }
  58. var boards = await mediator.Send(new SearchBoards.Query(null, null, 1, 500), ct);
  59. BoardList = [..boards.List.Select(c => new SelectListItem
  60. {
  61. Value = c.ID.ToString(),
  62. Text = $"[{c.BoardGroupName}] {c.Name}"
  63. })];
  64. var result = await mediator.Send(new SearchPostReports.Query(
  65. Query.BoardID, Query.PostID, Query.Search, Query.Keyword,
  66. Query.Status, Query.Type, Query.StartAt, Query.EndAt,
  67. Query.PageNum, Query.PerPage
  68. ), ct);
  69. Total = result.Total;
  70. List = [..result.List.Select(c => (
  71. c.Num,
  72. c.ID,
  73. c.BoardID,
  74. c.BoardName,
  75. c.PostID,
  76. c.PostSubject,
  77. c.MemberID,
  78. c.MemberName ?? "-",
  79. c.Type,
  80. c.Reason ?? "-",
  81. c.Status,
  82. c.Memo ?? "-",
  83. c.UpdatedAt.GetDateAt() ?? "-",
  84. c.CreatedAt.GetDateAt()
  85. ))];
  86. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  87. }
  88. public async Task<IActionResult> OnPostUpdateStatusAsync(int[] ids, byte status, string? memo, CancellationToken ct)
  89. {
  90. try
  91. {
  92. await mediator.Send(new UpdatePostReportStatus.Command(ids, (ReportStatus)status, memo), ct);
  93. TempData["SuccessMessage"] = $"{ids.Length}?? ??? ???????.";
  94. }
  95. catch (Exception e)
  96. {
  97. TempData["ErrorMessages"] = e.Message;
  98. }
  99. return RedirectToPage("/Forum/Reports/Post/Index", Query);
  100. }
  101. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  102. {
  103. try
  104. {
  105. await mediator.Send(new DeletePostReport.Command(ids), ct);
  106. TempData["SuccessMessage"] = $"{ids.Length}?? ???????.";
  107. }
  108. catch (Exception e)
  109. {
  110. TempData["ErrorMessages"] = e.Message;
  111. }
  112. return RedirectToPage("/Forum/Reports/Post/Index", Query);
  113. }
  114. }
  115. }