diff --git a/src/main/java/in/koreatech/koin/domain/order/model/OrderDelivery.java b/src/main/java/in/koreatech/koin/domain/order/model/OrderDelivery.java index 24f7190..27bcd78 100644 --- a/src/main/java/in/koreatech/koin/domain/order/model/OrderDelivery.java +++ b/src/main/java/in/koreatech/koin/domain/order/model/OrderDelivery.java @@ -48,18 +48,24 @@ public class OrderDelivery { @Column(name = "delivery_tip", nullable = false, updatable = false) private Integer deliveryTip; + @NotNull + @Column(name = "provide_cutlery", nullable = false, updatable = false, columnDefinition = "TINYINT(1)") + private Boolean provideCutlery; + @Builder public OrderDelivery( Order order, String address, String toOwner, String toRider, + Boolean provideCutlery, Integer deliveryTip ) { this.order = order; this.address = address; this.toOwner = toOwner; this.toRider = toRider; + this.provideCutlery = provideCutlery; this.deliveryTip = deliveryTip; } } diff --git a/src/main/java/in/koreatech/koin/domain/order/model/OrderTakeout.java b/src/main/java/in/koreatech/koin/domain/order/model/OrderTakeout.java index 2da8610..ed5cc7c 100644 --- a/src/main/java/in/koreatech/koin/domain/order/model/OrderTakeout.java +++ b/src/main/java/in/koreatech/koin/domain/order/model/OrderTakeout.java @@ -34,12 +34,18 @@ public class OrderTakeout { @Column(name = "to_owner", length = 50, updatable = false) private String toOwner; + @NotNull + @Column(name = "provide_cutlery", nullable = false, updatable = false, columnDefinition = "TINYINT(1)") + private Boolean provideCutlery; + @Builder private OrderTakeout( Order order, - String toOwner + String toOwner, + Boolean provideCutlery ) { this.order = order; this.toOwner = toOwner; + this.provideCutlery = provideCutlery; } } diff --git a/src/main/java/in/koreatech/koin/domain/order/repository/OrderMenuRepository.java b/src/main/java/in/koreatech/koin/domain/order/repository/OrderMenuRepository.java index 6a1a195..5020d5c 100644 --- a/src/main/java/in/koreatech/koin/domain/order/repository/OrderMenuRepository.java +++ b/src/main/java/in/koreatech/koin/domain/order/repository/OrderMenuRepository.java @@ -1,5 +1,7 @@ package in.koreatech.koin.domain.order.repository; +import java.util.List; + import org.springframework.data.repository.Repository; import in.koreatech.koin.domain.order.model.OrderMenu; @@ -7,4 +9,6 @@ public interface OrderMenuRepository extends Repository { void saveAll(Iterable orderMenus); + + List findAllByOrderId(String orderId); } diff --git a/src/main/java/in/koreatech/koin/domain/order/repository/PaymentRepository.java b/src/main/java/in/koreatech/koin/domain/order/repository/PaymentRepository.java index 7e15e71..8a74e6e 100644 --- a/src/main/java/in/koreatech/koin/domain/order/repository/PaymentRepository.java +++ b/src/main/java/in/koreatech/koin/domain/order/repository/PaymentRepository.java @@ -17,4 +17,11 @@ default Payment getByPaymentKey(String paymentKey) { return findByPaymentKey(paymentKey) .orElseThrow(() -> PaymentNotFoundException.withDetail("paymentKey : " + paymentKey)); } + + Optional findById(Integer id); + + default Payment getById(Integer id) { + return findById(id) + .orElseThrow(() -> PaymentNotFoundException.withDetail("id : " + id)); + } } diff --git a/src/main/java/in/koreatech/payment/controller/PaymentsApi.java b/src/main/java/in/koreatech/payment/controller/PaymentsApi.java index 5d2d1fb..190d76b 100644 --- a/src/main/java/in/koreatech/payment/controller/PaymentsApi.java +++ b/src/main/java/in/koreatech/payment/controller/PaymentsApi.java @@ -1,6 +1,7 @@ package in.koreatech.payment.controller; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -13,6 +14,7 @@ import in.koreatech.payment.dto.request.TemporaryTakeoutPaymentSaveRequest; import in.koreatech.payment.dto.response.PaymentCancelResponse; import in.koreatech.payment.dto.response.PaymentConfirmResponse; +import in.koreatech.payment.dto.response.PaymentResponse; import in.koreatech.payment.dto.response.TemporaryPaymentResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -172,4 +174,12 @@ ResponseEntity cancelPayment( @RequestBody @Valid final PaymentCancelRequest request, @AccessToken final String accessToken ); + + @Operation(summary = "결제 단건 조회를 한다.") + @GetMapping("/{paymentId}") + ResponseEntity getPayment( + @Parameter(description = "결제 고유 ID", example = "1") + @PathVariable(value = "paymentId") final Integer paymentId, + @AccessToken final String accessToken + ); } diff --git a/src/main/java/in/koreatech/payment/controller/PaymentsController.java b/src/main/java/in/koreatech/payment/controller/PaymentsController.java index e39fbb2..39b65e1 100644 --- a/src/main/java/in/koreatech/payment/controller/PaymentsController.java +++ b/src/main/java/in/koreatech/payment/controller/PaymentsController.java @@ -3,13 +3,13 @@ import java.util.List; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import in.koreatech.koin.domain.order.model.Payment; import in.koreatech.koin.domain.order.model.PaymentCancel; import in.koreatech.payment.common.auth.AccessToken; import in.koreatech.payment.dto.request.PaymentCancelRequest; @@ -18,6 +18,7 @@ import in.koreatech.payment.dto.request.TemporaryTakeoutPaymentSaveRequest; import in.koreatech.payment.dto.response.PaymentCancelResponse; import in.koreatech.payment.dto.response.PaymentConfirmResponse; +import in.koreatech.payment.dto.response.PaymentResponse; import in.koreatech.payment.dto.response.TemporaryPaymentResponse; import in.koreatech.payment.service.PaymentService; import jakarta.validation.Valid; @@ -71,4 +72,13 @@ public ResponseEntity cancelPayment( PaymentCancelResponse response = PaymentCancelResponse.from(paymentCancels); return ResponseEntity.ok(response); } + + @GetMapping("/{paymentId}") + public ResponseEntity getPayment( + @PathVariable(value = "paymentId") final Integer paymentId, + @AccessToken final String accessToken + ) { + PaymentResponse response = paymentService.getPayment(accessToken, paymentId); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/in/koreatech/payment/dto/request/TemporaryDeliveryPaymentSaveRequest.java b/src/main/java/in/koreatech/payment/dto/request/TemporaryDeliveryPaymentSaveRequest.java index b8b4d29..24d94da 100644 --- a/src/main/java/in/koreatech/payment/dto/request/TemporaryDeliveryPaymentSaveRequest.java +++ b/src/main/java/in/koreatech/payment/dto/request/TemporaryDeliveryPaymentSaveRequest.java @@ -36,6 +36,10 @@ public record TemporaryDeliveryPaymentSaveRequest( @NotNull(message = "배달 팁은 필수 입력사항입니다.") Integer deliveryTip, + @Schema(description = "수저, 포크 수령 여부", example = "true", requiredMode = REQUIRED) + @NotNull(message = "수저, 포크 수령 여부는 필수 입력사항입니다.") + Boolean provideCutlery, + @Schema(description = "결제 금액", example = "10000", requiredMode = REQUIRED) @NotNull(message = "결제 금액은 필수 입력사항입니다.") Integer totalAmount diff --git a/src/main/java/in/koreatech/payment/dto/request/TemporaryTakeoutPaymentSaveRequest.java b/src/main/java/in/koreatech/payment/dto/request/TemporaryTakeoutPaymentSaveRequest.java index fc3b3da..25f2ab8 100644 --- a/src/main/java/in/koreatech/payment/dto/request/TemporaryTakeoutPaymentSaveRequest.java +++ b/src/main/java/in/koreatech/payment/dto/request/TemporaryTakeoutPaymentSaveRequest.java @@ -21,6 +21,10 @@ public record TemporaryTakeoutPaymentSaveRequest( @Schema(description = "사장님에게", example = "리뷰 이벤트 감사합니다.", requiredMode = NOT_REQUIRED) String toOwner, + @Schema(description = "수저, 포크 수령 여부", example = "true", requiredMode = REQUIRED) + @NotNull(message = "수저, 포크 수령 여부는 필수 입력사항입니다.") + Boolean provideCutlery, + @Schema(description = "메뉴 총 금액", example = "1234", requiredMode = REQUIRED) @NotNull(message = "메뉴 총 금액은 필수 입력사항입니다.") Integer totalMenuPrice, diff --git a/src/main/java/in/koreatech/payment/dto/response/PaymentConfirmResponse.java b/src/main/java/in/koreatech/payment/dto/response/PaymentConfirmResponse.java index 8f2d15d..c995b6a 100644 --- a/src/main/java/in/koreatech/payment/dto/response/PaymentConfirmResponse.java +++ b/src/main/java/in/koreatech/payment/dto/response/PaymentConfirmResponse.java @@ -40,6 +40,9 @@ public record PaymentConfirmResponse( @Schema(description = "라이더에게", example = "문 앞에 놔주세요.", requiredMode = NOT_REQUIRED) String toRider, + @Schema(description = "수저, 포크 수령 여부", example = "true", requiredMode = REQUIRED) + Boolean provideCutlery, + @Schema(description = "결제 금액", example = "1000", requiredMode = REQUIRED) Integer amount, @@ -118,15 +121,18 @@ public static PaymentConfirmResponse of( String deliveryAddress = null; String toOwner = null; String toRider = null; + Boolean provideCutlery = null; if (order.getOrderType() == DELIVERY) { OrderDelivery delivery = order.getOrderDelivery(); deliveryAddress = delivery.getAddress(); toOwner = delivery.getToOwner(); toRider = delivery.getToRider(); + provideCutlery = delivery.getProvideCutlery(); } else if (order.getOrderType() == TAKE_OUT) { OrderTakeout takeout = order.getOrderTakeout(); toOwner = takeout.getToOwner(); + provideCutlery = takeout.getProvideCutlery(); } return new PaymentConfirmResponse( @@ -135,6 +141,7 @@ public static PaymentConfirmResponse of( shop.getAddress(), toOwner, toRider, + provideCutlery, payment.getAmount(), shop.getName(), orderMenus.stream() diff --git a/src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java b/src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java new file mode 100644 index 0000000..e68606d --- /dev/null +++ b/src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java @@ -0,0 +1,156 @@ +package in.koreatech.payment.dto.response; + +import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import static in.koreatech.koin.domain.order.model.OrderType.DELIVERY; +import static in.koreatech.koin.domain.order.model.OrderType.TAKE_OUT; +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonNaming; + +import in.koreatech.koin.domain.order.model.Order; +import in.koreatech.koin.domain.order.model.OrderDelivery; +import in.koreatech.koin.domain.order.model.OrderMenu; +import in.koreatech.koin.domain.order.model.OrderMenuOption; +import in.koreatech.koin.domain.order.model.OrderTakeout; +import in.koreatech.koin.domain.order.model.Payment; +import in.koreatech.koin.domain.order.shop.model.entity.shop.OrderableShop; +import in.koreatech.koin.domain.shop.model.shop.Shop; +import io.swagger.v3.oas.annotations.media.Schema; + +@JsonNaming(value = SnakeCaseStrategy.class) +public record PaymentResponse( + @Schema(description = "결제 고유 id", example = "1", requiredMode = REQUIRED) + Integer id, + + @Schema(description = "배달 주소", example = "충청남도 천안시 동남구 병천면 충절로 1600 은솔관 422호", requiredMode = NOT_REQUIRED) + String deliveryAddress, + + @Schema(description = "가게 주소", example = "충청남도 천안시 동남구 병천면 충절로 1600 은솔관 422호", requiredMode = NOT_REQUIRED) + String shopAddress, + + @Schema(description = "사장님에게", example = "리뷰 이벤트 감사합니다.", requiredMode = NOT_REQUIRED) + String toOwner, + + @Schema(description = "라이더에게", example = "문 앞에 놔주세요.", requiredMode = NOT_REQUIRED) + String toRider, + + @Schema(description = "수저, 포크 수령 여부", example = "true", requiredMode = REQUIRED) + Boolean provideCutlery, + + @Schema(description = "결제 금액", example = "1000", requiredMode = REQUIRED) + Integer amount, + + @Schema(description = "상점 이름", example = "굿모닝 살로만 치킨", requiredMode = REQUIRED) + String shopName, + + @Schema(description = "주문 메뉴 목록", requiredMode = REQUIRED) + List menus, + + @Schema(description = "주문 방법", example = "DELIVERY", requiredMode = REQUIRED) + String orderType, + + @Schema(description = "결제 요청 일시", example = "2025.06.21 21:00", requiredMode = REQUIRED) + @JsonFormat(pattern = "yyyy.MM.dd HH:mm") + LocalDateTime requestedAt, + + @Schema(description = "결제 승인 일시", example = "2025.06.21 21:00", requiredMode = REQUIRED) + @JsonFormat(pattern = "yyyy.MM.dd HH:mm") + LocalDateTime approvedAt, + + @Schema(description = "결제 수단", example = "카드", requiredMode = REQUIRED) + String paymentMethod +) { + + @JsonNaming(value = SnakeCaseStrategy.class) + public record InnerCartItemResponse( + @Schema(description = "메뉴 이름", example = "허니콤보", requiredMode = REQUIRED) + String name, + + @Schema(description = "수량", example = "1", requiredMode = REQUIRED) + Integer quantity, + + @Schema(description = "선택한 옵션 목록", requiredMode = NOT_REQUIRED) + List options + ) { + public static InnerCartItemResponse from(OrderMenu orderMenu) { + List optionResponses = new ArrayList<>(); + + if (orderMenu.getOrderMenuOptions() != null && !orderMenu.getOrderMenuOptions().isEmpty()) { + optionResponses = orderMenu.getOrderMenuOptions().stream() + .map(InnerMenuOptionResponse::from) + .toList(); + } + + return new InnerCartItemResponse( + orderMenu.getMenuName(), + orderMenu.getQuantity(), + optionResponses + ); + } + } + + @JsonNaming(value = SnakeCaseStrategy.class) + public record InnerMenuOptionResponse( + @Schema(description = "옵션 그룹 이름", example = "소스 추가", requiredMode = NOT_REQUIRED) + String optionGroupName, + @Schema(description = "옵션 이름", example = "레드디핑 소스", requiredMode = REQUIRED) + String optionName + ) { + public static InnerMenuOptionResponse from(OrderMenuOption orderMenuOption) { + return new InnerMenuOptionResponse( + orderMenuOption.getOptionGroupName(), + orderMenuOption.getOptionName() + ); + } + } + + public static PaymentResponse of( + Payment payment, + Order order, + List orderMenus + ) { + OrderableShop orderableShop = order.getOrderableShop(); + Shop shop = orderableShop.getShop(); + + String deliveryAddress = null; + String toOwner = null; + String toRider = null; + Boolean provideCutlery = null; + + if (order.getOrderType() == DELIVERY) { + OrderDelivery delivery = order.getOrderDelivery(); + deliveryAddress = delivery.getAddress(); + toOwner = delivery.getToOwner(); + toRider = delivery.getToRider(); + provideCutlery = delivery.getProvideCutlery(); + } else if (order.getOrderType() == TAKE_OUT) { + OrderTakeout takeout = order.getOrderTakeout(); + toOwner = takeout.getToOwner(); + provideCutlery = takeout.getProvideCutlery(); + } + + return new PaymentResponse( + payment.getId(), + deliveryAddress, + shop.getAddress(), + toOwner, + toRider, + provideCutlery, + payment.getAmount(), + shop.getName(), + orderMenus.stream() + .map(InnerCartItemResponse::from) + .toList(), + order.getOrderType().name(), + payment.getRequestedAt(), + payment.getApprovedAt(), + payment.getPaymentMethod().getDisplayName() + ); + } +} diff --git a/src/main/java/in/koreatech/payment/model/redis/TemporaryPayment.java b/src/main/java/in/koreatech/payment/model/redis/TemporaryPayment.java index b0969a3..8ad2750 100644 --- a/src/main/java/in/koreatech/payment/model/redis/TemporaryPayment.java +++ b/src/main/java/in/koreatech/payment/model/redis/TemporaryPayment.java @@ -43,6 +43,8 @@ public class TemporaryPayment { private String toRider; + private Boolean provideCutlery; + private Integer totalProductPrice; private Integer deliveryFee; @@ -65,6 +67,7 @@ private TemporaryPayment( String address, String toOwner, String toRider, + Boolean provideCutlery, Integer totalProductPrice, Integer deliveryFee, Integer totalPrice, @@ -78,6 +81,7 @@ private TemporaryPayment( this.address = address; this.toOwner = toOwner; this.toRider = toRider; + this.provideCutlery = provideCutlery; this.totalProductPrice = totalProductPrice; this.deliveryFee = deliveryFee; this.totalPrice = totalPrice; @@ -94,6 +98,7 @@ public static TemporaryPayment toDeliveryEntity( String address, String toOwner, String toRider, + Boolean provideCutlery, Integer totalProductPrice, Integer deliveryFee, Integer totalPrice, @@ -108,6 +113,7 @@ public static TemporaryPayment toDeliveryEntity( address, toOwner, toRider, + provideCutlery, totalProductPrice, deliveryFee, totalPrice, @@ -121,6 +127,7 @@ public static TemporaryPayment toTakeOutEntity( Integer orderableShopId, String phoneNumber, String toOwner, + Boolean provideCutlery, Integer totalProductPrice, Integer totalPrice, List temporaryMenuItems @@ -134,6 +141,7 @@ public static TemporaryPayment toTakeOutEntity( null, toOwner, null, + provideCutlery, totalProductPrice, null, totalPrice, @@ -159,12 +167,14 @@ public Order toOrder(User user, OrderableShop orderableShop) { .address(address) .toOwner(toOwner) .toRider(toRider) + .provideCutlery(provideCutlery) .deliveryTip(deliveryFee) .build()); } else if (orderType == TAKE_OUT) { order.setOrderTakeout(OrderTakeout.builder() .order(order) .toOwner(toOwner) + .provideCutlery(provideCutlery) .build()); } diff --git a/src/main/java/in/koreatech/payment/service/PaymentService.java b/src/main/java/in/koreatech/payment/service/PaymentService.java index 7ab482e..d555885 100644 --- a/src/main/java/in/koreatech/payment/service/PaymentService.java +++ b/src/main/java/in/koreatech/payment/service/PaymentService.java @@ -6,10 +6,12 @@ import in.koreatech.payment.dto.request.TemporaryDeliveryPaymentSaveRequest; import in.koreatech.payment.dto.request.TemporaryTakeoutPaymentSaveRequest; import in.koreatech.payment.dto.response.PaymentConfirmResponse; +import in.koreatech.payment.dto.response.PaymentResponse; public interface PaymentService { String createTemporaryDeliveryPayment(String accessToken, TemporaryDeliveryPaymentSaveRequest request); String createTemporaryTakeoutPayment(String accessToken, TemporaryTakeoutPaymentSaveRequest request); PaymentConfirmResponse confirmPayment(String accessToken, String paymentKey, String orderId, Integer amount); List cancelPayment(String accessToken, String paymentKey, String cancelReason); + PaymentResponse getPayment(String accessToken, Integer paymentId); } diff --git a/src/main/java/in/koreatech/payment/service/TossService.java b/src/main/java/in/koreatech/payment/service/TossService.java index 3dc9827..421e68c 100644 --- a/src/main/java/in/koreatech/payment/service/TossService.java +++ b/src/main/java/in/koreatech/payment/service/TossService.java @@ -13,10 +13,12 @@ import in.koreatech.koin.domain.order.model.OrderMenu; import in.koreatech.koin.domain.order.model.Payment; import in.koreatech.koin.domain.order.model.PaymentCancel; +import in.koreatech.koin.domain.order.model.PaymentIdempotencyKey; import in.koreatech.koin.domain.order.model.PaymentStatus; import in.koreatech.koin.domain.order.repository.OrderMenuRepository; import in.koreatech.koin.domain.order.repository.OrderRepository; import in.koreatech.koin.domain.order.repository.PaymentCancelRepository; +import in.koreatech.koin.domain.order.repository.PaymentIdempotencyKeyRepository; import in.koreatech.koin.domain.order.repository.PaymentRepository; import in.koreatech.koin.domain.order.shop.model.entity.shop.OrderableShop; import in.koreatech.koin.domain.order.shop.repository.OrderableShopRepository; @@ -29,15 +31,14 @@ import in.koreatech.payment.dto.request.TemporaryDeliveryPaymentSaveRequest; import in.koreatech.payment.dto.request.TemporaryTakeoutPaymentSaveRequest; import in.koreatech.payment.dto.response.PaymentConfirmResponse; +import in.koreatech.payment.dto.response.PaymentResponse; import in.koreatech.payment.event.TossPaymentRollBackEvent; import in.koreatech.payment.exception.OrderPriceMismatchException; import in.koreatech.payment.exception.PaymentAlreadyCanceledException; import in.koreatech.payment.exception.PaymentCancelException; import in.koreatech.payment.exception.PaymentConfirmException; import in.koreatech.payment.model.domain.TemporaryMenuItems; -import in.koreatech.koin.domain.order.model.PaymentIdempotencyKey; import in.koreatech.payment.model.redis.TemporaryPayment; -import in.koreatech.koin.domain.order.repository.PaymentIdempotencyKeyRepository; import in.koreatech.payment.repository.redis.TemporaryPaymentRedisRepository; import in.koreatech.payment.util.OrderIdGenerator; import in.koreatech.payment.util.TemporaryMenuItemConverter; @@ -79,7 +80,9 @@ public String createTemporaryDeliveryPayment(String accessToken, TemporaryDelive || !request.deliveryTip().equals(deliveryFee) || !request.totalAmount().equals(finalAmount) ) { - throw OrderPriceMismatchException.withDetail("totalProductPrice : " + totalProductPrice + "deliveryFee : " + deliveryFee + "totalAmount : " + totalProductPrice + "finalAmount : " + finalAmount); + throw OrderPriceMismatchException.withDetail( + "totalProductPrice : " + totalProductPrice + "deliveryFee : " + deliveryFee + "totalAmount : " + + totalProductPrice + "finalAmount : " + finalAmount); } String orderId = orderIdGenerator.generateOrderId(); @@ -92,6 +95,7 @@ public String createTemporaryDeliveryPayment(String accessToken, TemporaryDelive request.address(), request.toOwner(), request.toRider(), + request.provideCutlery(), totalProductPrice, deliveryFee, finalAmount, @@ -117,7 +121,8 @@ public String createTemporaryTakeoutPayment(String accessToken, TemporaryTakeout if (!request.totalMenuPrice().equals(totalProductPrice) || !request.totalAmount().equals(finalAmount) ) { - throw OrderPriceMismatchException.withDetail("totalProductPrice : " + totalProductPrice + "finalAmount : " + finalAmount); + throw OrderPriceMismatchException.withDetail( + "totalProductPrice : " + totalProductPrice + "finalAmount : " + finalAmount); } String orderId = orderIdGenerator.generateOrderId(); @@ -128,6 +133,7 @@ public String createTemporaryTakeoutPayment(String accessToken, TemporaryTakeout orderableShop.getId(), request.phoneNumber(), request.toOwner(), + request.provideCutlery(), totalProductPrice, finalAmount, temporaryMenuItems @@ -138,7 +144,8 @@ public String createTemporaryTakeoutPayment(String accessToken, TemporaryTakeout } @Transactional - public PaymentConfirmResponse confirmPayment(String accessToken, String paymentKey, String orderId, Integer amount) { + public PaymentConfirmResponse confirmPayment(String accessToken, String paymentKey, String orderId, + Integer amount) { Integer userId = jwtTokenResolver.getUserId(accessToken); User user = userRepository.getById(userId); TemporaryPayment temporaryPayment = temporaryPaymentRedisRepository.getById(orderId); @@ -205,4 +212,16 @@ public List cancelPayment(String accessToken, String paymentKey, paymentCancelRepository.saveAll(paymentCancels); return paymentCancels; } + + public PaymentResponse getPayment(String accessToken, Integer paymentId) { + Integer userId = jwtTokenResolver.getUserId(accessToken); + User user = userRepository.getById(userId); + Payment payment = paymentRepository.getById(paymentId); + payment.validateUserIdMatches(user.getId()); + + Order order = payment.getOrder(); + List orderMenus = orderMenuRepository.findAllByOrderId(order.getId()); + + return PaymentResponse.of(payment, order, orderMenus); + } }