| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.DonationRemote.GetState;
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- public async Task<Response> Handle(Query request, CancellationToken ct)
- {
- var channelID = await db.Channel.AsNoTracking()
- .Where(c => c.WidgetToken == request.WidgetToken)
- .Select(c => c.ID)
- .FirstOrDefaultAsync(ct);
- if (channelID == 0)
- {
- return new Response(false, true, false, false, []);
- }
- var meta = await db.DonationMeta.AsNoTracking().FirstOrDefaultAsync(m => m.ChannelID == channelID, ct);
- // 최근 100건 모든 상태 (프론트에서 탭별 필터링)
- var rawList = await db.DonationAlert.AsNoTracking()
- .Where(a => a.Donation!.ChannelID == channelID)
- .OrderByDescending(a => a.CreatedAt)
- .Take(100)
- .Select(a => new
- {
- a.ID,
- a.DonationID,
- a.Status,
- a.SponsorMemberID,
- SendName = a.Donation!.SendName,
- Amount = a.Donation.Amount,
- Message = a.Donation.Message,
- IsTest = a.Donation.IsTest,
- a.CreatedAt
- })
- .ToListAsync(ct);
- var queue = rawList.Select(x => new AlertQueueItem(
- x.ID, x.DonationID, x.Status.ToString().ToLowerInvariant(),
- x.SponsorMemberID, x.SendName, x.Amount,
- x.Message, x.IsTest, x.CreatedAt
- )).ToList();
- return new Response(
- meta?.IsPaused ?? false,
- meta?.IsAccepting ?? true,
- meta?.IsAudioOnly ?? false,
- meta?.IsVideoOnly ?? false,
- queue
- );
- }
- }
|