From f30e4c806b2018e9a486960bbc05cfd27af586e5 Mon Sep 17 00:00:00 2001 From: Bae Hyeonseo Date: Fri, 15 Sep 2023 21:42:41 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B9=B4=ED=8A=B8=EB=AC=B8=EC=A0=9C,=20?= =?UTF-8?q?=EC=A0=9C=ED=92=88=20=EC=95=84=EC=9D=B4=EB=94=94=EB=B3=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/gip/sever/ResponseMessage.java | 5 +- .../gip/sever/controller/CartController.java | 22 ++++-- src/main/java/gip/sever/domain/Cart.java | 4 +- src/main/java/gip/sever/domain/CartItem.java | 1 - src/main/java/gip/sever/domain/Product.java | 2 + .../gip/sever/dto/response/CartResponse.java | 31 -------- .../sever/dto/response/CartResponseDto.java | 75 +++++++++++++++++++ .../sever/dto/response/ProductResponse.java | 2 + .../global/response/SuccessResponse.java | 4 +- .../sever/repository/CartItemRepository.java | 2 +- .../java/gip/sever/service/CartService.java | 56 +++++++++----- 11 files changed, 141 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/gip/sever/dto/response/CartResponse.java create mode 100644 src/main/java/gip/sever/dto/response/CartResponseDto.java diff --git a/src/main/java/gip/sever/ResponseMessage.java b/src/main/java/gip/sever/ResponseMessage.java index b799ca3..3e97ef0 100644 --- a/src/main/java/gip/sever/ResponseMessage.java +++ b/src/main/java/gip/sever/ResponseMessage.java @@ -6,6 +6,7 @@ @Getter @RequiredArgsConstructor public enum ResponseMessage { + POST_PRODUCT_SUCCESS("장바구니에 제품 추가를 완료 했습니다."), GET_ARTICLE_SUCCESS("기사 조회를 완료 했습니다."), GET_PRODUCT_SUCCESS("제품 조회를 완료 했습니다."), GET_CART_SUCCESS("장바구니 조회를 완료 했습니다."), @@ -15,7 +16,9 @@ public enum ResponseMessage { MAIL_SUCCESS("데모 신청이 완료되었습니다"), ADDITIONAL_INFO_NEED("추가정보 기입이 필요합니다"), LOGIN_SUCCESS("로그인 성공"), - ADDITIONAL_INFO_SUCCESS("추가 정보 기입이 완료되었습니다"); + ADDITIONAL_INFO_SUCCESS("추가 정보 기입이 완료되었습니다"), + DELETE_PRODUCT_SUCCESS("제품 삭제가 완료되었습니다"), + FALSE_PRODUCT("제품이 이미 있습니다"); private final String message; diff --git a/src/main/java/gip/sever/controller/CartController.java b/src/main/java/gip/sever/controller/CartController.java index cdf1296..5b45fe1 100644 --- a/src/main/java/gip/sever/controller/CartController.java +++ b/src/main/java/gip/sever/controller/CartController.java @@ -2,15 +2,15 @@ import gip.sever.dto.request.CartRequest; -import gip.sever.dto.response.CartResponse; +//import gip.sever.dto.response.CartResponse; +import gip.sever.dto.response.CartResponseDto; import gip.sever.global.response.SuccessResponse; import gip.sever.service.CartService; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import static gip.sever.ResponseMessage.GET_CART_SUCCESS; +import static gip.sever.ResponseMessage.*; @RestController @RequiredArgsConstructor @@ -20,20 +20,26 @@ public class CartController { private final CartService cartService; @PostMapping("/add") - public void addToCart(@RequestBody CartRequest cartRequest) throws Exception { - cartService.addToCart(cartRequest.getMemberId(), cartRequest.getProductId()); + public ResponseEntity> addToCart(@RequestBody CartRequest cartRequest) throws Exception { + boolean add =cartService.addToCart(cartRequest.getMemberId(), cartRequest.getProductId()); + if (add) { + return ResponseEntity.ok(SuccessResponse.create(POST_PRODUCT_SUCCESS.getMessage())); + } else { + return ResponseEntity.ok(SuccessResponse.creat(FALSE_PRODUCT.getMessage())); + } } @DeleteMapping("/remove") - public void removeFromCart(@RequestBody CartRequest cartRequest) throws Exception { + public ResponseEntity> removeFromCart(@RequestBody CartRequest cartRequest) throws Exception { cartService.removeFromCart(cartRequest.getMemberId(), cartRequest.getProductId()); + return ResponseEntity.ok(SuccessResponse.create(DELETE_PRODUCT_SUCCESS.getMessage())); } @GetMapping("/{memberId}") - public ResponseEntity> getCart(@PathVariable Long memberId) throws Exception { - return ResponseEntity.ok(SuccessResponse.create(GET_CART_SUCCESS.getMessage(), cartService.getCart(memberId))); + public CartResponseDto.CartResponse getCart(@PathVariable Long memberId) throws Exception { + return cartService.getCart(memberId); } diff --git a/src/main/java/gip/sever/domain/Cart.java b/src/main/java/gip/sever/domain/Cart.java index 96dbbe9..8890f59 100644 --- a/src/main/java/gip/sever/domain/Cart.java +++ b/src/main/java/gip/sever/domain/Cart.java @@ -1,5 +1,6 @@ package gip.sever.domain; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,9 +16,8 @@ public class Cart { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "cart_id") private Long id; - @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL, orphanRemoval = true) - private List cartItems = new ArrayList<>(); + private List cartItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") diff --git a/src/main/java/gip/sever/domain/CartItem.java b/src/main/java/gip/sever/domain/CartItem.java index 4d2e688..dcebf1f 100644 --- a/src/main/java/gip/sever/domain/CartItem.java +++ b/src/main/java/gip/sever/domain/CartItem.java @@ -18,7 +18,6 @@ public class CartItem { @JoinColumn(name = "cart_id") private Cart cart; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "product_id") private Product product; diff --git a/src/main/java/gip/sever/domain/Product.java b/src/main/java/gip/sever/domain/Product.java index dc15a05..db1ce30 100644 --- a/src/main/java/gip/sever/domain/Product.java +++ b/src/main/java/gip/sever/domain/Product.java @@ -4,6 +4,8 @@ import lombok.NoArgsConstructor; import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; @Entity @NoArgsConstructor diff --git a/src/main/java/gip/sever/dto/response/CartResponse.java b/src/main/java/gip/sever/dto/response/CartResponse.java deleted file mode 100644 index 3fddf17..0000000 --- a/src/main/java/gip/sever/dto/response/CartResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -package gip.sever.dto.response; - -import gip.sever.domain.Cart; -import gip.sever.domain.CartItem; -import gip.sever.domain.Member; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import java.util.ArrayList; -import java.util.List; - -@Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class CartResponse { - - private Long id; - private List cartItems = new ArrayList<>(); - - - public CartResponse(Cart cart) { - - this.cartItems=cart.getCartItems(); - this.id=cart.getId(); - - } -} diff --git a/src/main/java/gip/sever/dto/response/CartResponseDto.java b/src/main/java/gip/sever/dto/response/CartResponseDto.java new file mode 100644 index 0000000..cd17d26 --- /dev/null +++ b/src/main/java/gip/sever/dto/response/CartResponseDto.java @@ -0,0 +1,75 @@ +package gip.sever.dto.response; + +import gip.sever.domain.Cart; +import gip.sever.domain.CartItem; +import gip.sever.domain.Product; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@Builder +@AllArgsConstructor +public class CartResponseDto { + + @Getter + @NoArgsConstructor + public static class CartResponse { + private Long id; + private List cartItems = new ArrayList<>(); + + + public CartResponse(Cart cart) { + + this.cartItems = cart.getCartItems().stream() + .map(cartItem -> new CartItemDto(cartItem)) + .collect(Collectors.toList()); + this.id = cart.getId(); + + } + } + @Getter + public static class CartItemDto{ + private Long id; + private ProductDto product ; + + public CartItemDto(CartItem cartItem){ + this.id = cartItem.getId(); + this.product = new ProductDto(cartItem.getProduct()); + + } + } + + @Getter + public static class ProductDto{ + private Long id; + + private String productName; + private double price; + private String photoUrl; + private int likes; + private String kind; + // 부가설명 필드 추가 + private String additionalDescription; + + // 장바구니 필드 + private boolean isInCart; // 제품이 장바구니에 있는지 여부 + private int quantity; // 제품의 수량 + public ProductDto(Product product) { + this.id=product.getId(); + this.productName = product.getProductName(); + this.price = product.getPrice(); + this.photoUrl = product.getPhotoUrl(); + this.likes = product.getLikes(); + this.isInCart = product.isInCart(); + this.quantity = product.getQuantity(); + this.kind = product.getKind(); + this.additionalDescription =product.getAdditionalDescription(); + } + } +} diff --git a/src/main/java/gip/sever/dto/response/ProductResponse.java b/src/main/java/gip/sever/dto/response/ProductResponse.java index 450663e..936c19d 100644 --- a/src/main/java/gip/sever/dto/response/ProductResponse.java +++ b/src/main/java/gip/sever/dto/response/ProductResponse.java @@ -15,6 +15,7 @@ public class ProductResponse { private double price; private String photoUrl; private int likes; + private String kind; // 부가설명 필드 추가 private String additionalDescription; @@ -28,6 +29,7 @@ public ProductResponse(Product product) { this.likes = product.getLikes(); this.isInCart = product.isInCart(); this.quantity = product.getQuantity(); + this.kind = product.getKind(); this.additionalDescription =product.getAdditionalDescription(); } } diff --git a/src/main/java/gip/sever/global/response/SuccessResponse.java b/src/main/java/gip/sever/global/response/SuccessResponse.java index a226cbb..7fe183e 100644 --- a/src/main/java/gip/sever/global/response/SuccessResponse.java +++ b/src/main/java/gip/sever/global/response/SuccessResponse.java @@ -18,7 +18,9 @@ public class SuccessResponse { public static SuccessResponse create(String message) { return new SuccessResponse<>(true, message, null); } - + public static SuccessResponse creat(String message) { + return new SuccessResponse<>(false, message, null); + } public static SuccessResponse create(String message, T data) { return new SuccessResponse<>(true, message, data); } diff --git a/src/main/java/gip/sever/repository/CartItemRepository.java b/src/main/java/gip/sever/repository/CartItemRepository.java index f8c0f50..5eb6b3d 100644 --- a/src/main/java/gip/sever/repository/CartItemRepository.java +++ b/src/main/java/gip/sever/repository/CartItemRepository.java @@ -1,5 +1,5 @@ package gip.sever.repository; - +import gip.sever.domain.Cart; import gip.sever.domain.CartItem; import org.hibernate.annotations.Parameter; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/gip/sever/service/CartService.java b/src/main/java/gip/sever/service/CartService.java index c3a161c..dbe1d8c 100644 --- a/src/main/java/gip/sever/service/CartService.java +++ b/src/main/java/gip/sever/service/CartService.java @@ -3,12 +3,11 @@ import gip.sever.domain.Cart; import gip.sever.domain.CartItem; import gip.sever.domain.Product; -import gip.sever.dto.response.CartResponse; +import gip.sever.dto.response.CartResponseDto; import gip.sever.repository.CartItemRepository; import gip.sever.repository.CartRepository; import gip.sever.repository.ProductRepository; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,37 +21,58 @@ public class CartService { private final ProductRepository productRepository; private final CartItemRepository cartItemRepository; + /* @Transactional + public void addToCart(Long memberId, Long productId) throws Exception{ + Cart cart = cartRepository.findByMemberId(memberId) + .orElseThrow(() -> new Exception("계정을 찾을 수 없습니다."));; + Product product = productRepository.findById(productId).orElseThrow(() -> new IllegalArgumentException("Product not found")); +// cart.addProduct(product); + cartRepository.save(cart); + }*/ + @Transactional + public boolean addToCart(Long memberId, Long productId) throws Exception { + Cart cart = cartRepository.findByMemberId(memberId) + .orElseThrow(() -> new Exception("계정을 찾을 수 없습니다.")); + + Product product = productRepository.findById(productId) + .orElseThrow(() -> new IllegalArgumentException("Product not found")); + + + boolean isAlreadyInCart = cart.getCartItems().stream() + .anyMatch(cartItem -> cartItem.getProduct().equals(product)); + + if (isAlreadyInCart) { + return false; + } else { + CartItem cartItem = new CartItem(cart, product); + cart.getCartItems().add(cartItem); + cartRepository.save(cart); + return true; + } + } @Transactional - public void addToCart(Long memberId, Long productId) throws Exception { + public boolean removeFromCart(Long memberId, Long productId) throws Exception{ Cart cart = cartRepository.findByMemberId(memberId) .orElseThrow(() -> new Exception("계정을 찾을 수 없습니다.")); Product product = productRepository.findById(productId) .orElseThrow(() -> new IllegalArgumentException("Product not found")); - // CartItem을 생성하여 카트에 추가 - CartItem cartItem = new CartItem(cart, product); - cart.getCartItems().add(cartItem); + // 장바구니에서 해당 상품을 찾아서 삭제 + cart.getCartItems().removeIf(cartItem -> cartItem.getProduct().equals(product)); cartRepository.save(cart); + return true; } - @Transactional - public void removeFromCart(Long memberId, Long productId) throws Exception{ - Cart cart = cartRepository.findByMemberId(memberId) - .orElseThrow(() -> new Exception("계정을 찾을 수 없습니다."));; - Product product = productRepository.findById(productId).orElseThrow(() -> new IllegalArgumentException("Product not found")); -// cart.removeProduct(product); - cartRepository.save(cart); - } - - public CartResponse getCart(Long memberId) throws Exception{ + public CartResponseDto.CartResponse getCart(Long memberId) throws Exception{ Cart cart = cartRepository.findByMemberId(memberId) .orElseThrow(() -> new Exception("계정을 찾을 수 없습니다.")); - List cartItems = cartItemRepository.findByMemberIdAndCartId(memberId, cart.getId()); + List cartItems = cartItemRepository.findByMemberIdAndCartId(memberId, cart.getId()); - return new CartResponse(cart.getId(), cartItems); +// + return new CartResponseDto.CartResponse(cart); } }