Handler.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Admin.Developers.Accounts.ListDevelopers;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var page = Math.Max(1, request.PageNum);
  10. var size = Math.Clamp(request.PerPage <= 0 ? 20 : request.PerPage, 1, 100);
  11. var keyword = request.Keyword?.Trim();
  12. var query = db.Developer.AsQueryable();
  13. if (request.ApprovalStatus.HasValue)
  14. {
  15. query = query.Where(c => c.ApprovalStatus == request.ApprovalStatus.Value);
  16. }
  17. if (request.KycStatus.HasValue)
  18. {
  19. query = query.Where(c => c.KycStatus == request.KycStatus.Value);
  20. }
  21. if (!string.IsNullOrEmpty(keyword))
  22. {
  23. query = query.Where(c =>
  24. c.CompanyName.Contains(keyword) ||
  25. c.BusinessNumber.Contains(keyword) ||
  26. c.CeoName.Contains(keyword) ||
  27. c.ContactName.Contains(keyword) ||
  28. (c.Member != null && c.Member.Email.Contains(keyword))
  29. );
  30. }
  31. var total = await query.CountAsync(ct);
  32. var list = await query
  33. .OrderByDescending(c => c.CreatedAt)
  34. .Skip((page - 1) * size)
  35. .Take(size)
  36. .Select(c => new DeveloperRow(
  37. c.ID,
  38. c.MemberID,
  39. c.Member!.Email,
  40. c.Member.Name,
  41. c.CompanyName,
  42. c.BusinessNumber,
  43. c.CeoName,
  44. c.ContactName,
  45. c.ContactPhone,
  46. c.KycStatus,
  47. c.KycVerifiedAt,
  48. c.ApprovalStatus,
  49. c.ApprovalReason,
  50. c.ApprovedAt,
  51. c.CreatedAt
  52. ))
  53. .ToListAsync(ct);
  54. return new Response(total, list);
  55. }
  56. }