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; /// 리모콘 — 즉시 재생 (Queue/Failed/Skipped/Ignored/Delivered 알림을 위젯에 다시 broadcast) internal sealed class RemotePlayNow : IEndpoint { public void MapEndpoint(IEndpointRouteBuilder app) { app.MapPost("api/donation/remote/play-now/{alertID:int}", async ( int alertID, ClaimsPrincipal user, ISender sender, IHubContext donationHub, CancellationToken ct ) => { var memberID = user.GetRequiredMemberID(); var result = await sender.Send(new Application.Features.Api.DonationRemote.PlayNow.Command(alertID, memberID), ct); if (result.IsFailure) { return CustomResults.Problem(result); } var data = result.Value; // 위젯에 Alert 재 broadcast 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); return ApiResponse.Ok(data); }) .WithTags("DonationRemote") .RequireAuthorization(); } }