RemoteResend.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Application.Abstractions.Hub;
  2. using Infrastructure.Hubs;
  3. using Web.Api.Common;
  4. using Web.Api.Extensions;
  5. using MediatR;
  6. using Microsoft.AspNetCore.SignalR;
  7. using System.Security.Claims;
  8. namespace Web.Api.Endpoints.Donation;
  9. /// <summary>리모콘 — 재전송 (종결 상태 알림을 위젯 큐에 다시 push)</summary>
  10. internal sealed class RemoteResend : IEndpoint
  11. {
  12. public void MapEndpoint(IEndpointRouteBuilder app)
  13. {
  14. /// 실패/스킵/무시/완료된 알림을 다시 Queued 로 만들고 위젯에 broadcast.
  15. /// PlayNow 와 동일하게 ReceiveAlert 으로 위젯 큐 push.
  16. app.MapPost("api/donation/remote/resend/{alertID:int}", async (
  17. int alertID,
  18. ClaimsPrincipal user,
  19. ISender sender,
  20. IHubContext<DonationHub, IDonationHubClient> donationHub,
  21. CancellationToken ct
  22. ) => {
  23. var memberID = user.GetRequiredMemberID();
  24. var result = await sender.Send(new Application.Features.Api.DonationRemote.ResendAlert.Command(alertID, memberID), ct);
  25. if (result.IsFailure)
  26. {
  27. return CustomResults.Problem(result);
  28. }
  29. var data = result.Value;
  30. var alertPayload = new
  31. {
  32. alertID = data.AlertID,
  33. donationID = data.DonationID,
  34. correlationID = data.CorrelationID,
  35. sponsorMemberID = memberID,
  36. sendName = data.SendName,
  37. amount = data.Amount,
  38. netAmount = data.NetAmount,
  39. message = data.Message,
  40. channelID = data.ChannelID,
  41. channelName = data.ChannelName,
  42. crewMemberID = data.CrewMemberID,
  43. crewMemberNickname = data.CrewMemberNickname,
  44. isTest = data.IsTest,
  45. createdAt = DateTime.UtcNow
  46. };
  47. await donationHub.Clients.Group(data.WidgetToken).ReceiveAlert(alertPayload);
  48. // 리모콘 측 status 즉시 동기화
  49. await donationHub.Clients.Group(data.WidgetToken).ReceiveAlertStatusUpdate(new { alertID = data.AlertID, status = "queued" });
  50. return ApiResponse.Ok(data);
  51. })
  52. .WithTags("DonationRemote")
  53. .RequireAuthorization();
  54. }
  55. }