Index.cshtml.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. using SharedKernel.Helpers;
  2. using SharedKernel.Extensions;
  3. using Domain.Entities.Members.ValueObject;
  4. using MediatR;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.AspNetCore.Mvc.RazorPages;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. namespace Admin.Pages.Member.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. [Range(1, 5, ErrorMessage = "{0}이(가) 올바르지 않습니다.")]
  24. public int? Search { get; set; }
  25. [DisplayName("검색어")]
  26. [MaxLength(255, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
  27. public string? Keyword { get; set; }
  28. [DisplayName("시작일")]
  29. public string? StartAt { get; set; }
  30. [DisplayName("종료일")]
  31. public string? EndAt { get; set; }
  32. [DisplayName("성별")]
  33. public Gender? Gender { get; set; }
  34. [DisplayName("이메일 인증")]
  35. public int? IsEmailVerified { get; set; }
  36. [DisplayName("본인 인증")]
  37. public int? IsAuthCertified { get; set; }
  38. [DisplayName("탭")]
  39. public int Tab { get; set; } = 0;
  40. }
  41. public int Total { get; set; } = 0;
  42. public SearchMembers.Response.TabCounts Counts { get; set; } = new();
  43. public List<(
  44. int ID,
  45. string Email,
  46. string? Name,
  47. string? FullName,
  48. string? Icon,
  49. string? Phone,
  50. string? Birthday,
  51. string? Gender,
  52. string? GradeName,
  53. char IsEmailVerified,
  54. char IsAuthCertified,
  55. char IsDenied,
  56. char IsWithdraw,
  57. long Following,
  58. long Followed,
  59. string? LastLoginAt,
  60. string? LastLoginIp,
  61. string? UpdatedAt,
  62. string CreatedAt,
  63. string ViewURL,
  64. string ApproveURL,
  65. string EditURL
  66. )> List { get; set; } = [];
  67. public Pagination? Pagination { get; set; }
  68. public async Task OnGetAsync(CancellationToken ct)
  69. {
  70. if (!ModelState.IsValid)
  71. {
  72. return;
  73. }
  74. var result = await mediator.Send(new SearchMembers.Query(
  75. Query.PageNum,
  76. Query.PerPage,
  77. Query.Search,
  78. Query.Keyword,
  79. Query.StartAt,
  80. Query.EndAt,
  81. Query.Gender,
  82. Query.IsEmailVerified,
  83. Query.IsAuthCertified,
  84. Query.Tab
  85. ), ct);
  86. Total = result.Total;
  87. Counts = result.Counts;
  88. var qs = Request.QueryString.ToString();
  89. List = [..result.List.Select(c => (
  90. c.ID,
  91. c.Email,
  92. Name: c.Name ?? "-",
  93. FullName: c.FullName ?? "-",
  94. c.Icon,
  95. c.Phone,
  96. Birthday: c.Birthday ?? "-",
  97. Gender: c.Gender ?? "-",
  98. GradeName: c.GradeName ?? "-",
  99. IsEmailVerified: c.IsEmailVerified ? 'Y' : 'N',
  100. IsAuthCertified: c.IsAuthCertified ? 'Y' : 'N',
  101. IsDenied: c.IsDenied ? 'Y' : 'N',
  102. IsWithdraw: c.IsWithdraw ? 'Y' : 'N',
  103. c.Following,
  104. c.Followed,
  105. LastLoginAt: c.LastLoginAt.GetDateAt() ?? "-",
  106. c.LastLoginIp,
  107. UpdatedAt: c.UpdatedAt.GetDateAt() ?? "-",
  108. CreatedAt: c.CreatedAt.GetDateAt(),
  109. ViewURL: $"/Member/List/View/{c.ID}{qs}",
  110. ApproveURL: $"/Member/List/Approve/{c.ID}{qs}",
  111. EditURL: $"/Member/List/Edit/{c.ID}{qs}"
  112. ))];
  113. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  114. }
  115. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  116. {
  117. try
  118. {
  119. if (ids.Length == 0)
  120. {
  121. throw new Exception("삭제할 항목을 선택해주세요.");
  122. }
  123. await mediator.Send(new DeleteMember.Command(ids), ct);
  124. TempData["SuccessMessage"] = $"{ids.Length}건이 삭제되었습니다.";
  125. }
  126. catch (Exception e)
  127. {
  128. TempData["ErrorMessages"] = e.Message;
  129. }
  130. return RedirectToPage(Query);
  131. }
  132. }