Handler.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Admin.Member.List.Search;
  5. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var query = db.Member.AsNoTracking().Include(x => x.MemberGrade).Include(x => x.MemberStats).AsQueryable();
  10. // 키워드 검색
  11. if (!string.IsNullOrWhiteSpace(request.Keyword))
  12. {
  13. query = request.Search switch
  14. {
  15. 1 => query.Where(x => x.ID.ToString().Contains(request.Keyword)),
  16. 2 => query.Where(x => x.Email.Contains(request.Keyword)),
  17. 3 => query.Where(x => x.Name != null && x.Name.Contains(request.Keyword)),
  18. 4 => query.Where(x => x.FullName != null && x.FullName.Contains(request.Keyword)),
  19. 5 => query.Where(x => x.Phone != null && x.Phone.Contains(request.Keyword)),
  20. _ => query
  21. };
  22. }
  23. // 날짜 필터
  24. if (!string.IsNullOrWhiteSpace(request.StartAt) && DateTime.TryParse(request.StartAt, out var startAt))
  25. {
  26. query = query.Where(x => x.CreatedAt >= startAt);
  27. }
  28. if (!string.IsNullOrWhiteSpace(request.EndAt) && DateTime.TryParse(request.EndAt, out var endAt))
  29. {
  30. query = query.Where(x => x.CreatedAt <= endAt);
  31. }
  32. // 성별 필터
  33. if (request.Gender.HasValue)
  34. {
  35. query = query.Where(x => x.Gender == request.Gender.Value);
  36. }
  37. // 이메일 인증 필터
  38. if (request.IsEmailVerified == 1)
  39. {
  40. query = query.Where(x => x.IsEmailVerified);
  41. }
  42. // 본인 인증 필터
  43. if (request.IsAuthCertified == 1)
  44. {
  45. query = query.Where(x => x.IsAuthCertified);
  46. }
  47. var counts = await query.GroupBy(c => 1).Select(c => new Response.TabCounts
  48. {
  49. All = c.Count(),
  50. Denied = c.Count(x => x.IsDenied),
  51. Withdraw = c.Count(x => x.IsWithdraw),
  52. Admin = c.Count(x => x.IsAdmin)
  53. }).FirstOrDefaultAsync(ct) ?? new Response.TabCounts();
  54. query = request.Tab switch
  55. {
  56. 1 => query.Where(x => x.IsDenied),
  57. 2 => query.Where(x => x.IsWithdraw),
  58. 3 => query.Where(x => x.IsAdmin),
  59. _ => query
  60. };
  61. var total = await query.CountAsync(ct);
  62. var skip = (request.PageNum - 1) * request.PerPage;
  63. var list = await query
  64. .OrderByDescending(x => x.ID)
  65. .Skip(skip)
  66. .Take(request.PerPage)
  67. .Select(x => new
  68. {
  69. x.ID,
  70. x.Email,
  71. x.Name,
  72. x.FullName,
  73. x.Icon,
  74. x.Phone,
  75. x.Birthday,
  76. x.Gender,
  77. GradeName = x.MemberGrade != null ? x.MemberGrade.KorName : null,
  78. x.IsEmailVerified,
  79. x.IsAuthCertified,
  80. x.IsDenied,
  81. x.IsWithdraw,
  82. Following = x.MemberStats != null ? x.MemberStats.FollowingCount : 0,
  83. Followed = x.MemberStats != null ? x.MemberStats.FollowerCount : 0,
  84. x.LastLoginAt,
  85. x.LastLoginIp,
  86. x.CreatedAt,
  87. x.UpdatedAt
  88. })
  89. .ToListAsync(ct);
  90. var rows = list.Select((x, idx) => new Response.Row
  91. {
  92. Num = total - skip - idx,
  93. ID = x.ID,
  94. Email = x.Email,
  95. Name = x.Name,
  96. FullName = x.FullName,
  97. Icon = x.Icon,
  98. Phone = x.Phone,
  99. Birthday = x.Birthday?.ToString("yyyy-MM-dd"),
  100. Gender = x.Gender switch
  101. {
  102. Domain.Entities.Members.ValueObject.Gender.Male => "남자",
  103. Domain.Entities.Members.ValueObject.Gender.Female => "여자",
  104. _ => null
  105. },
  106. GradeName = x.GradeName,
  107. IsEmailVerified = x.IsEmailVerified,
  108. IsAuthCertified = x.IsAuthCertified,
  109. IsDenied = x.IsDenied,
  110. IsWithdraw = x.IsWithdraw,
  111. Following = x.Following,
  112. Followed = x.Followed,
  113. LastLoginAt = x.LastLoginAt,
  114. LastLoginIp = x.LastLoginIp,
  115. CreatedAt = x.CreatedAt,
  116. UpdatedAt = x.UpdatedAt
  117. }).ToList();
  118. return new Response
  119. {
  120. Total = total,
  121. Counts = counts,
  122. List = rows
  123. };
  124. }
  125. }