Handler.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.DonationRemote.GetState;
  5. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var channelID = await db.Channel.AsNoTracking()
  10. .Where(c => c.WidgetToken == request.WidgetToken)
  11. .Select(c => c.ID)
  12. .FirstOrDefaultAsync(ct);
  13. if (channelID == 0)
  14. {
  15. return new Response(false, true, false, false, []);
  16. }
  17. var meta = await db.DonationMeta.AsNoTracking().FirstOrDefaultAsync(m => m.ChannelID == channelID, ct);
  18. // 최근 100건 모든 상태 (프론트에서 탭별 필터링)
  19. var rawList = await db.DonationAlert.AsNoTracking()
  20. .Where(a => a.Donation!.ChannelID == channelID)
  21. .OrderByDescending(a => a.CreatedAt)
  22. .Take(100)
  23. .Select(a => new
  24. {
  25. a.ID,
  26. a.DonationID,
  27. a.Status,
  28. a.SponsorMemberID,
  29. SendName = a.Donation!.SendName,
  30. Amount = a.Donation.Amount,
  31. Message = a.Donation.Message,
  32. IsTest = a.Donation.IsTest,
  33. a.CreatedAt
  34. })
  35. .ToListAsync(ct);
  36. var queue = rawList.Select(x => new AlertQueueItem(
  37. x.ID, x.DonationID, x.Status.ToString().ToLowerInvariant(),
  38. x.SponsorMemberID, x.SendName, x.Amount,
  39. x.Message, x.IsTest, x.CreatedAt
  40. )).ToList();
  41. return new Response(
  42. meta?.IsPaused ?? false,
  43. meta?.IsAccepting ?? true,
  44. meta?.IsAudioOnly ?? false,
  45. meta?.IsVideoOnly ?? false,
  46. queue
  47. );
  48. }
  49. }