WindsomeProject - 장바구니 주문 기능

박민수·2024년 1월 8일
0

WindsomeProject

목록 보기
12/32
post-thumbnail

개요

해당 포스팅에서는 장바구니 주문 기능의 흐름에 대해서 정리해 보고자 한다.

장바구니 주문 기능 절차

Controller: 장바구니 주문 요청을 처리한다.
CartService: 장바구니와 관련된 비즈니스 로직을 처리한다.
OrderService: 주문과 관련된 비즈니스 로직을 처리한다.

Controller 로직

  • 사용자가 주문하고자 하는 장바구니 상품들의 id 값을 비동기 통신을 통해 CartOrderDto 객체에 매핑하여 전달받는다.
  • 사용자가 해당 장바구니에 대한 주문 권한이 있는지를 검증한다. (CartService에 위임)
  • 상품들을 주문한다. (CartService에 위임)
@PostMapping("/cart/orders")
public ResponseEntity<Object> orderCartItem(@RequestBody CartOrderDto cartOrderDto, @CurrentAccount Account account) {
	List<Long> cartItemIds = cartOrderDto.getCartItemIds();

	if (cartItemIds == null || cartItemIds.isEmpty()) {
		return ResponseEntity.status(HttpStatus.FORBIDDEN).body("주문할 상품을 선택해주세요.");
	}

	for (Long cartItemId : cartItemIds) {
		if (cartService.validateCartItem(cartItemId, account.getUserIdentifier())) {
			return ResponseEntity.status(HttpStatus.FORBIDDEN).body("주문 권한이 없습니다.");
		}
	}

	Long orderId = cartService.orderCartItem(cartItemIds, account.getUserIdentifier());
	return ResponseEntity.ok(orderId);
    }

Service 로직

  1. 주문 상품 List를 생성 후, 해당 상품들을 주문한다. (OrderService에 위임)
  2. 기존에 장바구니에 담겨있던 상품들은 장바구니에서 삭제한다.
public Long orderCartItem(List<Long> cartItemIds, String userIdentifier) {
	List<OrderDto> orderDtoList = new ArrayList<>();
	for (Long cartItemId : cartItemIds) {
		CartItem cartItem = cartItemRepository.findById(cartItemId).orElseThrow(EntityNotFoundException::new);

		OrderDto orderDto = new OrderDto();
		orderDto.setItemId(cartItem.getItem().getId());
		orderDto.setCount(cartItem.getCount());
		orderDtoList.add(orderDto);
	}

	Long orderId = orderService.orders(orderDtoList, userIdentifier);

	for (Long cartItemId : cartItemIds) {
		CartItem cartItem = cartItemRepository.findById(cartItemId).orElseThrow(EntityNotFoundException::new);
		cartItemRepository.delete(cartItem);
	}
	return orderId;
}
profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글