OrderController.java

package hello.commerce.order;

import hello.commerce.common.request.PageRequestDto;
import hello.commerce.order.dto.OrderRequestV1;
import hello.commerce.order.dto.OrderResponseV1;
import hello.commerce.order.dto.OrderListResponseV1;
import hello.commerce.order.model.Order;
import hello.commerce.order.model.OrderStatus;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.net.URI;


@RequiredArgsConstructor
@RestController
@RequestMapping
public class OrderController {

    private final OrderService orderService;

    @PostMapping("/v1/orders")
    public ResponseEntity<OrderResponseV1> createOrder(@Valid @RequestBody OrderRequestV1 orderRequest) {
        Order order = orderService.createOrder(orderRequest);
        OrderResponseV1 orderResponseV1 = OrderResponseV1.fromEntity(order);

        // 주문 생성 후 redirect URI 생성
        URI location = URI.create("/v1/orders/" + order.getId());
        return ResponseEntity.created(location).body(orderResponseV1);
    }

    @GetMapping("/v1/orders")
    public ResponseEntity<OrderListResponseV1> getOrders(
            @Valid @ModelAttribute PageRequestDto pageRequestDto,
            @RequestParam(value = "order_status", required = false) OrderStatus orderStatus
    ) {
        Pageable pageable = pageRequestDto.toPageable();
        Page<Order> orders = (orderStatus != null)
                ? orderService.getOrders(pageable, orderStatus)
                : orderService.getOrders(pageable);
        OrderListResponseV1 orderListResponseV1 = OrderListResponseV1.fromEntities(orders);

        return ResponseEntity.ok(orderListResponseV1);
    }

    @GetMapping("/v1/orders/{order_id}")
    public ResponseEntity<OrderResponseV1> getOrderById(@PathVariable("order_id") Long orderId) {

        Order orderById = orderService.getOrderById(orderId);
        OrderResponseV1 response = OrderResponseV1.fromEntity(orderById);

        return ResponseEntity.ok(response);
    }
}