| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- 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<Query, Response>
- {
- public async Task<Response> 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);
- }
- }
|