OrderController.java
package com.github.danielemasone.orderevents.api;
import com.github.danielemasone.orderevents.api.dto.CreateOrderRequest;
import com.github.danielemasone.orderevents.api.dto.OrderResponse;
import com.github.danielemasone.orderevents.application.OrderService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ProblemDetail;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* REST entry point for clients that create orders and trigger the event-driven flow.
*/
@RestController
@RequestMapping("/api/orders")
@Tag(name = "Orders", description = "Order creation API")
public class OrderController {
private final OrderService orderService;
public OrderController(OrderService orderService) {
this.orderService = orderService;
}
/**
* Accepts a validated order creation command and returns the persisted representation.
* No Location header is emitted because this focused API does not expose an order retrieval endpoint.
*
* @param request incoming order command
* @return created order
*/
@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(summary = "Create an order", description = "Persists an order and publishes an OrderCreatedEvent to Kafka.")
@ApiResponse(responseCode = "201", description = "Order created",
content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(implementation = OrderResponse.class)))
@ApiResponse(responseCode = "400", description = "Invalid request",
content = @Content(mediaType = MediaType.APPLICATION_PROBLEM_JSON_VALUE,
schema = @Schema(implementation = ProblemDetail.class)))
public ResponseEntity<OrderResponse> createOrder(@Valid @RequestBody CreateOrderRequest request) {
OrderResponse response = orderService.createOrder(request);
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}
}