using Application.Abstractions.Channels; using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; namespace Application.Features.Api.DonationAlert.GetSignatureImages; internal sealed class Handler(IAppDbContext db) : IQueryHandler { public async Task Handle(Query request, CancellationToken ct) { var page = request.Page < 1 ? 1 : request.Page; var perPage = request.PerPage < 1 ? 6 : request.PerPage > 30 ? 30 : request.PerPage; var resolved = await ChannelIdentifierResolver.ResolveAsync(db, request.Identifier, ct); if (resolved.ChannelSID is null) { return new Response([], 0, false); } var channelID = await db.Channel.AsNoTracking() .Where(c => c.SID == resolved.ChannelSID && c.IsActive) .Select(c => (int?)c.ID) .FirstOrDefaultAsync(ct); if (channelID is null) { return new Response([], 0, false); } var baseQuery = db.DonationAlertConfig.AsNoTracking() .Where(c => c.ChannelID == channelID.Value && c.IsActive && c.EnableImage && c.ImageUrl != null); var total = await baseQuery.CountAsync(ct); var list = await baseQuery .OrderBy(c => c.Amount) .Skip((page - 1) * perPage) .Take(perPage) .Select(c => new SignatureItem( c.ID, c.Title, c.Amount, c.MatchType, c.ImageUrl! )) .ToListAsync(ct); var hasMore = page * perPage < total; return new Response(list, total, hasMore); } }