Handler.cs 4.7 KB

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