import { BadRequestException, Body, Controller, Delete, Get, Param, ParseBoolPipe, ParseIntPipe, Patch, Post, Query, UseGuards, UsePipes, ValidationPipe } from '@nestjs/common'; import { TimesheetsQueryService } from '../services/timesheets-query.service'; import { CreateTimesheetDto } from '../dtos/create-timesheet.dto'; import { Timesheets } from '@prisma/client'; import { UpdateTimesheetDto } from '../dtos/update-timesheet.dto'; import { RolesAllowed } from "src/common/decorators/roles.decorators"; import { Roles as RoleEnum } from '.prisma/client'; import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { TimesheetsCommandService } from '../services/timesheets-command.service'; import { SearchTimesheetDto } from '../dtos/search-timesheet.dto'; import { TimesheetPeriodDto } from '../dtos/timesheet-period.dto'; @ApiTags('Timesheets') @ApiBearerAuth('access-token') // @UseGuards() @Controller('timesheets') export class TimesheetsController { constructor( private readonly timesheetsQuery: TimesheetsQueryService, private readonly timesheetsCommand: TimesheetsCommandService, ) {} @Post() //@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({ summary: 'Create timesheet' }) @ApiResponse({ status: 201, description: 'Timesheet created', type: CreateTimesheetDto }) @ApiResponse({ status: 400, description: 'Incomplete task or invalid data' }) create(@Body() dto: CreateTimesheetDto): Promise { return this.timesheetsQuery.create(dto); } @Get() //@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR) async getPeriodByQuery( @Query('year', ParseIntPipe ) year: number, @Query('period_no', ParseIntPipe ) period_no: number, @Query('email') email?: string ): Promise { if(!email || !email.trim()) throw new BadRequestException('Query param "email" is mandatory for this route.'); return this.timesheetsQuery.findAll(year, period_no, email.trim()); } @Get(':id') //@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.EMPLOYEE, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({ summary: 'Find timesheet' }) @ApiResponse({ status: 201, description: 'Timesheet found', type: CreateTimesheetDto }) @ApiResponse({ status: 400, description: 'Timesheet not found' }) findOne(@Param('id', ParseIntPipe) id: number): Promise { return this.timesheetsQuery.findOne(id); } @Patch(':id') //@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({ summary: 'Update timesheet' }) @ApiResponse({ status: 201, description: 'Timesheet updated', type: CreateTimesheetDto }) @ApiResponse({ status: 400, description: 'Timesheet not found' }) update( @Param('id', ParseIntPipe) id:number, @Body() dto: UpdateTimesheetDto, ): Promise { return this.timesheetsQuery.update(id, dto); } @Delete(':id') // @RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR) @ApiOperation({ summary: 'Delete timesheet' }) @ApiResponse({ status: 201, description: 'Timesheet deleted', type: CreateTimesheetDto }) @ApiResponse({ status: 400, description: 'Timesheet not found' }) remove(@Param('id', ParseIntPipe) id: number): Promise { return this.timesheetsQuery.remove(id); } @Patch(':id/approval') //@RolesAllowed(RoleEnum.ACCOUNTING, RoleEnum.ADMIN, RoleEnum.HR, RoleEnum.SUPERVISOR) async approve(@Param('id', ParseIntPipe) id: number, @Body('is_approved', ParseBoolPipe) isApproved: boolean) { return this.timesheetsCommand.updateApproval(id, isApproved); } }