From ec93fe65b2471f819a2eaefbf5d86133727a867c Mon Sep 17 00:00:00 2001 From: pbem22 Date: Fri, 23 Jan 2026 17:00:14 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20#190=20=EA=B0=9C=EB=B0=9C=EC=9E=90?= =?UTF-8?q?=EC=9A=A9=20=EC=A3=BC=EB=AC=B8=20=EC=83=81=ED=83=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/DeliveryRepository.java | 2 ++ .../sopt/poti/domain/order/entity/Order.java | 4 +++ .../payment/repository/PaymentRepository.java | 2 ++ .../sopt/poti/global/dev/DevController.java | 15 +++++++++ .../org/sopt/poti/global/dev/DevService.java | 32 ++++++++++++++++++- 5 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/poti/domain/delivery/repository/DeliveryRepository.java b/src/main/java/org/sopt/poti/domain/delivery/repository/DeliveryRepository.java index 880a9ac..3c312f4 100644 --- a/src/main/java/org/sopt/poti/domain/delivery/repository/DeliveryRepository.java +++ b/src/main/java/org/sopt/poti/domain/delivery/repository/DeliveryRepository.java @@ -14,4 +14,6 @@ public interface DeliveryRepository extends JpaRepository { boolean existsDeliveryByOrderId(Long orderId); Optional findTopByOrder_IdOrderByIdDesc(Long orderId); + + void deleteByOrder_Id(Long orderId); } diff --git a/src/main/java/org/sopt/poti/domain/order/entity/Order.java b/src/main/java/org/sopt/poti/domain/order/entity/Order.java index 1851ecb..d63a5a2 100644 --- a/src/main/java/org/sopt/poti/domain/order/entity/Order.java +++ b/src/main/java/org/sopt/poti/domain/order/entity/Order.java @@ -151,4 +151,8 @@ public void completeDelivery() { this.status = OrderStatus.DELIVERED; } + public void updateStatus(OrderStatus status) { + this.status = status; + } + } \ No newline at end of file diff --git a/src/main/java/org/sopt/poti/domain/payment/repository/PaymentRepository.java b/src/main/java/org/sopt/poti/domain/payment/repository/PaymentRepository.java index da52439..f246e79 100644 --- a/src/main/java/org/sopt/poti/domain/payment/repository/PaymentRepository.java +++ b/src/main/java/org/sopt/poti/domain/payment/repository/PaymentRepository.java @@ -6,4 +6,6 @@ public interface PaymentRepository extends JpaRepository { boolean existsByOrder_Id(Long orderId); + + void deleteByOrder_Id(Long orderId); } \ No newline at end of file diff --git a/src/main/java/org/sopt/poti/global/dev/DevController.java b/src/main/java/org/sopt/poti/global/dev/DevController.java index baf4605..aaf026d 100644 --- a/src/main/java/org/sopt/poti/global/dev/DevController.java +++ b/src/main/java/org/sopt/poti/global/dev/DevController.java @@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor; import org.sopt.poti.domain.auth.entity.RefreshToken; import org.sopt.poti.domain.auth.repository.RefreshTokenRepository; +import org.sopt.poti.domain.order.entity.OrderStatus; import org.sopt.poti.domain.user.entity.User; import org.sopt.poti.domain.user.service.UserService; import org.sopt.poti.global.common.ApiResponse; @@ -18,6 +19,8 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -72,4 +75,16 @@ public ResponseEntity> hardDeleteMe( ApiResponse.success(SuccessStatus.OK) ); } + + @PatchMapping("/orders/{orderId}/status") + @Operation(summary = "주문 상태 강제 변경", description = "테스트를 위해 특정 주문의 상태를 강제로 변경합니다. (WAIT_PAY로 변경 시 연관 데이터 삭제됨)") + public ResponseEntity> resetOrderStatus( + @PathVariable Long orderId, + @RequestParam OrderStatus status + ) { + devService.resetOrderStatus(orderId, status); + return ResponseEntity.ok( + ApiResponse.success(SuccessStatus.OK) + ); + } } \ No newline at end of file diff --git a/src/main/java/org/sopt/poti/global/dev/DevService.java b/src/main/java/org/sopt/poti/global/dev/DevService.java index db8ac3f..5985901 100644 --- a/src/main/java/org/sopt/poti/global/dev/DevService.java +++ b/src/main/java/org/sopt/poti/global/dev/DevService.java @@ -2,16 +2,24 @@ import java.util.List; import lombok.RequiredArgsConstructor; +import org.sopt.poti.domain.delivery.repository.DeliveryRepository; import org.sopt.poti.domain.groupbuy.entity.GroupBuyOption; import org.sopt.poti.domain.groupbuy.entity.GroupBuyPost; import org.sopt.poti.domain.groupbuy.repository.GroupBuyRepository; +import org.sopt.poti.domain.order.entity.Order; +import org.sopt.poti.domain.order.entity.OrderStatus; import org.sopt.poti.domain.order.repository.OrderItemRepository; import org.sopt.poti.domain.order.repository.OrderRepository; +import org.sopt.poti.domain.payment.repository.PaymentRepository; import org.sopt.poti.domain.user.repository.UserRepository; +import org.sopt.poti.global.error.BusinessException; +import org.sopt.poti.global.error.ErrorStatus; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +// ... (기존 imports) + @Service @RequiredArgsConstructor @Profile({"local", "dev"}) @@ -21,10 +29,11 @@ public class DevService { private final GroupBuyRepository groupBuyRepository; private final OrderRepository orderRepository; private final OrderItemRepository orderItemRepository; + private final PaymentRepository paymentRepository; // 추가 + private final DeliveryRepository deliveryRepository; // 추가 @Transactional public void hardDeleteUser(Long userId) { - // 1. 유저가 총대로서 올린 게시글과 관련된 '타인의 주문 내역(OrderItem)' 삭제 List myPosts = groupBuyRepository.findAllByLeaderId(userId); List myOptionIds = myPosts.stream() @@ -45,4 +54,25 @@ public void hardDeleteUser(Long userId) { // 4. 유저 삭제 userRepository.deleteById(userId); } + + // 주문 상태 강제 변경 (테스트용) + @Transactional + public void resetOrderStatus(Long orderId, OrderStatus targetStatus) { + Order order = orderRepository.findById(orderId) + .orElseThrow(() -> new BusinessException(ErrorStatus.ORDER_NOT_FOUND)); + + // 목표 상태에 따라 연관 데이터 정리 + if (targetStatus == OrderStatus.WAIT_PAY) { + // WAIT_PAY로 초기화 시, 입금 정보와 운송장 정보 모두 삭제 + paymentRepository.deleteByOrder_Id(orderId); + deliveryRepository.deleteByOrder_Id(orderId); + } else if (targetStatus == OrderStatus.WAIT_PAY_CHECK || targetStatus == OrderStatus.PAID) { + // WAIT_PAY_CHECK 또는 PAID로 초기화 시, 운송장 정보만 삭제 (입금 정보는 유지) + deliveryRepository.deleteByOrder_Id(orderId); + } + // SHIPPED, DELIVERED 등 그 이상 상태로 변경 시에는 삭제할 것이 없음 + + // 주문 상태 변경 적용 + order.updateStatus(targetStatus); + } } From a99275659ed8ba40e7e75b440b11f8fd9bf1e94b Mon Sep 17 00:00:00 2001 From: pbem22 Date: Fri, 23 Jan 2026 18:32:01 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20#193=20=EC=8A=A4=EC=9B=A8=EA=B1=B0?= =?UTF-8?q?=20=EB=A7=89=EA=B8=B0=20=EA=B4=91=EC=95=BC=EC=9D=98=20=EA=B2=83?= =?UTF-8?q?=20=ED=83=90=20=EB=82=B4=EC=A7=80=EB=A7=88=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d3c61b5..4ae665c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -9,7 +9,8 @@ server: multipart: max-file-size: 10MB max-request-size: 10MB - + forward-headers-strategy: framework + spring: application: name: poti-server @@ -94,6 +95,18 @@ logging: root: INFO org.sopt: DEBUG +springdoc: + api-docs: + path: /v3/api-docs # JSON 데이터 경로 + enabled: true + swagger-ui: + path: /swagger-ui/index.html # UI 접속 경로 + enabled: true + groups-order: DESC # 그룹 정렬 순서 + operations-sorter: method # 메소드 순서대로 정렬 + disable-swagger-default-url: true # 기본 petstore URL 끄기 + display-request-duration: true # 요청 소요 시간 표시 + discord: webhook-url: ${DISCORD_WEBHOOK}