9oj0e / pathorder_server

3 stars 4 forks source link

feat: to place order #24

Closed 9oj0e closed 5 months ago

9oj0e commented 5 months ago

업데이트

입력 및 출력 코드

{
    "storeId": 1,
    "storeName": "단밤 카페",
    "customerId": 2,
    "customerNickname": "정현",
    "request": "설탕 많이 주세요",
    "orderMenuList": [
        {
            "name": "아메리카노",
            "price": 3000,
            "orderMenuOptionList": [
                {
                    "name": "헤이즐넛시럽",
                    "price": 500
                }
            ]
        },
        {
            "name": "아메리카노",
            "price": 3000,
            "orderMenuOptionList": [
                {
                    "name": "hot",
                    "price": 0
                },
                {
                    "name": "코코아파우더",
                    "price": 500
                }
            ]
        }
    ]
}

DB Insert

order/OrderService/createOrder

문제 코드

@Transactional
public OrderResponse.SaveDTO createOrder(OrderRequest.SaveDTO reqDTO) {
    Order order = new Order(reqDTO);
    // 주문 저장
    Order savedOrder = orderRepository.save(order);

    // 메뉴 리스트
    List<OrderMenu> orderMenuList = reqDTO.getOrderMenuList() != null ?
            reqDTO.getOrderMenuList().stream()
                    .map(menu -> new OrderMenu(menu, savedOrder))
                    .toList() :
            Collections.emptyList();
    // 옵션 리스트
    List<OrderOption> orderOptionList = reqDTO.getOrderMenuList() != null ?
            reqDTO.getOrderMenuList().stream()
                    .flatMap(menu -> {
                        OrderMenu savedOrderMenu = orderMenuRepository.save(new OrderMenu(menu, savedOrder));
                        return menu.getOrderOptionList().stream()
                                .map(optionDTO -> new OrderOption(optionDTO, savedOrder, savedOrderMenu));
                    })
                    .toList() :
            Collections.emptyList();

    // 주문 메뉴 저장
    orderMenuList.forEach(orderMenu -> orderMenuRepository.save(orderMenu));
    // 주문 옵션 저장
    orderOptionList.forEach(orderOption -> orderOptionRepository.save(orderOption));

    return new OrderResponse.SaveDTO(savedOrder, orderMenuList, orderOptionList);
}

해결 시도 1

@Transactional
public OrderResponse.SaveDTO createOrder(OrderRequest.SaveDTO reqDTO) {
    Order order = orderRepository.save(new Order(reqDTO)); // 주문 생성
    List<OrderMenu> orderMenuList // 주문 메뉴 리스트 생성
            = reqDTO.getOrderMenuList() != null
            ? reqDTO.getOrderMenuList().stream()
            .map(orderMenuDTO // 주문 메뉴 리스트 DB 저장
                    -> orderMenuRepository.save(new OrderMenu(orderMenuDTO, order)))
            .toList()
            : new ArrayList<>();
    List<OrderOption> orderOptionList // 주문 메뉴 옵션 리스트 TODO: menuIdList를 가져와서 매핑
            = reqDTO.getOrderMenuList() != null
            ? reqDTO.getOrderMenuList().stream()
            .flatMap(orderMenuDTO -> orderMenuDTO.getOrderOptionList().stream() // ㅈ문 메뉴 옵션 리스트
                    .map(orderOptionDTO -> new OrderOption(orderOptionDTO, order))
            ).toList()
            : new ArrayList<>();
    return null; // TODO: 응답 결과 return
}

해결 시도 2 (해결)

@Transactional
public OrderResponse.SaveDTO createOrder(OrderRequest.SaveDTO reqDTO) {
    Order order = orderRepository.save(new Order(reqDTO)); // 주문 생성
    List<OrderRequest.SaveDTO.OrderMenuDTO> orderMenuList = reqDTO.getOrderMenuList();
    for (int i = 0; i < orderMenuList.size(); i++) {
        int orderMenuId = orderMenuRepository.save(new OrderMenu(orderMenuList.get(i), order)).getId();
        for (int j = 0; j < orderMenuList.get(i).getOrderOptionList().size(); j++) {
            orderOptionRepository.save(new OrderOption(orderMenuList.get(i).getOrderOptionList().get(j), order, orderMenuId));
        }
    }
    return null; // TODO: 응답 결과 return
}

응답하기 DTO

order/OrderResponse/OrderDTO.OrderMenuDTO

문제 코드

public OrderMenuDTO(OrderMenu orderMenu, List<OrderMenuOption> orderMenuOptions) {
    this.id = orderMenu.getId();
    this.name = orderMenu.getName();
    this.price = orderMenu.getPrice();
    for (int i = 0; i < orderMenuOptions.size(); i++) {
        if (id == orderMenuOptions.get(i).getOrderMenu().getId()) {
            this.orderMenuOptionList = orderMenuOptions.stream().map(OrderMenuOptionDTO::new).toList();
        }
    }
}

해결 코드

public OrderMenuDTO(OrderMenu orderMenu, List<OrderMenuOption> orderMenuOptions) {
    this.id = orderMenu.getId();
    this.name = orderMenu.getName();
    this.price = orderMenu.getPrice();
    for (int i = 0; i < orderMenuOptions.size(); i++) {
        OrderMenuOptionDTO orderMenuOption = new OrderMenuOptionDTO(orderMenuOptions.get(i));
        if (id == orderMenuOptions.get(i).getOrderMenu().getId()) {
            this.orderMenuOptionList.add(orderMenuOption);
        }
    }
}