OrderController.java

package com.learning.yasminishop.order;

import com.learning.yasminishop.common.dto.APIResponse;
import com.learning.yasminishop.common.dto.PaginationResponse;
import com.learning.yasminishop.common.utility.PageSortUtility;
import com.learning.yasminishop.order.dto.filter.OrderFilter;
import com.learning.yasminishop.order.dto.request.OrderRequest;
import com.learning.yasminishop.order.dto.response.OrderAdminResponse;
import com.learning.yasminishop.order.dto.response.OrderResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/orders")
@RequiredArgsConstructor
@Slf4j
public class OrderController {

    private final OrderService orderService;
    private final PageSortUtility pageSortUtility;


    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    @PreAuthorize("hasRole('USER')")
    public APIResponse<OrderResponse> createOrder(@Valid @RequestBody OrderRequest orderRequest) {
        OrderResponse orderResponse = orderService.create(orderRequest);
        return APIResponse.<OrderResponse>builder()
                .result(orderResponse)
                .build();
    }

    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    @PreAuthorize("hasRole('USER')")
    public APIResponse<List<OrderResponse>> getAllOrders() {
        List<OrderResponse> orderResponse = orderService.getAllOrderByUser();
        return APIResponse.<List<OrderResponse>>builder()
                .result(orderResponse)
                .build();
    }

    @GetMapping("/{id}")
    @ResponseStatus(HttpStatus.OK)
    public APIResponse<OrderResponse> getOrderById(@PathVariable String id) {
        OrderResponse orderResponse = orderService.getOrderById(id);
        return APIResponse.<OrderResponse>builder()
                .result(orderResponse)
                .build();
    }

    @GetMapping("/admin")
    @ResponseStatus(HttpStatus.OK)
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<PaginationResponse<OrderAdminResponse>> getAllOrdersForAdmin(@Valid @ModelAttribute OrderFilter orderFilter) {

        Pageable pageable = pageSortUtility.createPageable(orderFilter.getPage(),
                orderFilter.getItemsPerPage(),
                orderFilter.getSortBy(),
                orderFilter.getOrderBy());

        PaginationResponse<OrderAdminResponse> orders = orderService.getAllOrders(orderFilter, pageable);

        return APIResponse.<PaginationResponse<OrderAdminResponse>>builder()
                .result(orders)
                .build();
    }

    @GetMapping("/{id}/admin")
    @ResponseStatus(HttpStatus.OK)
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<OrderAdminResponse> getOrderByIdForAdmin(@PathVariable String id) {
        OrderAdminResponse orderResponse = orderService.getOrderByIdForAdmin(id);
        return APIResponse.<OrderAdminResponse>builder()
                .result(orderResponse)
                .build();
    }

    @PatchMapping("/{id}/status")
    @ResponseStatus(HttpStatus.OK)
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<String> updateOrderStatus(@PathVariable String id, @RequestParam String status) {
        orderService.updateOrderStatus(id, status);
        return APIResponse.<String>builder()
                .message("Order status updated successfully")
                .build();
    }

}