Handler.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Crew.GetCrewList;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var query = db.Crew.AsNoTracking().Where(c => c.ChannelID == request.ChannelID);
  10. var total = await query.CountAsync(ct);
  11. var projected = query.Select(c => new CrewItem(
  12. c.ID, c.Name, c.Description, c.MinAmount, c.IsActive,
  13. c.Members.Count(m => m.IsActive),
  14. c.Sessions.Count,
  15. c.Sessions.Sum(s => s.TotalAmount),
  16. c.CreatedAt
  17. ));
  18. projected = (request.SortBy, request.SortDir) switch
  19. {
  20. ("amount", "asc") => projected.OrderBy(c => c.TotalDonationAmount),
  21. ("amount", _) => projected.OrderByDescending(c => c.TotalDonationAmount),
  22. ("members", "asc") => projected.OrderBy(c => c.MemberCount),
  23. ("members", _) => projected.OrderByDescending(c => c.MemberCount),
  24. ("date", "asc") => projected.OrderBy(c => c.CreatedAt),
  25. _ => projected.OrderByDescending(c => c.CreatedAt)
  26. };
  27. var list = await projected
  28. .Skip((request.PageNum - 1) * request.PerPage)
  29. .Take(request.PerPage)
  30. .ToListAsync(ct);
  31. return new Response(total, list);
  32. }
  33. }