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()); }