From f832f28ee85921f5d4699b976f58198e4d705ef8 Mon Sep 17 00:00:00 2001 From: canyos <4581974@naver.com> Date: Thu, 14 Nov 2024 23:35:39 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20cart=20=EC=9A=94=EC=B2=AD=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=ED=9B=84=20preorder=EB=A7=8C=EB=93=A4=EA=B8=B0=20s?= =?UTF-8?q?tock=20=EC=B6=A9=EB=B6=84=ED=95=9C=EC=A7=80=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../userdetail/UserDetailsServiceImpl.java | 1 + .../order/dto/request/CartOrderRequest.java | 11 ++ .../request/ProductOrderRegisterRequest.java | 11 +- .../order/entity/_product/OrderedProduct.java | 11 +- .../order/entity/_product/ProductOrder.java | 9 +- .../ProductOrderDetailsRepository.java | 10 ++ .../order/service/ProductOrderService.java | 51 +++++--- .../_cart/controller/CartController.java | 78 +++++------- .../_cart/dto/CartRegisterRequest.java | 21 ---- .../domain/product/_cart/dto/CartRequest.java | 7 -- .../product/_cart/dto/CartResponse.java | 4 +- .../domain/product/_cart/entity/Cart.java | 41 +++---- .../_cart/repository/CartRepository.java | 26 +--- .../product/_cart/service/CartService.java | 115 ++++++------------ 14 files changed, 169 insertions(+), 227 deletions(-) create mode 100644 src/main/java/poomasi/domain/order/dto/request/CartOrderRequest.java create mode 100644 src/main/java/poomasi/domain/order/repository/ProductOrderDetailsRepository.java delete mode 100644 src/main/java/poomasi/domain/product/_cart/dto/CartRegisterRequest.java delete mode 100644 src/main/java/poomasi/domain/product/_cart/dto/CartRequest.java diff --git a/src/main/java/poomasi/domain/auth/security/userdetail/UserDetailsServiceImpl.java b/src/main/java/poomasi/domain/auth/security/userdetail/UserDetailsServiceImpl.java index 86e2ff7b..2408468a 100644 --- a/src/main/java/poomasi/domain/auth/security/userdetail/UserDetailsServiceImpl.java +++ b/src/main/java/poomasi/domain/auth/security/userdetail/UserDetailsServiceImpl.java @@ -13,6 +13,7 @@ public class UserDetailsServiceImpl implements UserDetailsService { private final MemberRepository memberRepository; + public UserDetailsServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } diff --git a/src/main/java/poomasi/domain/order/dto/request/CartOrderRequest.java b/src/main/java/poomasi/domain/order/dto/request/CartOrderRequest.java new file mode 100644 index 00000000..4217116c --- /dev/null +++ b/src/main/java/poomasi/domain/order/dto/request/CartOrderRequest.java @@ -0,0 +1,11 @@ +package poomasi.domain.order.dto.request; + +import jdk.jfr.Description; + +@Description("cart에서 상품 정보 넘어오는 정보") +public record CartOrderRequest( + Long cartId, + Integer count +) { + +} diff --git a/src/main/java/poomasi/domain/order/dto/request/ProductOrderRegisterRequest.java b/src/main/java/poomasi/domain/order/dto/request/ProductOrderRegisterRequest.java index 55b5d106..3c8a2e0a 100644 --- a/src/main/java/poomasi/domain/order/dto/request/ProductOrderRegisterRequest.java +++ b/src/main/java/poomasi/domain/order/dto/request/ProductOrderRegisterRequest.java @@ -1,6 +1,11 @@ package poomasi.domain.order.dto.request; -public record ProductOrderRegisterRequest(String destinationAddress, - String destinationAddressDetail, - String deliveryRequest) { +import java.util.List; + +public record ProductOrderRegisterRequest( + List carts, + String destinationAddress, + String destinationAddressDetail, + String deliveryRequest) +{ } diff --git a/src/main/java/poomasi/domain/order/entity/_product/OrderedProduct.java b/src/main/java/poomasi/domain/order/entity/_product/OrderedProduct.java index 0f6fd4ba..251f65c0 100644 --- a/src/main/java/poomasi/domain/order/entity/_product/OrderedProduct.java +++ b/src/main/java/poomasi/domain/order/entity/_product/OrderedProduct.java @@ -4,6 +4,8 @@ import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -70,7 +72,8 @@ public class OrderedProduct implements Serializable { @Column(name = "invoice_number", nullable = true) private String invoiceNumber; - private OrderedProductStatus orderedProductStatus = OrderedProductStatus.PENDING_SELLER_APPROVAL; + @Enumerated(EnumType.STRING) + private OrderedProductStatus orderedProductStatus; @Description("TODO : product의 delivery fee를 참조해야 한다.") private BigDecimal deliveryFee; @@ -96,8 +99,8 @@ public class OrderedProduct implements Serializable { // 배송 상태 적절히 변경해야 함 @Builder - public OrderedProduct(Product product, ProductOrder productOrder, String productDescription, - String productName, BigDecimal price, Integer count) { + public OrderedProduct(Product product, ProductOrder productOrder, OrderedProductStatus orderedProductStatus, String productDescription, + BigDecimal deliveryFee, String productName, BigDecimal price, Integer count) { this.product = product; this.productOrder = productOrder; this.productDescription = productDescription; @@ -105,6 +108,8 @@ public OrderedProduct(Product product, ProductOrder productOrder, String product this.price = price; this.count = count; this.review = null; + this.orderedProductStatus = orderedProductStatus; + this.deliveryFee = deliveryFee; } public void setInvoiceNumber(String invoiceNumber) { diff --git a/src/main/java/poomasi/domain/order/entity/_product/ProductOrder.java b/src/main/java/poomasi/domain/order/entity/_product/ProductOrder.java index 90c237e2..0ebdb809 100644 --- a/src/main/java/poomasi/domain/order/entity/_product/ProductOrder.java +++ b/src/main/java/poomasi/domain/order/entity/_product/ProductOrder.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; +import java.util.ArrayList; import jdk.jfr.Description; import lombok.Builder; import lombok.Getter; @@ -25,13 +26,13 @@ public class ProductOrder extends AbstractOrder { @Column(name = "merchant_uid") @Description("서버 내부 주문 id(아임포트 id)") - private String merchantUid = "p" + new Date().getTime(); + private String merchantUid; @Column(name = "ordered_products_id") @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) - private List orderedProducts; + private List orderedProducts = new ArrayList<>(); - @OneToOne + @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "product_order_details_id") // 외래 키 지정 @Description("상품 배송지, 요청 사항") private ProductOrderDetails productOrderDetails; @@ -41,7 +42,7 @@ public ProductOrder(){ } public void addOrderedProduct(OrderedProduct orderedProduct) { - this.orderedProducts.add(orderedProduct); + orderedProducts.add(orderedProduct); } public void setMerchantUid(String merchantUid) { diff --git a/src/main/java/poomasi/domain/order/repository/ProductOrderDetailsRepository.java b/src/main/java/poomasi/domain/order/repository/ProductOrderDetailsRepository.java new file mode 100644 index 00000000..e8b2ff08 --- /dev/null +++ b/src/main/java/poomasi/domain/order/repository/ProductOrderDetailsRepository.java @@ -0,0 +1,10 @@ +package poomasi.domain.order.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.web.bind.annotation.RequestMapping; +import poomasi.domain.order.entity._product.ProductOrderDetails; + +@RequestMapping +public interface ProductOrderDetailsRepository extends JpaRepository { + +} diff --git a/src/main/java/poomasi/domain/order/service/ProductOrderService.java b/src/main/java/poomasi/domain/order/service/ProductOrderService.java index e8baf045..101f8582 100644 --- a/src/main/java/poomasi/domain/order/service/ProductOrderService.java +++ b/src/main/java/poomasi/domain/order/service/ProductOrderService.java @@ -1,5 +1,7 @@ package poomasi.domain.order.service; +import java.util.ArrayList; +import java.util.Date; import jdk.jfr.Description; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -9,27 +11,33 @@ import org.springframework.transaction.annotation.Transactional; import poomasi.domain.auth.security.userdetail.UserDetailsImpl; import poomasi.domain.member.entity.Member; +import poomasi.domain.order.dto.request.CartOrderRequest; import poomasi.domain.order.dto.request.ProductOrderRegisterRequest; import poomasi.domain.order.dto.response.OrderDetailsResponse; import poomasi.domain.order.dto.response.OrderProductDetailsResponse; import poomasi.domain.order.dto.response.OrderResponse; import poomasi.domain.order.entity.PaymentStatus; import poomasi.domain.order.entity._product.OrderedProduct; +import poomasi.domain.order.entity._product.OrderedProductStatus; import poomasi.domain.order.entity._product.ProductOrder; import poomasi.domain.order.entity._product.ProductOrderDetails; import poomasi.domain.order.repository.OrderedProductRepository; +import poomasi.domain.order.repository.ProductOrderDetailsRepository; import poomasi.domain.order.repository.ProductOrderRepository; import poomasi.domain.product._cart.entity.Cart; import poomasi.domain.product._cart.repository.CartRepository; +import poomasi.domain.product._cart.service.CartService; import poomasi.domain.product.entity.Product; import poomasi.domain.product.repository.ProductRepository; import poomasi.global.error.ApplicationException; +import poomasi.global.error.BusinessError; import poomasi.global.error.BusinessException; import poomasi.payment.dto.request.PaymentPreRegisterRequest; import java.math.BigDecimal; import java.util.List; import java.util.stream.Collectors; +import poomasi.payment.entity.Payment; import static poomasi.global.error.ApplicationError.PAYMENT_NOT_FOUND; import static poomasi.global.error.BusinessError.*; @@ -41,68 +49,79 @@ public class ProductOrderService { private final ProductOrderRepository productOrderRepository; - private final CartRepository cartRepository; + private final CartService cartService; private final ProductRepository productRepository; private final OrderedProductRepository orderedProductRepository; + private final ProductOrderDetailsRepository productOrderDetailsRepository; @Transactional public PaymentPreRegisterRequest productPreOrderRegister(ProductOrderRegisterRequest productOrderRegisterRequest) { Member member = getMember(); - Long memberId = member.getId(); - List cartList = cartRepository.findByMemberIdAndSelected(memberId); + List idList = productOrderRegisterRequest.carts().stream().map(CartOrderRequest::cartId).toList(); + List cartList = cartService.getCartsByIdList(idList); String destinationAddress = productOrderRegisterRequest.destinationAddress(); String destinationAddressDetail = productOrderRegisterRequest.destinationAddressDetail(); String deliveryRequest = productOrderRegisterRequest.deliveryRequest(); - ProductOrder productOrder = new ProductOrder() + ProductOrder productOrder = ProductOrder .builder() + .merchantUid("p" + new Date().getTime()) + .payment(new Payment()) + .totalAmount(BigDecimal.ZERO) .member(member) + .orderedProducts(new ArrayList<>()) .build(); + productOrderRepository.save(productOrder); - ProductOrderDetails productOrderDetails = new ProductOrderDetails() + ProductOrderDetails productOrderDetails = ProductOrderDetails .builder() + .productOrder(productOrder) .destinationAddress(destinationAddress) .destinationAddressDetail(destinationAddressDetail) .deliveryRequest(deliveryRequest) .build(); + productOrderDetailsRepository.save(productOrderDetails); + productOrder.setProductOrderDetails(productOrderDetails); //cart에 있는 총 가격 계산하기 BigDecimal totalPrice = BigDecimal.ZERO; // cart 돌면서 productOrder details 추가 - for (Cart cart : cartList) { - Long productId = cart.getProductId(); - Product product = productRepository.findById(productId) - .orElseThrow(() -> new BusinessException(PRODUCT_NOT_FOUND)); + for (int i=0 ; i productStock) { throw new BusinessException(PRODUCT_STOCK_ZERO); } String productDescription = product.getDescription(); - Integer count = cart.getCount(); String productName = product.getName(); - BigDecimal price = product.getPrice(); + BigDecimal price = product.getPrice().multiply(BigDecimal.valueOf((long) quantityInCart)); //TODO : Store store = product.getStore(); OrderedProduct orderedProduct = OrderedProduct .builder() .product(product) + .orderedProductStatus(OrderedProductStatus.PENDING_SELLER_APPROVAL) + .deliveryFee(product.getShippingFee()) .productOrder(productOrder) //.store(store) .productDescription(productDescription) .productName(productName) .price(price) - .count(count) + .count(quantityInCart) .build(); productOrder.addOrderedProduct(orderedProduct); @@ -112,6 +131,8 @@ public PaymentPreRegisterRequest productPreOrderRegister(ProductOrderRegisterReq productOrder.setCheckSum(totalPrice); productOrderRepository.save(productOrder); + productOrder.setProductOrderDetails(productOrderDetails); + String merchantUid = productOrder.getMerchantUid(); return new PaymentPreRegisterRequest(merchantUid, totalPrice); } diff --git a/src/main/java/poomasi/domain/product/_cart/controller/CartController.java b/src/main/java/poomasi/domain/product/_cart/controller/CartController.java index fb8a187c..1bb4edd1 100644 --- a/src/main/java/poomasi/domain/product/_cart/controller/CartController.java +++ b/src/main/java/poomasi/domain/product/_cart/controller/CartController.java @@ -4,83 +4,61 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.User; import org.springframework.stereotype.Controller; 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.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import poomasi.domain.product._cart.dto.CartRegisterRequest; -import poomasi.domain.product._cart.dto.CartRequest; +import org.springframework.web.bind.annotation.RequestMapping; +import poomasi.domain.auth.security.userdetail.UserDetailsImpl; +import poomasi.domain.member.entity.Member; import poomasi.domain.product._cart.dto.CartResponse; import poomasi.domain.product._cart.service.CartService; @Controller @RequiredArgsConstructor +@RequestMapping("/api/cart") public class CartController { private final CartService cartService; - //장바구니 정보 - @GetMapping("/api/cart") - public ResponseEntity getCart() { - List cart = cartService.getCart(); + //장바구니 모든 정보 + @GetMapping("") + public ResponseEntity getCart(@AuthenticationPrincipal UserDetailsImpl userDetails) { + Member member = userDetails.getMember(); + List cart = cartService.getCart(member); return ResponseEntity.ok().body(cart); } - //장바구니 선택한거만 가격 - @GetMapping("/api/cart/price") - public ResponseEntity getPrice() { - Integer price = cartService.getPrice(); - return ResponseEntity.ok().body(price); - } - //장바구니 추가 - @PostMapping("/api/cart") - public ResponseEntity addCart(@RequestBody CartRegisterRequest cartRequest) { - Long cartId = cartService.addCart(cartRequest); + @PostMapping("/{productId}") + public ResponseEntity addCart( + @AuthenticationPrincipal UserDetailsImpl userDetails, + @PathVariable Long productId) { + Member member = userDetails.getMember(); + Long cartId = cartService.addCart(member, productId); return new ResponseEntity<>(cartId, HttpStatus.CREATED); } - //장바구니 선택/해제 - @PostMapping("/api/cart/select") - public ResponseEntity changeSelect(@RequestBody CartRequest cartRequest) { - cartService.changeSelect(cartRequest); - return ResponseEntity.ok().build(); - } - //장바구니 삭제 - @DeleteMapping("/api/cart") - public ResponseEntity removeCart(@RequestBody CartRequest cartRequest) { - cartService.deleteCart(cartRequest); - return ResponseEntity.ok().build(); - } - - //장바구니 선택된거 삭제 - @DeleteMapping("/api/cart/selected") - public ResponseEntity removeSelected() { - cartService.removeSelected(); + @DeleteMapping("/{cartId}") + public ResponseEntity removeCart( + @AuthenticationPrincipal UserDetailsImpl userDetails, + @PathVariable Long cartId) { + Member member = userDetails.getMember(); + cartService.deleteCart(member, cartId); return ResponseEntity.ok().build(); } //장바구니 전부 삭제 - @DeleteMapping("/api/cart/all") - public ResponseEntity removeAllCart() { - cartService.deleteAll(); - return ResponseEntity.ok().build(); - } - - //장바구니 물건 개수 추가 - @PatchMapping("/api/cart/add") - public ResponseEntity addCount(@RequestBody CartRequest cartRequest) { - cartService.addCount(cartRequest); + @DeleteMapping("/all") + public ResponseEntity removeAllCart(@AuthenticationPrincipal UserDetailsImpl userDetails) { + Member member = userDetails.getMember(); + cartService.deleteAll(member); return ResponseEntity.ok().build(); } - //장바구니 물건 개수 감소 - @PatchMapping("/api/cart/sub") - public ResponseEntity subCount(@RequestBody CartRequest cartRequest) { - cartService.subCount(cartRequest); - return ResponseEntity.ok().build(); - } } diff --git a/src/main/java/poomasi/domain/product/_cart/dto/CartRegisterRequest.java b/src/main/java/poomasi/domain/product/_cart/dto/CartRegisterRequest.java deleted file mode 100644 index 90189d7d..00000000 --- a/src/main/java/poomasi/domain/product/_cart/dto/CartRegisterRequest.java +++ /dev/null @@ -1,21 +0,0 @@ -package poomasi.domain.product._cart.dto; - -import lombok.extern.slf4j.Slf4j; -import poomasi.domain.member.entity.Member; -import poomasi.domain.product._cart.entity.Cart; - -@Slf4j -public record CartRegisterRequest( - Long productId, - Integer count -) { - - public Cart toEntity(Member member) { - return Cart.builder() - .memberId(member.getId()) - .productId(productId) - .selected(Boolean.TRUE) - .count(count != null ? count : 1) - .build(); - } -} diff --git a/src/main/java/poomasi/domain/product/_cart/dto/CartRequest.java b/src/main/java/poomasi/domain/product/_cart/dto/CartRequest.java deleted file mode 100644 index 98148a41..00000000 --- a/src/main/java/poomasi/domain/product/_cart/dto/CartRequest.java +++ /dev/null @@ -1,7 +0,0 @@ -package poomasi.domain.product._cart.dto; - -public record CartRequest( - Long cartId -) { - -} diff --git a/src/main/java/poomasi/domain/product/_cart/dto/CartResponse.java b/src/main/java/poomasi/domain/product/_cart/dto/CartResponse.java index ae43a7eb..09db1b78 100644 --- a/src/main/java/poomasi/domain/product/_cart/dto/CartResponse.java +++ b/src/main/java/poomasi/domain/product/_cart/dto/CartResponse.java @@ -6,9 +6,7 @@ public record CartResponse( Long cartId, String productName, BigDecimal productPrice, - Integer productCount, - Boolean isSelected, - String farmName + String storeName ) { } diff --git a/src/main/java/poomasi/domain/product/_cart/entity/Cart.java b/src/main/java/poomasi/domain/product/_cart/entity/Cart.java index 7a50b0bb..69779c35 100644 --- a/src/main/java/poomasi/domain/product/_cart/entity/Cart.java +++ b/src/main/java/poomasi/domain/product/_cart/entity/Cart.java @@ -1,12 +1,21 @@ package poomasi.domain.product._cart.entity; +import jakarta.persistence.CascadeType; +import jakarta.persistence.ConstraintMode; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.ForeignKey; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import poomasi.domain.member.entity.Member; +import poomasi.domain.product.entity.Product; @Entity @NoArgsConstructor @@ -17,32 +26,18 @@ public class Cart { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private Boolean selected; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Member member; - private Long memberId; - - private Long productId; - - private Integer count; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "product_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Product product; @Builder - public Cart(Long id, Long memberId, Long productId, Boolean selected, Integer count) { + public Cart(Long id, Member member, Product product) { this.id = id; - this.memberId = memberId; - this.productId = productId; - this.selected = selected; - this.count = count; - } - - public void addCount() { - this.count += 1; - } - - public void subCount() { - this.count -= 1; - } - - public void changeSelect() { - this.selected = !this.selected; + this.member = member; + this.product = product; } } diff --git a/src/main/java/poomasi/domain/product/_cart/repository/CartRepository.java b/src/main/java/poomasi/domain/product/_cart/repository/CartRepository.java index 726c0b87..6bd478b1 100644 --- a/src/main/java/poomasi/domain/product/_cart/repository/CartRepository.java +++ b/src/main/java/poomasi/domain/product/_cart/repository/CartRepository.java @@ -7,36 +7,22 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import poomasi.domain.member.entity.Member; import poomasi.domain.product._cart.dto.CartResponse; import poomasi.domain.product._cart.entity.Cart; @Repository public interface CartRepository extends JpaRepository { - @Query("SELECT new poomasi.domain.product._cart.dto.CartResponse(c.id, p.name, p.price, c.count, c.selected,f.name) " - + - "FROM Cart c " + - "INNER JOIN Product p ON c.productId = p.id " + - "INNER JOIN Farm f ON f.ownerId = :memberId") - List findByMemberId(Long memberId); + @Query("SELECT new poomasi.domain.product._cart.dto.CartResponse(c.id, c.product.name, c.product.price, c.member.store.name) from Cart c where c.member = :member") + List findByMember(Member member); - @Query("select sum(p.price * c.count) from Cart c inner join Product p on c.productId = p.id where c.memberId = :memberId and c.selected = true") - Integer getPrice(Long memberId); - - @Query("select c from Cart c where c.memberId = :memberId and c.productId = :productId") Optional findByMemberIdAndProductId(Long memberId, Long productId); - @Modifying - @Transactional - @Query("delete from Cart c where c.memberId = :memberId") - void deleteAllByMemberId(Long memberId); + @Query("SELECT e FROM Cart e WHERE e.id IN :ids") + List getCartsByIdList(List ids); @Modifying @Transactional - @Query("delete from Cart c where c.memberId = :memberId and c.selected = true") - void deleteByMemberIdAndSelected(Long memberId); - - // order 만들 때 사용할 거 - @Query("select c from Cart c where c.memberId = :memberId and c.selected = true") - List findByMemberIdAndSelected(Long memberId); + void deleteAllByMemberId(Long memberId); } diff --git a/src/main/java/poomasi/domain/product/_cart/service/CartService.java b/src/main/java/poomasi/domain/product/_cart/service/CartService.java index 51071f97..75610211 100644 --- a/src/main/java/poomasi/domain/product/_cart/service/CartService.java +++ b/src/main/java/poomasi/domain/product/_cart/service/CartService.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Optional; +import jdk.jfr.Description; import lombok.RequiredArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -9,13 +10,10 @@ import org.springframework.transaction.annotation.Transactional; import poomasi.domain.auth.security.userdetail.UserDetailsImpl; import poomasi.domain.member.entity.Member; -import poomasi.domain.product._cart.dto.CartRegisterRequest; -import poomasi.domain.product._cart.dto.CartRequest; import poomasi.domain.product._cart.dto.CartResponse; import poomasi.domain.product._cart.entity.Cart; import poomasi.domain.product._cart.repository.CartRepository; import poomasi.domain.product.entity.Product; -import poomasi.domain.product.repository.ProductRepository; import poomasi.domain.product.service.ProductService; import poomasi.global.error.BusinessError; import poomasi.global.error.BusinessException; @@ -27,62 +25,54 @@ public class CartService { private final CartRepository cartRepository; private final ProductService productService; + public List getCart(Member member) { + return cartRepository.findByMember(member); + } + @Transactional - public Long addCart(CartRegisterRequest cartRequest) { - Member member = getMember(); - Product product = getProductById(cartRequest.productId()); - - Optional cartOptional = cartRepository.findByMemberIdAndProductId(member.getId(), - product.getId()); - if (cartOptional.isPresent()) { - Cart cart = cartOptional.get(); - return cart.getId(); - } + public Long addCart(Member member, Long productId) { + Product product = getProductById(productId); + + Optional cartOptional = + cartRepository.findByMemberIdAndProductId(member.getId(), product.getId()); + + //이미 담은 상품임 + if (cartOptional.isPresent()) + return cartOptional.get().getId(); + + + Cart cart = Cart.builder() + .member(member) + .product(product) + .build(); - Cart cart = cartRequest.toEntity(member); - if (product.getStock() < cart.getCount()) { - throw new BusinessException(BusinessError.PRODUCT_STOCK_ZERO); - } cart = cartRepository.save(cart); return cart.getId(); - } @Transactional - public void deleteCart(CartRequest cartRequest) { - Member member = getMember(); - Cart cart = getCartById(cartRequest.cartId()); + @Description("카트 한 개 삭제") + public void deleteCart(Member member, Long cartId) { + Cart cart = getCartById(cartId); checkAuth(member, cart); cartRepository.delete(cart); } - private void checkAuth(Member member, Cart cart) { - if (!member.getId().equals(cart.getMemberId())) { - throw new BusinessException(BusinessError.MEMBER_ID_MISMATCH); - } - } @Transactional - public void addCount(CartRequest cartRequest) { - Member member = getMember(); - Cart cart = getCartById(cartRequest.cartId()); - Product product = getProductById(cart.getProductId()); - if (product.getStock().equals(cart.getCount())) { - throw new BusinessException(BusinessError.PRODUCT_STOCK_ZERO); - } - checkAuth(member, cart); - cart.addCount(); + @Description("전부 삭제") + public void deleteAll(Member member) { + cartRepository.deleteAllByMemberId(member.getId()); } - @Transactional - public void subCount(CartRequest cartRequest) { - Member member = getMember(); - Cart cart = getCartById(cartRequest.cartId()); - checkAuth(member, cart); - cart.subCount(); + @Description("요청한 사람이랑 카트 주인이랑 같은지 확인") + private void checkAuth(Member member, Cart cart) { + if (!member.getId().equals(cart.getMember().getId())) { + throw new BusinessException(BusinessError.MEMBER_ID_MISMATCH); + } } - private Cart getCartById(Long cartId) { + public Cart getCartById(Long cartId) { return cartRepository.findById(cartId) .orElseThrow(() -> new BusinessException(BusinessError.CART_NOT_FOUND)); } @@ -91,41 +81,10 @@ private Product getProductById(Long productId) { return productService.findProductById(productId); } - public List getCart() { - Member member = getMember(); - return cartRepository.findByMemberId(member.getId()); - } - - private Member getMember() { - Authentication authentication = SecurityContextHolder - .getContext().getAuthentication(); - Object impl = authentication.getPrincipal(); - Member member = ((UserDetailsImpl) impl).getMember(); - return member; - } - - @Transactional - public void changeSelect(CartRequest cartRequest) { - Member member = getMember(); - Cart cart = getCartById(cartRequest.cartId()); - checkAuth(member, cart); - cart.changeSelect(); - } - - public Integer getPrice() { - Member member = getMember(); - return cartRepository.getPrice(member.getId()); - } - - @Transactional - public void deleteAll() { - Member member = getMember(); - cartRepository.deleteAllByMemberId(member.getId()); - } - - @Transactional - public void removeSelected() { - Member member = getMember(); - cartRepository.deleteByMemberIdAndSelected(member.getId()); + @Description("order 만들 때 사용할 거") + public List getCartsByIdList(List ids) { + List orderList = cartRepository.getCartsByIdList(ids); + cartRepository.deleteAll(orderList); + return orderList; } }