From e2a6c3b724029e0c098e1e5277eff4009d8ba67a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Mon, 11 Aug 2025 23:09:06 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=EC=88=98=EC=A0=80.=ED=8F=AC?= =?UTF-8?q?=ED=81=AC=20=EC=88=98=EB=A0=B9=EC=97=AC=EB=B6=80=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/koreatech/koin/domain/order/model/OrderDelivery.java | 4 ++++ .../in/koreatech/koin/domain/order/model/OrderTakeout.java | 4 ++++ 2 files changed, 8 insertions(+) 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..3d7d74f 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,6 +48,10 @@ 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, 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..9a3891b 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,6 +34,10 @@ 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, From 3ba043f30adcccdd6271ddb70d0d96cfb17ef29a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Mon, 11 Aug 2025 23:10:33 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20=EC=88=98=EC=A0=80.=ED=8F=AC?= =?UTF-8?q?=ED=81=AC=20=EC=88=98=EB=A0=B9=EC=97=AC=EB=B6=80=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20DTO=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/TemporaryDeliveryPaymentSaveRequest.java | 4 ++++ .../dto/request/TemporaryTakeoutPaymentSaveRequest.java | 4 ++++ 2 files changed, 8 insertions(+) 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, From 0181a0345d35c93176d9f7174f960b702bf79d59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Mon, 11 Aug 2025 23:14:01 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=EC=88=98=EC=A0=80.=ED=8F=AC?= =?UTF-8?q?=ED=81=AC=20=EC=88=98=EB=A0=B9=EC=97=AC=EB=B6=80=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/domain/order/model/OrderDelivery.java | 2 ++ .../koin/domain/order/model/OrderTakeout.java | 4 +++- .../payment/model/redis/TemporaryPayment.java | 10 ++++++++++ .../java/in/koreatech/payment/service/TossService.java | 2 ++ 4 files changed, 17 insertions(+), 1 deletion(-) 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 3d7d74f..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 @@ -58,12 +58,14 @@ public OrderDelivery( 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 9a3891b..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 @@ -41,9 +41,11 @@ public class OrderTakeout { @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/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/TossService.java b/src/main/java/in/koreatech/payment/service/TossService.java index 3dc9827..37a5c08 100644 --- a/src/main/java/in/koreatech/payment/service/TossService.java +++ b/src/main/java/in/koreatech/payment/service/TossService.java @@ -92,6 +92,7 @@ public String createTemporaryDeliveryPayment(String accessToken, TemporaryDelive request.address(), request.toOwner(), request.toRider(), + request.provideCutlery(), totalProductPrice, deliveryFee, finalAmount, @@ -128,6 +129,7 @@ public String createTemporaryTakeoutPayment(String accessToken, TemporaryTakeout orderableShop.getId(), request.phoneNumber(), request.toOwner(), + request.provideCutlery(), totalProductPrice, finalAmount, temporaryMenuItems From fe42bf6658a4702e637f2ef1b0c5ca79f651784d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 12 Aug 2025 19:57:54 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20=EA=B2=B0=EC=A0=9C=20=EB=8B=A8?= =?UTF-8?q?=EA=B1=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EB=AA=85=EC=84=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/controller/PaymentsApi.java | 10 ++ .../payment/dto/response/PaymentResponse.java | 149 ++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java 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/dto/response/PaymentResponse.java b/src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java new file mode 100644 index 0000000..f83e506 --- /dev/null +++ b/src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java @@ -0,0 +1,149 @@ +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 = "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; + + if (order.getOrderType() == DELIVERY) { + OrderDelivery delivery = order.getOrderDelivery(); + deliveryAddress = delivery.getAddress(); + toOwner = delivery.getToOwner(); + toRider = delivery.getToRider(); + } else if (order.getOrderType() == TAKE_OUT) { + OrderTakeout takeout = order.getOrderTakeout(); + toOwner = takeout.getToOwner(); + } + + return new PaymentResponse( + payment.getId(), + deliveryAddress, + shop.getAddress(), + toOwner, + toRider, + payment.getAmount(), + shop.getName(), + orderMenus.stream() + .map(InnerCartItemResponse::from) + .toList(), + order.getOrderType().name(), + payment.getRequestedAt(), + payment.getApprovedAt(), + payment.getPaymentMethod().getDisplayName() + ); + } +} From f1698e8164202bb85994f3ce22e17c802187c6d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 12 Aug 2025 20:10:55 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=EA=B2=B0=EC=A0=9C=20=EB=8B=A8?= =?UTF-8?q?=EA=B1=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/repository/OrderMenuRepository.java | 4 ++++ .../domain/order/repository/PaymentRepository.java | 7 +++++++ .../payment/controller/PaymentsController.java | 12 ++++++++++++ .../koreatech/payment/service/PaymentService.java | 2 ++ .../in/koreatech/payment/service/TossService.java | 13 +++++++++++++ 5 files changed, 38 insertions(+) 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/PaymentsController.java b/src/main/java/in/koreatech/payment/controller/PaymentsController.java index e39fbb2..634b383 100644 --- a/src/main/java/in/koreatech/payment/controller/PaymentsController.java +++ b/src/main/java/in/koreatech/payment/controller/PaymentsController.java @@ -3,6 +3,7 @@ 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; @@ -18,8 +19,10 @@ 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 io.swagger.v3.oas.annotations.Parameter; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -71,4 +74,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/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 37a5c08..f2910c0 100644 --- a/src/main/java/in/koreatech/payment/service/TossService.java +++ b/src/main/java/in/koreatech/payment/service/TossService.java @@ -29,6 +29,7 @@ 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; @@ -207,4 +208,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); + } } From ce46eca4c747c9fbde28df388715c670bfdb9d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 12 Aug 2025 20:11:20 +0900 Subject: [PATCH 6/7] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A9=A7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/controller/PaymentsController.java | 2 -- .../in/koreatech/payment/service/TossService.java | 14 +++++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/in/koreatech/payment/controller/PaymentsController.java b/src/main/java/in/koreatech/payment/controller/PaymentsController.java index 634b383..39b65e1 100644 --- a/src/main/java/in/koreatech/payment/controller/PaymentsController.java +++ b/src/main/java/in/koreatech/payment/controller/PaymentsController.java @@ -10,7 +10,6 @@ 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; @@ -22,7 +21,6 @@ import in.koreatech.payment.dto.response.PaymentResponse; import in.koreatech.payment.dto.response.TemporaryPaymentResponse; import in.koreatech.payment.service.PaymentService; -import io.swagger.v3.oas.annotations.Parameter; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/in/koreatech/payment/service/TossService.java b/src/main/java/in/koreatech/payment/service/TossService.java index f2910c0..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; @@ -36,9 +38,7 @@ 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; @@ -80,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(); @@ -119,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(); @@ -141,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); From 5287fa8013bb99b67f4ba137ab7af64ff37567ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 12 Aug 2025 20:15:46 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat:=20=EC=88=98=EC=A0=80,=20=ED=8F=AC?= =?UTF-8?q?=ED=81=AC=20=EC=88=98=EB=A0=B9=20=EC=97=AC=EB=B6=80=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/dto/response/PaymentConfirmResponse.java | 7 +++++++ .../in/koreatech/payment/dto/response/PaymentResponse.java | 7 +++++++ 2 files changed, 14 insertions(+) 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 index f83e506..e68606d 100644 --- a/src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java +++ b/src/main/java/in/koreatech/payment/dto/response/PaymentResponse.java @@ -40,6 +40,9 @@ public record PaymentResponse( @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 PaymentResponse 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 PaymentResponse( @@ -135,6 +141,7 @@ public static PaymentResponse of( shop.getAddress(), toOwner, toRider, + provideCutlery, payment.getAmount(), shop.getName(), orderMenus.stream()