import { BadRequestException, Body, Controller, Delete, Get, Param, ParseBoolPipe, ParseEnumPipe, ParseIntPipe, Patch, Post, Query, UseGuards, UsePipes, ValidationPipe } from "@nestjs/common"; import { LeaveRequestsService } from "../services/leave-requests.service"; import { CreateLeaveRequestsDto } from "../dtos/create-leave-requests.dto"; import { LeaveRequests } from "@prisma/client"; import { UpdateLeaveRequestsDto } from "../dtos/update-leave-requests.dto"; import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { LeaveApprovalStatus, Roles as RoleEnum } from '.prisma/client'; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { LeaveRequestEntity } from "../dtos/swagger-entities/leave-requests.entity"; import { SearchLeaveRequestsDto } from "../dtos/search-leave-requests.dto"; @ApiTags('Leave Requests') @ApiBearerAuth('access-token') // @UseGuards() @Controller('leave-requests') export class LeaveRequestController { constructor(private readonly leaveRequetsService: LeaveRequestsService){} @Post() @RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({summary: 'Create leave request' }) @ApiResponse({ status: 201, description: 'Leave request created',type: LeaveRequestEntity }) @ApiResponse({ status: 400, description: 'Incomplete task or invalid data' }) create(@Body() dto: CreateLeaveRequestsDto): Promise { return this. leaveRequetsService.create(dto); } @Get() @RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({summary: 'Find all leave request' }) @ApiResponse({ status: 201, description: 'List of Leave requests found',type: LeaveRequestEntity, isArray: true }) @ApiResponse({ status: 400, description: 'List of leave request not found' }) @UsePipes(new ValidationPipe({transform: true, whitelist: true})) findAll(@Query() filters: SearchLeaveRequestsDto): Promise<(LeaveRequests & {daysRequested:number; cost: number})[]> { return this.leaveRequetsService.findAll(filters); } @Get(':id') @RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({summary: 'Find leave request' }) @ApiResponse({ status: 201, description: 'Leave request found',type: LeaveRequestEntity }) @ApiResponse({ status: 400, description: 'Leave request not found' }) findOne(@Param('id', ParseIntPipe) id: number): Promise { return this.leaveRequetsService.findOne(id); } @Patch(':id') @RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({summary: 'Update leave request' }) @ApiResponse({ status: 201, description: 'Leave request updated',type: LeaveRequestEntity }) @ApiResponse({ status: 400, description: 'Leave request not found' }) update(@Param('id', ParseIntPipe) id: number,@Body() dto: UpdateLeaveRequestsDto): Promise { return this.leaveRequetsService.update(id, dto); } @Delete(':id') @RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({summary: 'Delete leave request' }) @ApiResponse({ status: 201, description: 'Leave request deleted',type: LeaveRequestEntity }) @ApiResponse({ status: 400, description: 'Leave request not found' }) remove(@Param('id', ParseIntPipe) id: number): Promise { return this.leaveRequetsService.remove(id); } @Patch(':id/approval') updateApproval( @Param('id', ParseIntPipe) id: number, @Body('is_approved', ParseBoolPipe) isApproved: boolean): Promise { const approvalStatus = isApproved ? LeaveApprovalStatus.APPROVED : LeaveApprovalStatus.DENIED; return this.leaveRequetsService.update(id, { approval_status: approvalStatus }); } }