diff --git a/orders-backend/src/main/java/com/andwati/orders/config/DataSeeder.java b/orders-backend/src/main/java/com/andwati/orders/config/DataSeeder.java index 40fe7c9..56cd137 100644 --- a/orders-backend/src/main/java/com/andwati/orders/config/DataSeeder.java +++ b/orders-backend/src/main/java/com/andwati/orders/config/DataSeeder.java @@ -1,10 +1,10 @@ package com.andwati.orders.config; -import com.andwati.orders.model.InventoryItem; -import com.andwati.orders.model.OrderItem; -import com.andwati.orders.model.OrderStatus; -import com.andwati.orders.model.Product; +import com.andwati.orders.model.*; +import com.andwati.orders.repository.InventoryItemRepository; +import com.andwati.orders.repository.OrderRepository; +import com.andwati.orders.repository.ProductRepository; import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; diff --git a/orders-backend/src/main/java/com/andwati/orders/controller/FareController.java b/orders-backend/src/main/java/com/andwati/orders/controller/FareController.java new file mode 100644 index 0000000..0f4993a --- /dev/null +++ b/orders-backend/src/main/java/com/andwati/orders/controller/FareController.java @@ -0,0 +1,37 @@ +package com.andwati.orders.controller; + +import com.andwati.orders.dto.response.FareCalculationResponse; +import com.andwati.orders.services.FareCalculationService; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; + +@Validated +@RestController +public class FareController { + + private final FareCalculationService fareCalculationService; + + public FareController(FareCalculationService fareCalculationService) { + this.fareCalculationService = fareCalculationService; + } + + @GetMapping("/api/fare/calculate") + public FareCalculationResponse calculateFare( + @RequestParam + @NotNull(message = "distanceKm is required") + @DecimalMin(value = "0.0", inclusive = false, message = "distanceKm must be greater than 0") + BigDecimal distanceKm, + + @RequestParam(required = false) + @DecimalMin(value = "1.0", message = "surgeMultiplier must be greater than or equal to 1.0") + BigDecimal surgeMultiplier + ) { + return fareCalculationService.calculateFare(distanceKm, surgeMultiplier); + } +} \ No newline at end of file diff --git a/orders-backend/src/main/java/com/andwati/orders/controller/HealthController.java b/orders-backend/src/main/java/com/andwati/orders/controller/HealthController.java new file mode 100644 index 0000000..632aa0c --- /dev/null +++ b/orders-backend/src/main/java/com/andwati/orders/controller/HealthController.java @@ -0,0 +1,15 @@ +package com.andwati.orders.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +public class HealthController { + + @GetMapping("/api/health") + public Map health() { + return Map.of("status", "UP"); + } +} \ No newline at end of file diff --git a/orders-backend/src/main/java/com/andwati/orders/controller/InventoryController.java b/orders-backend/src/main/java/com/andwati/orders/controller/InventoryController.java new file mode 100644 index 0000000..980de9b --- /dev/null +++ b/orders-backend/src/main/java/com/andwati/orders/controller/InventoryController.java @@ -0,0 +1,32 @@ +package com.andwati.orders.controller; + +import com.andwati.orders.dto.response.InventoryResponse; +import com.andwati.orders.dto.response.LowStockInventoryResponse; +import com.andwati.orders.services.InventoryService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/inventory") +public class InventoryController { + + private final InventoryService inventoryService; + + public InventoryController(InventoryService inventoryService) { + this.inventoryService = inventoryService; + } + + @GetMapping + public InventoryResponse getInventory() { + return inventoryService.getInventory(); + } + + @GetMapping("/low-stock") + public LowStockInventoryResponse getLowStockItems( + @RequestParam(required = false) Integer threshold + ) { + return inventoryService.getLowStockItems(threshold); + } +} \ No newline at end of file diff --git a/orders-backend/src/main/java/com/andwati/orders/controller/OrderController.java b/orders-backend/src/main/java/com/andwati/orders/controller/OrderController.java new file mode 100644 index 0000000..6e3451e --- /dev/null +++ b/orders-backend/src/main/java/com/andwati/orders/controller/OrderController.java @@ -0,0 +1,61 @@ +package com.andwati.orders.controller; + +import com.andwati.orders.dto.request.CreateOrderRequest; +import com.andwati.orders.dto.response.CancelOrderResponse; +import com.andwati.orders.dto.response.OrderResponse; +import com.andwati.orders.dto.response.OrderSummaryResponse; +import com.andwati.orders.dto.response.PageResponse; +import com.andwati.orders.model.OrderStatus; +import com.andwati.orders.services.OrderService; +import jakarta.validation.Valid; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.util.UUID; + +@RestController +@RequestMapping("/api/orders") +public class OrderController { + + private final OrderService orderService; + + public OrderController(OrderService orderService) { + this.orderService = orderService; + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public OrderResponse placeOrder(@Valid @RequestBody CreateOrderRequest request) { + return orderService.placeOrder(request); + } + + @GetMapping + public PageResponse listOrders( + @RequestParam(required = false) OrderStatus status, + + @RequestParam(required = false) + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) + LocalDate from, + + @RequestParam(required = false) + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) + LocalDate to, + + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int size + ) { + return orderService.listOrders(status, from, to, page, size); + } + + @GetMapping("/{id}") + public OrderResponse getOrder(@PathVariable UUID id) { + return orderService.getOrder(id); + } + + @DeleteMapping("/{id}") + public CancelOrderResponse cancelOrder(@PathVariable UUID id) { + return orderService.cancelOrder(id); + } +} \ No newline at end of file