@PostMapping("/user/cart/{id}")
public ResponseEntity<List<ResponseCart>> createCart(HttpServletRequest request, @PathVariable Long id, @RequestBody RequestSize requestSize) {
List<ResponseCart> cartList = cartService.createCart((User) request.getAttribute("user"), id, requestSize.getSize());
return (cartList != null) ?
ResponseEntity.status(HttpStatus.OK).body(cartList) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
CartService의 createCart함수를 호출하고 결과에 따라 200 또는 400의 status code를 반환
@Override
public List<ResponseCart> createCart(User user, Long product_id, String size) {
Product product = productRepository.findById(product_id).orElse(null);
if(user == null || product == null) {
return null;
}
Boolean check_same = cartRepository.findSameCart(user.getId(), product_id, size,ADD);
if(!check_same) {
Cart cart = Cart.builder()
.id(null)
.count(1)
.user(user)
.product(product)
.size(size)
.build();
cartRepository.save(cart);
}
return readCart(user);
}
ProductRepository 를 이용해 product_id 에 대한 엔티티를 받아옴
CartRepository 의 findSameCart 를 이용해 내 장바구니에 같은 상품이 있는지 여부를 알아옴 → 있다면 check_same 이 true 없다면 false
장바구니에 같은 상품이 없을 땐 cart Entity를 만들어 저장
장바구니에 같은 상품이 있을 땐 Repository 안에 로직 수행
그 후 클라이언트에게 보낼 장바구니 내역을 링크와 같이 수행
@Override
@Transactional
public Boolean findSameCart(Long user_id, Long product_id, String size, int state) {
SelectCart selectCart = selectFromUserID_N_ProductID(user_id, product_id, size);
if(selectCart == null) {
return false;
}
int state_value = 1;
if(state == CartServiceImpl.DELETE){
state_value = -1;
if(selectCart.getCount() == 1) {
deleteCartID(selectCart.getId());
return true;
}
}
updateCartID(selectCart.getId(), selectCart.getCount() + state_value);
return true;
}
@Override
public SelectCart selectFromUserID_N_ProductID(Long user_id, Long product_id, String size){
BooleanExpression status_user = eqUserID(user_id);
BooleanExpression status_product = eqProductID(product_id);
BooleanExpression status_size = eqSize(size);
if (status_user == null || status_product == null || status_size == null) {
return null;
}
return queryFactory.select(Projections.fields(SelectCart.class,
cart.id,
cart.count,
Expressions.asString(size).as("size"),
Expressions.asNumber(user_id).as("user_id"),
Expressions.asNumber(product_id).as("product_id")))
.from(cart)
.where(status_user, status_product, status_size)
.fetchOne();
}
selectFromUserID_N_ProductID 를 통해 입력 값 오류 여부와 SelectCart 타입으로 정보를 조회
입력 값의 조건에 일치하는 SelectCart 의 정보가 없다면 false 반환
있다면 ADD와 DELETE를 구분하여 재고 수정
ADD 라면 원래 있던 재고에 +1을 하는 형태
DELETE 라면 원래 있던 재고가 1개인지 파악 후 1개 라면 해당 열을 삭제
1개가 아니라면 state_value 를 -1로 바꿔 재고 + (-1) 을 하는 형태