RemoteState.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using Application.Abstractions.Hub;
  2. using Infrastructure.Hubs;
  3. using Web.Api.Common;
  4. using MediatR;
  5. using Microsoft.AspNetCore.SignalR;
  6. namespace Web.Api.Endpoints.Donation;
  7. /// <summary>후원 리모콘 상태 관리</summary>
  8. internal sealed class RemoteState : IEndpoint
  9. {
  10. public void MapEndpoint(IEndpointRouteBuilder app)
  11. {
  12. /// 일시정지/후원수신/음성만/영상만 상태 + 대기열 조회
  13. app.MapGet("api/donation/remote/state/{widgetToken}", async (
  14. string widgetToken,
  15. ISender sender,
  16. CancellationToken ct
  17. ) => {
  18. var data = await sender.Send(new Application.Features.Api.DonationRemote.GetState.Query(widgetToken), ct);
  19. return ApiResponse.Ok(data);
  20. })
  21. .WithTags("DonationRemote")
  22. .RequireAuthorization();
  23. /// 리모콘 상태 변경 (isPaused, isAccepting, isAudioOnly, isVideoOnly)
  24. app.MapPost("api/donation/remote/state", async (
  25. Application.Features.Api.DonationRemote.UpdateState.Command body,
  26. ISender sender,
  27. IHubContext<DonationHub, IDonationHubClient> donationHub,
  28. CancellationToken ct
  29. ) => {
  30. await sender.Send(body, ct);
  31. // 위젯 + 리모콘 모두에게 상태 변경 broadcast
  32. await donationHub.Clients.Group(body.WidgetToken).ReceiveState(new
  33. {
  34. isPaused = body.IsPaused,
  35. isAccepting = body.IsAccepting,
  36. isAudioOnly = body.IsAudioOnly,
  37. isVideoOnly = body.IsVideoOnly
  38. });
  39. return ApiResponse.Ok();
  40. })
  41. .WithTags("DonationRemote")
  42. .RequireAuthorization();
  43. }
  44. }