using Web.Api.Common; using Web.Api.Extensions; using Application.Abstractions.Messaging; using System.Security.Claims; namespace Web.Api.Endpoints.Payment; /// 토스 결제 취소 internal sealed class Cancel : IEndpoint { public sealed record Request(string OrderID, string? CancelReason); public void MapEndpoint(IEndpointRouteBuilder app) { /// 결제 전액 취소 (Paid 상태만 가능) → 토스 취소 API + 지갑 충전분 회수 app.MapPost("api/payments/cancel", async ( Request body, ClaimsPrincipal user, ISender sender, CancellationToken ct ) => { var memberID = user.GetRequiredMemberID(); var result = await sender.Send(new Application.Features.Api.Payment.Toss.Cancel.Command(body.OrderID, body.CancelReason, memberID), ct); if (result.IsFailure) { return CustomResults.Problem(result); } return ApiResponse.Ok(); }) .WithTags("Payment") .RequireAuthorization(); } }