Skip to content

Commit cdf4357

Browse files
committedMay 27, 2024·
Added get orders API
Added get order by orderNumber API
1 parent 4d40548 commit cdf4357

File tree

7 files changed

+140
-22
lines changed

7 files changed

+140
-22
lines changed
 

‎order-service/src/main/java/com/codebykavindu/bookstore/orders/domain/OrderMapper.java

+18
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.codebykavindu.bookstore.orders.domain;
22

33
import com.codebykavindu.bookstore.orders.domain.models.CreateOrderRequest;
4+
import com.codebykavindu.bookstore.orders.domain.models.OrderDTO;
45
import com.codebykavindu.bookstore.orders.domain.models.OrderItem;
56
import com.codebykavindu.bookstore.orders.domain.models.OrderStatus;
67
import java.util.HashSet;
78
import java.util.Set;
89
import java.util.UUID;
10+
import java.util.stream.Collectors;
911

1012
/**
1113
* @author Kavindu Perera
@@ -32,4 +34,20 @@ static OrderEntity convertToEntity(CreateOrderRequest request) {
3234
newOrder.setItems(orderItems);
3335
return newOrder;
3436
}
37+
38+
static OrderDTO convertToDTO(OrderEntity order) {
39+
Set<OrderItem> orderItems = order.getItems().stream()
40+
.map(item -> new OrderItem(item.getCode(), item.getName(), item.getPrice(), item.getQuantity()))
41+
.collect(Collectors.toSet());
42+
43+
return new OrderDTO(
44+
order.getOrderNumber(),
45+
order.getUserName(),
46+
orderItems,
47+
order.getCustomer(),
48+
order.getDeliveryAddress(),
49+
order.getStatus(),
50+
order.getComments(),
51+
order.getCreatedAt());
52+
}
3553
}

‎order-service/src/main/java/com/codebykavindu/bookstore/orders/domain/OrderRepository.java

+18
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.codebykavindu.bookstore.orders.domain;
22

33
import com.codebykavindu.bookstore.orders.domain.models.OrderStatus;
4+
import com.codebykavindu.bookstore.orders.domain.models.OrderSummary;
45
import java.util.List;
56
import java.util.Optional;
67
import org.springframework.data.jpa.repository.JpaRepository;
8+
import org.springframework.data.jpa.repository.Query;
79

810
/**
911
* @author Kavindu Perera
@@ -18,4 +20,20 @@ default void updateOrderStatus(String orderNumber, OrderStatus status) {
1820
order.setStatus(status);
1921
this.save(order);
2022
}
23+
24+
@Query(
25+
"""
26+
select new com.codebykavindu.bookstore.orders.domain.models.OrderSummary(o.orderNumber, o.status)
27+
from OrderEntity o
28+
where o.userName = :userName
29+
""")
30+
List<OrderSummary> findByUserName(String userName);
31+
32+
@Query(
33+
"""
34+
select distinct o
35+
from OrderEntity o left join fetch o.items
36+
where o.userName = :username and o.orderNumber = :orderNumber
37+
""")
38+
Optional<OrderEntity> findByUserNameAndOrderNumber(String username, String orderNumber);
2139
}

‎order-service/src/main/java/com/codebykavindu/bookstore/orders/domain/OrderService.java

+13
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import com.codebykavindu.bookstore.orders.domain.models.CreateOrderRequest;
44
import com.codebykavindu.bookstore.orders.domain.models.CreateOrderResponse;
55
import com.codebykavindu.bookstore.orders.domain.models.OrderCreatedEvent;
6+
import com.codebykavindu.bookstore.orders.domain.models.OrderDTO;
67
import com.codebykavindu.bookstore.orders.domain.models.OrderStatus;
8+
import com.codebykavindu.bookstore.orders.domain.models.OrderSummary;
79
import java.util.List;
10+
import java.util.Optional;
811
import org.slf4j.Logger;
912
import org.slf4j.LoggerFactory;
1013
import org.springframework.stereotype.Service;
@@ -40,6 +43,16 @@ public CreateOrderResponse createOrder(String userName, CreateOrderRequest reque
4043
return new CreateOrderResponse(savedOrder.getOrderNumber());
4144
}
4245

46+
public List<OrderSummary> findOrders(String userName) {
47+
return orderRepository.findByUserName(userName);
48+
}
49+
50+
public Optional<OrderDTO> findUserOrder(String username, String orderNumber) {
51+
return orderRepository
52+
.findByUserNameAndOrderNumber(username, orderNumber)
53+
.map(OrderMapper::convertToDTO);
54+
}
55+
4356
public void processNewOrders() {
4457
List<OrderEntity> orders = orderRepository.findByStatus(OrderStatus.NEW);
4558
log.info("Found {} new orders to process", orders.size());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.codebykavindu.bookstore.orders.domain.models;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import java.math.BigDecimal;
5+
import java.time.LocalDateTime;
6+
import java.util.Set;
7+
8+
/**
9+
* @author Kavindu Perera
10+
*/
11+
public record OrderDTO(
12+
String orderNumber,
13+
String userName,
14+
Set<OrderItem> orderItems,
15+
Customer customer,
16+
Address deliveryAddress,
17+
OrderStatus status,
18+
String comments,
19+
LocalDateTime createdAt) {
20+
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
21+
public BigDecimal getTotalAmount() {
22+
return orderItems.stream()
23+
.map(item -> item.price().multiply(BigDecimal.valueOf(item.quantity())))
24+
.reduce(BigDecimal.ZERO, BigDecimal::add);
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.codebykavindu.bookstore.orders.domain.models;
2+
3+
/**
4+
* @author Kavindu Perera
5+
*/
6+
public record OrderSummary(String orderNumber, OrderStatus status) {}

‎order-service/src/main/java/com/codebykavindu/bookstore/orders/web/controllers/OrderController.java

+22
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package com.codebykavindu.bookstore.orders.web.controllers;
22

3+
import com.codebykavindu.bookstore.orders.domain.OrderNotFoundException;
34
import com.codebykavindu.bookstore.orders.domain.OrderService;
45
import com.codebykavindu.bookstore.orders.domain.SecurityService;
56
import com.codebykavindu.bookstore.orders.domain.models.CreateOrderRequest;
67
import com.codebykavindu.bookstore.orders.domain.models.CreateOrderResponse;
8+
import com.codebykavindu.bookstore.orders.domain.models.OrderDTO;
9+
import com.codebykavindu.bookstore.orders.domain.models.OrderSummary;
710
import jakarta.validation.Valid;
11+
import java.util.List;
812
import org.slf4j.Logger;
913
import org.slf4j.LoggerFactory;
1014
import org.springframework.http.HttpStatus;
15+
import org.springframework.web.bind.annotation.GetMapping;
16+
import org.springframework.web.bind.annotation.PathVariable;
1117
import org.springframework.web.bind.annotation.PostMapping;
1218
import org.springframework.web.bind.annotation.RequestBody;
1319
import org.springframework.web.bind.annotation.RequestMapping;
@@ -37,4 +43,20 @@ CreateOrderResponse createOrder(@Valid @RequestBody CreateOrderRequest request)
3743
log.info("Creating order for user={}", userName);
3844
return orderService.createOrder(userName, request);
3945
}
46+
47+
@GetMapping
48+
List<OrderSummary> getOrders() {
49+
String username = securityService.getLoginUsername();
50+
log.info("Fetching orders for user={}", username);
51+
return orderService.findOrders(username);
52+
}
53+
54+
@GetMapping("/{orderNumber}")
55+
OrderDTO getOrder(@PathVariable("orderNumber") String orderNumber) {
56+
log.info("Fetching order by id={}", orderNumber);
57+
String username = securityService.getLoginUsername();
58+
return orderService
59+
.findUserOrder(username, orderNumber)
60+
.orElseThrow(() -> new OrderNotFoundException(orderNumber));
61+
}
4062
}

‎order-service/src/test/java/com/codebykavindu/bookstore/orders/web/controllers/OrderControllerTests.java

+37-22
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import com.codebykavindu.bookstore.orders.AbstractIntegrationTest;
77
import com.codebykavindu.bookstore.orders.testdata.TestDataFactory;
8+
import io.restassured.common.mapper.TypeRef;
89
import io.restassured.http.ContentType;
910
import java.math.BigDecimal;
1011
import org.junit.jupiter.api.Nested;
@@ -23,30 +24,30 @@ void shouldCreateOrderSuccessfully() {
2324
mockGetProductByCode("P100", "Product 1", new BigDecimal("25.50"));
2425
var payload =
2526
"""
26-
{
27-
"customer" : {
28-
"name": "Siva",
29-
"email": "siva@gmail.com",
30-
"phone": "999999999"
31-
},
32-
"deliveryAddress" : {
33-
"addressLine1": "HNO 123",
34-
"addressLine2": "Kukatpally",
35-
"city": "Hyderabad",
36-
"state": "Telangana",
37-
"zipCode": "500072",
38-
"country": "India"
39-
},
40-
"items": [
4127
{
42-
"code": "P100",
43-
"name": "Product 1",
44-
"price": 25.50,
45-
"quantity": 1
28+
"customer" : {
29+
"name": "Siva",
30+
"email": "siva@gmail.com",
31+
"phone": "999999999"
32+
},
33+
"deliveryAddress" : {
34+
"addressLine1": "HNO 123",
35+
"addressLine2": "Kukatpally",
36+
"city": "Hyderabad",
37+
"state": "Telangana",
38+
"zipCode": "500072",
39+
"country": "India"
40+
},
41+
"items": [
42+
{
43+
"code": "P100",
44+
"name": "Product 1",
45+
"price": 25.50,
46+
"quantity": 1
47+
}
48+
]
4649
}
47-
]
48-
}
49-
""";
50+
""";
5051
given().contentType(ContentType.JSON)
5152
.body(payload)
5253
.when()
@@ -67,4 +68,18 @@ void shouldReturnBadRequestWhenMandatoryDataIsMissing() {
6768
.statusCode(HttpStatus.BAD_REQUEST.value());
6869
}
6970
}
71+
72+
@Nested
73+
class GetOrdersTests {
74+
@Test
75+
void shouldGetOrdersSuccessfully() {
76+
given().when()
77+
.get("/api/v1/orders")
78+
.then()
79+
.statusCode(200)
80+
.extract()
81+
.body()
82+
.as(new TypeRef<>() {});
83+
}
84+
}
7085
}

0 commit comments

Comments
 (0)
Please sign in to comment.