using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; namespace Application.Features.Api.Ranking.GetMyRank; internal sealed class Handler(IAppDbContext db) : IQueryHandler { public async Task 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); } }