| 12345678910111213141516171819202122232425262728293031 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.Ranking.GetMyRank;
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- public async Task<Response> Handle(Query request, CancellationToken ct)
- {
- var category = string.IsNullOrWhiteSpace(request.Category) || request.Category == "all" ? null : request.Category;
- var query = db.RankingSnapshot.AsNoTracking()
- .Where(r => r.Type == request.Type && r.Period == request.Period && r.MemberID == request.MemberID);
- query = category == null
- ? query.Where(r => r.Category == null)
- : query.Where(r => r.Category == category);
- var mine = await query.OrderByDescending(r => r.SnapshotAt).FirstOrDefaultAsync(ct);
- if (mine == null)
- {
- return new Response(null, null, null, 0, 0, 0, null);
- }
- int? change = mine.PreviousRank.HasValue ? mine.PreviousRank.Value - mine.Rank : null;
- return new Response(mine.Rank, mine.PreviousRank, change, mine.Score, mine.MoneyAmount, mine.DonorCount, mine.SnapshotAt);
- }
- }
|