| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- using Application.Abstractions.Hub;
- using Infrastructure.Hubs;
- using Web.Api.Common;
- using Web.Api.Extensions;
- using MediatR;
- using Microsoft.AspNetCore.SignalR;
- using System.Security.Claims;
- namespace Web.Api.Endpoints.Donation;
- /// <summary>리모콘 — 재전송 (종결 상태 알림을 위젯 큐에 다시 push)</summary>
- internal sealed class RemoteResend : IEndpoint
- {
- public void MapEndpoint(IEndpointRouteBuilder app)
- {
- /// 실패/스킵/무시/완료된 알림을 다시 Queued 로 만들고 위젯에 broadcast.
- /// PlayNow 와 동일하게 ReceiveAlert 으로 위젯 큐 push.
- app.MapPost("api/donation/remote/resend/{alertID:int}", async (
- int alertID,
- ClaimsPrincipal user,
- ISender sender,
- IHubContext<DonationHub, IDonationHubClient> donationHub,
- CancellationToken ct
- ) => {
- var memberID = user.GetRequiredMemberID();
- var result = await sender.Send(new Application.Features.Api.DonationRemote.ResendAlert.Command(alertID, memberID), ct);
- if (result.IsFailure)
- {
- return CustomResults.Problem(result);
- }
- var data = result.Value;
- var alertPayload = new
- {
- alertID = data.AlertID,
- donationID = data.DonationID,
- correlationID = data.CorrelationID,
- sponsorMemberID = memberID,
- sendName = data.SendName,
- amount = data.Amount,
- netAmount = data.NetAmount,
- message = data.Message,
- channelID = data.ChannelID,
- channelName = data.ChannelName,
- crewMemberID = data.CrewMemberID,
- crewMemberNickname = data.CrewMemberNickname,
- isTest = data.IsTest,
- createdAt = DateTime.UtcNow
- };
- await donationHub.Clients.Group(data.WidgetToken).ReceiveAlert(alertPayload);
- // 리모콘 측 status 즉시 동기화
- await donationHub.Clients.Group(data.WidgetToken).ReceiveAlertStatusUpdate(new { alertID = data.AlertID, status = "queued" });
- return ApiResponse.Ok(data);
- })
- .WithTags("DonationRemote")
- .RequireAuthorization();
- }
- }
|