From 65a8a913d3c044f7f5842fcc57e7c743b66dd741 Mon Sep 17 00:00:00 2001 From: YouSeok518 Date: Wed, 15 Oct 2025 22:25:24 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9E=A5=EB=B0=94=EA=B5=AC=EB=8B=88=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EC=84=A0=ED=83=9D=20api=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cart/controller/CartController.java | 12 +++++++++ .../back/domain/cart/service/CartService.java | 26 +++++++++++++++++++ .../controller/ReviewControllerTest.java | 3 ++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/back/domain/cart/controller/CartController.java b/src/main/java/com/back/domain/cart/controller/CartController.java index 4d9a63a0..a6265e3d 100644 --- a/src/main/java/com/back/domain/cart/controller/CartController.java +++ b/src/main/java/com/back/domain/cart/controller/CartController.java @@ -101,6 +101,18 @@ public ResponseEntity> toggleSelection( return ResponseEntity.ok(RsData.of("200", "선택 상태가 변경되었습니다.", responseDto)); } + @PutMapping("/toggle-all-selection") + @Operation(summary = "장바구니 전체 선택 토글", description = "모든 장바구니 아이템의 선택 상태를 일괄 변경합니다.") + public ResponseEntity>> toggleAllSelection( + @AuthenticationPrincipal CustomUserDetails customUserDetails, + @RequestParam boolean isSelected) { + + User user = customUserDetails.getUser(); + List responseDtos = cartService.toggleAllSelection(user, isSelected); + String message = isSelected ? "모든 장바구니 아이템이 선택되었습니다." : "모든 장바구니 아이템이 해제되었습니다."; + return ResponseEntity.ok(RsData.of("200", message, responseDtos)); + } + @GetMapping("/selected") @Operation( summary = "선택된 장바구니 아이템 조회", diff --git a/src/main/java/com/back/domain/cart/service/CartService.java b/src/main/java/com/back/domain/cart/service/CartService.java index 25258027..e1a405d0 100644 --- a/src/main/java/com/back/domain/cart/service/CartService.java +++ b/src/main/java/com/back/domain/cart/service/CartService.java @@ -219,6 +219,32 @@ public CartResponseDto toggleSelection(User user, Long cartId) { return CartResponseDto.from(updatedCart); } + /** + * 장바구니 전체 선택 토글 + */ + @Transactional + public List toggleAllSelection(User user, boolean isSelected) { + // 1. 사용자의 모든 장바구니 아이템 조회 (상품/펀딩 fetch join) + List userCarts = cartRepository.findByUserWithProduct(user); + + // 2. 모든 아이템의 선택 상태를 일괄 변경 + for (Cart cart : userCarts) { + if (isSelected) { + cart.select(); + } else { + cart.unselect(); + } + } + + // 3. 일괄 저장 + List updatedCarts = cartRepository.saveAll(userCarts); + + // 4. 응답 DTO 변환 + return updatedCarts.stream() + .map(CartResponseDto::from) + .collect(Collectors.toList()); + } + /** * 선택된 장바구니 아이템 조회 * @param user 사용자 diff --git a/src/test/java/com/back/domain/review/controller/ReviewControllerTest.java b/src/test/java/com/back/domain/review/controller/ReviewControllerTest.java index fbe2ff24..89de466c 100644 --- a/src/test/java/com/back/domain/review/controller/ReviewControllerTest.java +++ b/src/test/java/com/back/domain/review/controller/ReviewControllerTest.java @@ -256,7 +256,8 @@ void getReviewStats_Success() throws Exception { // When & Then mockMvc.perform(get("/api/reviews/stats") - .param("productUuid", TEST_PRODUCT_UUID.toString())) + .param("productUuid", TEST_PRODUCT_UUID.toString()) + .with(user(customUserDetails))) .andExpect(status().isOk()); }