RemoteMarkDelivered.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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>리모콘 — Playing 상태 알림을 강제로 Delivered 처리 (위젯 stuck 시 정리용)</summary>
  10. internal sealed class RemoteMarkDelivered : IEndpoint
  11. {
  12. public void MapEndpoint(IEndpointRouteBuilder app)
  13. {
  14. app.MapPost("api/donation/remote/mark-delivered/{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.MarkDelivered.Command(alertID, memberID), ct);
  23. if (result.IsFailure)
  24. {
  25. return CustomResults.Problem(result);
  26. }
  27. await donationHub.Clients.Group(result.Value.WidgetToken).ReceiveAlertStatusUpdate(new
  28. {
  29. alertID = result.Value.AlertID,
  30. status = "delivered"
  31. });
  32. return ApiResponse.Ok();
  33. })
  34. .WithTags("DonationRemote")
  35. .RequireAuthorization();
  36. }
  37. }