Handler.cs 1.2 KB

12345678910111213141516171819202122232425262728293031
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Ranking.GetMyRank;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var category = string.IsNullOrWhiteSpace(request.Category) || request.Category == "all" ? null : request.Category;
  10. var query = db.RankingSnapshot.AsNoTracking()
  11. .Where(r => r.Type == request.Type && r.Period == request.Period && r.MemberID == request.MemberID);
  12. query = category == null
  13. ? query.Where(r => r.Category == null)
  14. : query.Where(r => r.Category == category);
  15. var mine = await query.OrderByDescending(r => r.SnapshotAt).FirstOrDefaultAsync(ct);
  16. if (mine == null)
  17. {
  18. return new Response(null, null, null, 0, 0, 0, null);
  19. }
  20. int? change = mine.PreviousRank.HasValue ? mine.PreviousRank.Value - mine.Rank : null;
  21. return new Response(mine.Rank, mine.PreviousRank, change, mine.Score, mine.MoneyAmount, mine.DonorCount, mine.SnapshotAt);
  22. }
  23. }