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   * @author Eduardo Macarron
36   */
37  @Service
38  public class OrderService {
39  
40    /** The item mapper. */
41    private final ItemMapper itemMapper;
42    /** The order mapper. */
43    private final OrderMapper orderMapper;
44    /** The sequence mapper. */
45    private final SequenceMapper sequenceMapper;
46    /** The line item mapper. */
47    private final LineItemMapper lineItemMapper;
48  
49    /**
50     * Instantiates a new order service.
51     *
52     * @param itemMapper
53     *          the item mapper
54     * @param orderMapper
55     *          the order mapper
56     * @param sequenceMapper
57     *          the sequence mapper
58     * @param lineItemMapper
59     *          the line item mapper
60     */
61    public OrderService(ItemMapper itemMapper, OrderMapper orderMapper, SequenceMapper sequenceMapper,
62        LineItemMapper lineItemMapper) {
63      this.itemMapper = itemMapper;
64      this.orderMapper = orderMapper;
65      this.sequenceMapper = sequenceMapper;
66      this.lineItemMapper = lineItemMapper;
67    }
68  
69    /**
70     * Insert order.
71     *
72     * @param order
73     *          the order
74     */
75    @Transactional
76    public void insertOrder(Order order) {
77      order.setOrderId(getNextId("ordernum"));
78      order.getLineItems().forEach(lineItem -> {
79        String itemId = lineItem.getItemId();
80        Integer increment = lineItem.getQuantity();
81        Map<String, Object> param = new HashMap<>(2);
82        param.put("itemId", itemId);
83        param.put("increment", increment);
84        itemMapper.updateInventoryQuantity(param);
85      });
86  
87      orderMapper.insertOrder(order);
88      orderMapper.insertOrderStatus(order);
89      order.getLineItems().forEach(lineItem -> {
90        lineItem.setOrderId(order.getOrderId());
91        lineItemMapper.insertLineItem(lineItem);
92      });
93    }
94  
95    /**
96     * Gets the order.
97     *
98     * @param orderId
99     *          the order id
100    *
101    * @return the order
102    */
103   @Transactional
104   public Order getOrder(int orderId) {
105     Order order = orderMapper.getOrder(orderId);
106     order.setLineItems(lineItemMapper.getLineItemsByOrderId(orderId));
107 
108     order.getLineItems().forEach(lineItem -> {
109       Item item = itemMapper.getItem(lineItem.getItemId());
110       item.setQuantity(itemMapper.getInventoryQuantity(lineItem.getItemId()));
111       lineItem.setItem(item);
112     });
113 
114     return order;
115   }
116 
117   /**
118    * Gets the orders by username.
119    *
120    * @param username
121    *          the username
122    *
123    * @return the orders by username
124    */
125   public List<Order> getOrdersByUsername(String username) {
126     return orderMapper.getOrdersByUsername(username);
127   }
128 
129   /**
130    * Gets the next id.
131    *
132    * @param name
133    *          the name
134    *
135    * @return the next id
136    */
137   public int getNextId(String name) {
138     Sequence sequence = sequenceMapper.getSequence(new Sequence(name, -1));
139     if (sequence == null) {
140       throw new RuntimeException(
141           "Error: A null sequence was returned from the database (could not get next " + name + " sequence).");
142     }
143     Sequence parameterObject = new Sequence(name, sequence.getNextId() + 1);
144     sequenceMapper.updateSequence(parameterObject);
145     return sequence.getNextId();
146   }
147 
148 }