@Transactional
@PostMapping("/user/order")
public ResponseEntity<List<ResponseOrder>> create_order(HttpServletRequest request, @RequestBody RequestOrder requestOrder){
List<ResponseOrder> responseOrderList = orderService.create_order((User) request.getAttribute("user"), requestOrder);
if (responseOrderList == null) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); }
Boolean state = productService.purchaseProduct(requestOrder);
return (state) ?
ResponseEntity.status(HttpStatus.OK).body(responseOrderList) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
OrderService의 create_order함수를 호출하고 결과가 null이면 400
그 이후 ProductService 의 purchaseProduct 함수를 호출하고 결과에 따라 200 또는 400의 status code를 반환
@Override
@Transactional
public List<ResponseOrder> create_order(User user, RequestOrder requestOrder) {
User userPersisted = entityManager.find(User.class, user.getId());
if (userPersisted == null || requestOrder.getQueryOrderProductList().isEmpty()) {
return null;
}
Order order = requestOrder.toEntity();
Order savedOrder = orderRepository.save(order);
userPersisted.addOrder(savedOrder);
List<OrderProduct> orderProductList = productRepository.findByIdList(requestOrder.getQueryOrderProductList()
.stream().map(QueryOrderProduct::getProduct_id).toList())
.stream().map(product -> OrderProduct.builder()
.id(null)
.count(1)
.order(null)
.product(product)
.size("M")
.build()
).toList();
for(OrderProduct orderProduct : orderProductList) {
for(QueryOrderProduct queryOrderProduct : requestOrder.getQueryOrderProductList()){
if(Objects.equals(orderProduct.getProduct().getId(), queryOrderProduct.getProduct_id())) {
orderProduct.setOption(queryOrderProduct.getCount(), queryOrderProduct.getSize());
break;
}
}
}
List<OrderProduct> savedOrderProductList = orderProductRepository.saveAll(orderProductList);
savedOrder.addAllOrderProduct(savedOrderProductList);
return read_order(userPersisted);
}
파라미터로 받아온 User는 준영속 객체이므로 User 의 프록시 객체를 참조하면 Lazyinitializationexception 가 발생 → EntityManager로 영속화시킴
영속화 User가 null이거나 Request으로 받은 List가 비어있을 때 null 리턴
Request로 받아온 정보로 Order 와 OrderProduct들을 만들고 User 와 Order
Order 와 OrderProduct를 연결
read_order 함수는 링크 참고
@Override
public Boolean purchaseProduct(RequestOrder requestOrder) {
int value = 0;
List<ChangeStockQuery> changeStockList =
productRepository.findRemoveByProductIDList(requestOrder.getQueryOrderProductList().stream().map(QueryOrderProduct::getProduct_id).toList());
HashMap<Long, Integer> productMap = new HashMap<>();
for(ChangeStockQuery changeStockQuery : changeStockList){
productMap.put(changeStockQuery.getProduct_id(), changeStockQuery.getStock());
}
for(QueryOrderProduct queryOrderProduct : requestOrder.getQueryOrderProductList()){
value = productMap.get(queryOrderProduct.getProduct_id()) - queryOrderProduct.getCount();
if(value < 0) {
return false;
}
productMap.put(queryOrderProduct.getProduct_id(), value);
}
return productRepository.updateProductListStock(productMap) != 0;
}
구매한 상품의 개수를 재고에서 빼주기 위한 함수
원래 재고를 파악하기 위해 findRemoveByProductIDList 함수 사용
findRemoveByProductIDList 함수를 사용해 나온 결과와 구매한 상품의 개수의 차를 **HashMap<상품 아이디, 개수 차>**에 담음
개수 차가 0보다 작다면 false 리턴
ProductRepository 의 updateProductListStock 함수를 이용해 재고 업데이트