|
1 | 1 | package com.example.service.impl |
2 | 2 |
|
3 | | -import com.example.dto.FoodDto |
4 | | -import com.example.dto.OrderDto |
5 | | -import com.example.dto.OrderStatus |
| 3 | +import com.example.dto.* |
6 | 4 | import com.example.service.DatabaseModule.dbQuery |
7 | 5 | import com.example.service.OrderService |
8 | | -import com.example.table.Foods |
9 | 6 | import com.example.table.Items |
10 | 7 | import com.example.table.Orders |
| 8 | +import com.example.util.ext.toItemDto |
11 | 9 | import com.example.util.ext.toOrderDto |
12 | | -import org.jetbrains.exposed.sql.and |
13 | | -import org.jetbrains.exposed.sql.insert |
14 | | -import org.jetbrains.exposed.sql.select |
15 | | -import org.jetbrains.exposed.sql.update |
| 10 | +import org.jetbrains.exposed.sql.* |
16 | 11 | import java.util.* |
17 | 12 |
|
18 | 13 | class OrderServiceImpl : OrderService { |
19 | | - override suspend fun getActiveOrder(userId: UUID): Result<OrderDto> = dbQuery { |
20 | | - val card = Orders.select { |
| 14 | + override suspend fun getActiveOrder(userId: UUID): Result<GetActiveOrderDto> = dbQuery { |
| 15 | + val order = Orders.select { |
21 | 16 | (Orders.userId eq userId) and (Orders.orderStatus eq OrderStatus.Started) |
22 | | - } |
23 | | - if (card.empty()) { |
24 | | - throw Exception("No active order found") |
25 | | - } |
26 | | - card.single().toOrderDto() |
| 17 | + }.singleOrNull() ?: throw Exception("No active order found") |
| 18 | + |
| 19 | + val items = Items.select { Items.orderId eq order[Orders.id] }.map { it.toItemDto() } |
| 20 | + GetActiveOrderDto(order.toOrderDto(), items) |
27 | 21 | } |
28 | 22 |
|
29 | 23 | override suspend fun addFoodToOrder(userId: UUID, foodDto: FoodDto, quantity: Int): Result<Int> = dbQuery { |
30 | | - val order = Orders.select { |
| 24 | + Orders.select { |
31 | 25 | (Orders.userId eq userId) and (Orders.orderStatus eq OrderStatus.Started) |
32 | | - }.forUpdate() |
33 | | - |
34 | | - if (order.empty()) { |
35 | | - createOrder(userId) |
36 | | - } |
| 26 | + }.forUpdate().singleOrNull() ?: createOrder(userId) |
37 | 27 |
|
38 | 28 | val activeOrder = Orders.select { |
39 | 29 | (Orders.userId eq userId) and (Orders.orderStatus eq OrderStatus.Started) |
40 | 30 | }.forUpdate().single() |
41 | 31 |
|
42 | | - val orderId = Items.insert { |
43 | | - it[Items.orderId] = activeOrder[Orders.id] |
44 | | - it[Items.foodId] = foodDto.id |
45 | | - it[Items.quantity] = quantity |
46 | | - it[Items.price] = foodDto.price.toBigDecimal() |
47 | | - }[Items.id] |
| 32 | + val item = Items.select { |
| 33 | + (Items.orderId eq activeOrder[Orders.id]) and (Items.foodId eq foodDto.id) |
| 34 | + }.singleOrNull() |
| 35 | + |
| 36 | + val itemId = if (item != null) { |
| 37 | + val newQuantity = item[Items.quantity] + quantity |
| 38 | + Items.update({ Items.id eq item[Items.id] }) { |
| 39 | + it[Items.quantity] = newQuantity |
| 40 | + } |
| 41 | + item[Items.id] |
| 42 | + } else { |
| 43 | + Items.insert { |
| 44 | + it[Items.orderId] = activeOrder[Orders.id] |
| 45 | + it[Items.foodId] = foodDto.id |
| 46 | + it[Items.quantity] = quantity |
| 47 | + it[Items.price] = foodDto.price.toBigDecimal() |
| 48 | + }[Items.id] |
| 49 | + } |
48 | 50 |
|
49 | 51 | val totalPrice = activeOrder[Orders.totalPrice] + (foodDto.price * quantity).toBigDecimal() |
50 | 52 | Orders.update({ Orders.id eq activeOrder[Orders.id] }) { |
51 | 53 | it[Orders.totalPrice] = totalPrice |
52 | 54 | } |
53 | 55 |
|
54 | | - orderId |
| 56 | + itemId |
55 | 57 | } |
56 | 58 |
|
57 | | - override suspend fun updateItemInOrder(orderId: Int, quantity: Int): Result<Boolean> = dbQuery { |
58 | | - val orderItem = Items.select { Items.id eq orderId }.singleOrNull() |
59 | | - if (orderItem == null) { |
60 | | - throw Exception("Order item not found") |
61 | | - } |
| 59 | + override suspend fun updateItemInOrder(itemId: Int, quantity: Int): Result<ItemDto> = dbQuery { |
| 60 | + val item = Items.select { Items.id eq itemId }.singleOrNull() ?: throw Exception("Item not found") |
62 | 61 |
|
63 | | - val food = Foods.select { Foods.id eq orderItem[Items.foodId] }.single() |
64 | | - val totalPrice = (food[Foods.price] * quantity).toBigDecimal() |
65 | | - Items.update({ Items.id eq orderId }) { |
| 62 | + Items.update({ Items.id eq itemId }) { |
66 | 63 | it[Items.quantity] = quantity |
67 | | - it[Items.price] = totalPrice |
68 | | - } |
69 | | - |
70 | | - val activeOrder = Orders.select { Orders.id eq orderItem[Items.orderId] }.single() |
71 | | - val orderItems = Items.select { Items.orderId eq activeOrder[Orders.id] } |
72 | | - val newTotalPrice = orderItems.sumOf { it[Items.price].toDouble() }.toBigDecimal() |
73 | | - Orders.update({ Orders.id eq activeOrder[Orders.id] }) { |
74 | | - it[Orders.totalPrice] = newTotalPrice |
75 | 64 | } |
76 | 65 |
|
77 | | - true |
| 66 | + item.toItemDto() |
78 | 67 | } |
79 | 68 |
|
80 | 69 | override suspend fun clearCurrentOrder(userId: UUID): Result<Boolean> { |
|
0 commit comments