Handler.cs 4.3 KB

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