RemotePlayNow.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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>리모콘 — 즉시 재생 (Queue/Failed/Skipped/Ignored/Delivered 알림을 위젯에 다시 broadcast)</summary>
  10. internal sealed class RemotePlayNow : IEndpoint
  11. {
  12. public void MapEndpoint(IEndpointRouteBuilder app)
  13. {
  14. app.MapPost("api/donation/remote/play-now/{alertID:int}", async (
  15. int alertID,
  16. ClaimsPrincipal user,
  17. ISender sender,
  18. IHubContext<DonationHub, IDonationHubClient> donationHub,
  19. CancellationToken ct
  20. ) => {
  21. var memberID = user.GetRequiredMemberID();
  22. var result = await sender.Send(new Application.Features.Api.DonationRemote.PlayNow.Command(alertID, memberID), ct);
  23. if (result.IsFailure)
  24. {
  25. return CustomResults.Problem(result);
  26. }
  27. var data = result.Value;
  28. // 위젯에 Alert 재 broadcast
  29. var alertPayload = new
  30. {
  31. alertID = data.AlertID,
  32. donationID = data.DonationID,
  33. correlationID = data.CorrelationID,
  34. sponsorMemberID = memberID,
  35. sendName = data.SendName,
  36. amount = data.Amount,
  37. netAmount = data.NetAmount,
  38. message = data.Message,
  39. channelID = data.ChannelID,
  40. channelName = data.ChannelName,
  41. crewMemberID = data.CrewMemberID,
  42. crewMemberNickname = data.CrewMemberNickname,
  43. isTest = data.IsTest,
  44. createdAt = DateTime.UtcNow
  45. };
  46. await donationHub.Clients.Group(data.WidgetToken).ReceiveAlert(alertPayload);
  47. return ApiResponse.Ok(data);
  48. })
  49. .WithTags("DonationRemote")
  50. .RequireAuthorization();
  51. }
  52. }