Commit a003e5dc authored by earndt's avatar earndt

[AFP-18] Adds Order GET, POST, PUT endpoints [@earndt]

parent 30bafe54
...@@ -2,23 +2,43 @@ package com.afp.ordermanagement.controller; ...@@ -2,23 +2,43 @@ package com.afp.ordermanagement.controller;
import com.afp.ordermanagement.model.Order; import com.afp.ordermanagement.model.Order;
import com.afp.ordermanagement.repository.OrderRepository; import com.afp.ordermanagement.repository.OrderRepository;
import com.afp.ordermanagement.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController @RestController
@RequestMapping("/api") @RequestMapping("/api")
public class OrderController { public class OrderController {
@Autowired @Autowired
OrderRepository orderRepository; private OrderService orderService;
@GetMapping("/order") @GetMapping("/orders")
public Flux<Order> getAllManagers() { public Flux<Order> getAllOrders(){
System.out.println("here"); return orderService.getAllOrders();
Flux<Order> managerFlux = orderRepository.findAll();
return managerFlux;
} }
@GetMapping("/orders/{userId}")
public Flux<Order> getAllOrdersByUserId(@PathVariable("userId") String userId) {
return orderService.getAllOrdersByUserId(userId);
}
@PostMapping("/orders")
@ResponseStatus(HttpStatus.CREATED)
public Mono<Order> saveOrder(@RequestBody Order order){
return orderService.createOrder(order);
}
@PutMapping("/order/{orderId}")
public Mono<ResponseEntity<Order>> updateOrder(@PathVariable(value = "orderId") String orderId, @RequestBody Order order){
return orderService.updateOrderByOrderId(orderId, order)
.map(updatedOrder -> ResponseEntity.ok(updatedOrder))
.defaultIfEmpty(ResponseEntity.notFound().build());
}
} }
package com.afp.ordermanagement.model; package com.afp.ordermanagement.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@Data @Data
@Builder
@AllArgsConstructor
@Document(collection = "orders") @Document(collection = "orders")
public class Order { public class Order {
...@@ -16,7 +21,9 @@ public class Order { ...@@ -16,7 +21,9 @@ public class Order {
private String userId; private String userId;
private String emailAddress; private String emailAddress;
private String trackingCode;
@Builder.Default
private String trackingCode = "N/A";
private enum Status { private enum Status {
UNFULFILLED, UNFULFILLED,
...@@ -24,11 +31,25 @@ public class Order { ...@@ -24,11 +31,25 @@ public class Order {
CANCELLED CANCELLED
}; };
private double createdAt; @Builder.Default
private double updatedAt; private Status status = Status.UNFULFILLED;
@Builder.Default
private double createdAt = System.currentTimeMillis();
@Builder.Default
private double updatedAt = System.currentTimeMillis();
private List<Item> items; private List<Item> items;
private Address address; private Address address;
public Order(){
status = Status.UNFULFILLED;
createdAt = System.currentTimeMillis();
updatedAt = System.currentTimeMillis();
trackingCode = "N/A";
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
......
...@@ -3,7 +3,11 @@ package com.afp.ordermanagement.repository; ...@@ -3,7 +3,11 @@ package com.afp.ordermanagement.repository;
import com.afp.ordermanagement.model.Order; import com.afp.ordermanagement.model.Order;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
import java.util.List;
@Repository @Repository
public interface OrderRepository extends ReactiveMongoRepository<Order, String> { public interface OrderRepository extends ReactiveMongoRepository<Order, String> {
Flux<Order> findByUserId(String userId);
} }
package com.afp.ordermanagement.service; package com.afp.ordermanagement.service;
import com.afp.ordermanagement.model.Order;
import com.afp.ordermanagement.repository.OrderRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@Service
public class OrderService { public class OrderService {
@Autowired
OrderRepository orderRepository;
public Mono<Order> createOrder(Order newOrder){
return orderRepository.save(newOrder);
}
public Flux<Order> getAllOrders(){
return orderRepository.findAll();
}
public Flux<Order> getAllOrdersByUserId(String userId){
return orderRepository.findByUserId(userId);
}
public Mono<Order> updateOrderByOrderId(String orderId, Order newOrder){
return orderRepository.findById(orderId)
.flatMap(existingOrder -> {
existingOrder.setAddress(newOrder.getAddress());
existingOrder.setEmailAddress(newOrder.getEmailAddress());
existingOrder.setTrackingCode(newOrder.getTrackingCode());
existingOrder.setItems(newOrder.getItems());
existingOrder.setStatus(newOrder.getStatus());
return orderRepository.save(existingOrder);
});
}
} }
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