Commit 5ee47bf5 authored by Alex Segers's avatar Alex Segers

[AFP-134] Add paginated & filtered orders endpoint (@asegers)

parent a26b7922
Pipeline #1750 failed with stage
in 39 seconds
package com.afp.ordermanagement.controller;
import com.afp.ordermanagement.model.OrderStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
public class AllOrdersRequestBody {
public Pagination pagination;
public Date date;
public Search search;
public Status status;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Pagination {
public int page, size;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Date {
public long start, end;
public DateFilter filter;
}
public enum DateFilter {
orderCreatedAt, orderUpdatedAt
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Search {
public SearchBy by;
public String query;
}
public enum SearchBy {
id, customerEmailAddress, orderTrackingCode
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Status {
public boolean received, fulfilled, cancelled;
public List<OrderStatus> getTruthyStatuses() {
List<OrderStatus> truthyStatuses = new ArrayList<>();
if (received) truthyStatuses.add(OrderStatus.RECEIVED);
if (fulfilled) truthyStatuses.add(OrderStatus.FULFILLED);
if (cancelled) truthyStatuses.add(OrderStatus.CANCELLED);
return truthyStatuses;
}
}
}
\ No newline at end of file
......@@ -4,6 +4,9 @@ import com.afp.ordermanagement.model.Order;
import com.afp.ordermanagement.reactivekafkaservice.Receiver;
import com.afp.ordermanagement.reactivekafkaservice.Sender;
import com.afp.ordermanagement.service.OrderService;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
......@@ -11,6 +14,8 @@ import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import static java.util.Objects.isNull;
@RestController
@RequestMapping("/api")
@CrossOrigin
......@@ -40,13 +45,17 @@ public class OrderController {
return orderService.createOrder(orderObject);
}
@GetMapping("/orders")
@CrossOrigin
public Flux<Order> getAllOrders(){
public Flux<Order> getAllOrders() {
return orderService.getAllOrders();
}
@PostMapping("/orders/filtered")
@CrossOrigin
public Flux<Order> getFilteredOrders(@RequestBody AllOrdersRequestBody reqBody) {
return orderService.getQueriedOrders(reqBody);
}
@GetMapping("/orders/{orderId}")
@CrossOrigin
......@@ -70,6 +79,4 @@ public class OrderController {
public void deleteOrderbyId(@PathVariable(value = "orderId") String orderId) {
orderService.deleteOrderById(orderId);
}
}
package com.afp.ordermanagement.service;
import com.afp.ordermanagement.model.Item;
import com.afp.ordermanagement.controller.AllOrdersRequestBody;
import com.afp.ordermanagement.model.Order;
import com.afp.ordermanagement.model.OrderStatus;
import com.afp.ordermanagement.repository.OrderRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static java.util.Objects.isNull;
@Service
public class OrderService {
......@@ -19,6 +26,9 @@ public class OrderService {
@Autowired
OrderRepository orderRepository;
@Autowired
ReactiveMongoTemplate reactiveMongoTemplate;
public Mono<Order> createOrder(Order newOrder){
System.out.println("here");
String defaultOrderTrackingCode = "N/A";
......@@ -36,6 +46,43 @@ public class OrderService {
return orderRepository.findAll();
}
public Flux<Order> getQueriedOrders(AllOrdersRequestBody requestBody){
Query query = new Query();
// ---- pagination & sort ----
int page = requestBody.pagination.page, size = requestBody.pagination.size;
Sort sortByLastUpdated = Sort.by("orderUpdatedAt").descending();
Pageable pagination = PageRequest.of(page, size, sortByLastUpdated);
query.with(pagination);
// ---- date ----
long startDate = requestBody.date.start, endDate = requestBody.date.end;
AllOrdersRequestBody.DateFilter dateFilter = requestBody.date.filter;
if (startDate > 0 && endDate > 0 && startDate <= endDate) {
if (!isNull(dateFilter)) {
query.addCriteria(Criteria.where(dateFilter.toString()).gte(startDate).lte(endDate));
} else {
Criteria dateCriteria = Criteria.where("orderCreatedAt").gte(startDate).lte(endDate)
.orOperator(Criteria.where("orderUpdatedAt").gte(startDate).lte(endDate));
query.addCriteria(dateCriteria);
}
}
// ---- search ----
String queryText = requestBody.search.query;
if (!isNull(queryText) && !queryText.trim().isEmpty()) {
String searchByStr = requestBody.search.by.toString();
Criteria searchCriteria = Criteria.where(searchByStr).regex("^" + queryText);
query.addCriteria(searchCriteria);
}
// ---- status ----
List<OrderStatus> truthyStatuses = requestBody.status.getTruthyStatuses();
if (!truthyStatuses.isEmpty()) {
Criteria statusCriteria = Criteria.where("orderStatus").in(truthyStatuses);
query.addCriteria(statusCriteria);
}
return reactiveMongoTemplate.find(query, Order.class);
}
public Mono<Order> getOrderById(String orderId) {
return orderRepository.findById(orderId);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment