AssignmentController.java

package com.nashtech.rookie.asset_management_0701.controllers;

import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.nashtech.rookie.asset_management_0701.dtos.filters.AssignmentFilter;
import com.nashtech.rookie.asset_management_0701.dtos.requests.assignment.AssignmentCreateDto;
import com.nashtech.rookie.asset_management_0701.dtos.requests.assignment.AssignmentUpdateDto;
import com.nashtech.rookie.asset_management_0701.dtos.responses.APIResponse;
import com.nashtech.rookie.asset_management_0701.dtos.responses.PaginationResponse;
import com.nashtech.rookie.asset_management_0701.dtos.responses.assigment.AssignmentHistory;
import com.nashtech.rookie.asset_management_0701.dtos.responses.assigment.AssignmentResponse;
import com.nashtech.rookie.asset_management_0701.dtos.responses.assigment.AssignmentResponseDto;
import com.nashtech.rookie.asset_management_0701.enums.EAssignmentState;
import com.nashtech.rookie.asset_management_0701.services.assignment.AssignmentService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;


@RestController
@RequestMapping("/api/v1/assignments")
@RequiredArgsConstructor
public class AssignmentController {

    private final AssignmentService assignmentService;

    @GetMapping("/{assetId}/history")
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<PaginationResponse<AssignmentHistory>> getAssignmentHistory (
            @PathVariable Long assetId
            , @RequestParam(defaultValue = "1") Integer pageNumber
            , @RequestParam(defaultValue = "10") Integer pageSize) {
        return APIResponse.<PaginationResponse<AssignmentHistory>>builder()
                .result(assignmentService.getAssignmentHistory(assetId, pageNumber, pageSize))
                .build();
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<AssignmentResponseDto> createAssignment (
            @Valid @RequestBody AssignmentCreateDto assignmentCreateDto) {
        return APIResponse.<AssignmentResponseDto>builder()
                .result(assignmentService.createAssignment(assignmentCreateDto))
                .build();
    }

    @GetMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<AssignmentResponse> getAssignment (@PathVariable("id") Long id) {
        return APIResponse.<AssignmentResponse>builder()
                .result(assignmentService.getAssignment(id))
                .build();
    }

    @PutMapping("/{id}")
    @ResponseStatus(HttpStatus.OK)
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<AssignmentResponseDto> updateAssignment (
            @PathVariable("id") Long id,
            @Valid @RequestBody AssignmentUpdateDto assignmentUpdateDto) {

        return APIResponse.<AssignmentResponseDto>builder()
                .result(assignmentService.updateAssignment(id, assignmentUpdateDto))
                .build();
    }

    @DeleteMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<String> deleteAssignment (@PathVariable Long id) {
        assignmentService.deleteAssignment(id);

        return APIResponse.<String>builder()
                .message("Assignment deleted successfully")
                .build();
    }
    @GetMapping("/me")
    public APIResponse<PaginationResponse<AssignmentResponseDto>> getMyAssignments (
            @Valid @ModelAttribute AssignmentFilter assignmentFilter){
        return APIResponse.<PaginationResponse<AssignmentResponseDto>>builder()
                .result(assignmentService.getMyAssignments(assignmentFilter))
                .build();
    }

    @GetMapping
    @PreAuthorize("hasRole('ADMIN')")
    public APIResponse<PaginationResponse<AssignmentResponseDto>> getAllAssignment (
        @Valid @ModelAttribute AssignmentFilter filter){
        return APIResponse.<PaginationResponse<AssignmentResponseDto>>builder()
                .result(assignmentService.getAllAssignments(filter))
                .build();
    }

    @PatchMapping("/{id}")
    public APIResponse<AssignmentResponseDto> changeAssignmentState (
            @PathVariable Long id,
            @RequestParam("state") EAssignmentState state) {
        return APIResponse.<AssignmentResponseDto>builder()
                .result(assignmentService.changeState(id, state))
                .build();
    }
}