View Javadoc
1   /*
2    *    Copyright 2010-2026 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.jpetstore.service;
17  
18  import java.util.HashMap;
19  import java.util.List;
20  import java.util.Map;
21  
22  import org.mybatis.jpetstore.domain.Item;
23  import org.mybatis.jpetstore.domain.Order;
24  import org.mybatis.jpetstore.domain.Sequence;
25  import org.mybatis.jpetstore.mapper.ItemMapper;
26  import org.mybatis.jpetstore.mapper.LineItemMapper;
27  import org.mybatis.jpetstore.mapper.OrderMapper;
28  import org.mybatis.jpetstore.mapper.SequenceMapper;
29  import org.springframework.stereotype.Service;
30  import org.springframework.transaction.annotation.Transactional;
31  
32  /**
33   * The Class OrderService.
34   */
35  @Service
36  public class OrderService {
37  
38    /** The item mapper. */
39    private final ItemMapper itemMapper;
40    /** The order mapper. */
41    private final OrderMapper orderMapper;
42    /** The sequence mapper. */
43    private final SequenceMapper sequenceMapper;
44    /** The line item mapper. */
45    private final LineItemMapper lineItemMapper;
46  
47    /**
48     * Instantiates a new order service.
49     *
50     * @param itemMapper
51     *          the item mapper
52     * @param orderMapper
53     *          the order mapper
54     * @param sequenceMapper
55     *          the sequence mapper
56     * @param lineItemMapper
57     *          the line item mapper
58     */
59    public OrderService(ItemMapper itemMapper, OrderMapper orderMapper, SequenceMapper sequenceMapper,
60        LineItemMapper lineItemMapper) {
61      this.itemMapper = itemMapper;
62      this.orderMapper = orderMapper;
63      this.sequenceMapper = sequenceMapper;
64      this.lineItemMapper = lineItemMapper;
65    }
66  
67    /**
68     * Insert order.
69     *
70     * @param order
71     *          the order
72     */
73    @Transactional
74    public void insertOrder(Order order) {
75      order.setOrderId(getNextId("ordernum"));
76      order.getLineItems().forEach(lineItem -> {
77        String itemId = lineItem.getItemId();
78        Integer increment = lineItem.getQuantity();
79        Map<String, Object> param = new HashMap<>(2);
80        param.put("itemId", itemId);
81        param.put("increment", increment);
82        itemMapper.updateInventoryQuantity(param);
83      });
84  
85      orderMapper.insertOrder(order);
86      orderMapper.insertOrderStatus(order);
87      order.getLineItems().forEach(lineItem -> {
88        lineItem.setOrderId(order.getOrderId());
89        lineItemMapper.insertLineItem(lineItem);
90      });
91    }
92  
93    /**
94     * Gets the order.
95     *
96     * @param orderId
97     *          the order id
98     *
99     * @return the order
100    */
101   @Transactional
102   public Order getOrder(int orderId) {
103     Order order = orderMapper.getOrder(orderId);
104     order.setLineItems(lineItemMapper.getLineItemsByOrderId(orderId));
105 
106     order.getLineItems().forEach(lineItem -> {
107       Item item = itemMapper.getItem(lineItem.getItemId());
108       item.setQuantity(itemMapper.getInventoryQuantity(lineItem.getItemId()));
109       lineItem.setItem(item);
110     });
111 
112     return order;
113   }
114 
115   /**
116    * Gets the orders by username.
117    *
118    * @param username
119    *          the username
120    *
121    * @return the orders by username
122    */
123   public List<Order> getOrdersByUsername(String username) {
124     return orderMapper.getOrdersByUsername(username);
125   }
126 
127   /**
128    * Gets the next id.
129    *
130    * @param name
131    *          the name
132    *
133    * @return the next id
134    */
135   public int getNextId(String name) {
136     Sequence sequence = sequenceMapper.getSequence(new Sequence(name, -1));
137     if (sequence == null) {
138       throw new IllegalArgumentException(
139           "Error: A null sequence was returned from the database (could not get next " + name + " sequence).");
140     }
141     Sequence parameterObject = new Sequence(name, sequence.getNextId() + 1);
142     sequenceMapper.updateSequence(parameterObject);
143     return sequence.getNextId();
144   }
145 
146 }