penisularhr / src / modules / employee / employee.controller.ts
employee.controller.ts
Raw
import {
  Body,
  Controller,
  Get,
  HttpCode,
  HttpStatus,
  Param,
  Patch,
  Post,
  Query,
} from '@nestjs/common';
import { ApiOkResponse, ApiTags } from '@nestjs/swagger';

import { type PageDto } from '../../common/dto/page.dto';
import { RoleType } from '../../constants';
import { ApiPageOkResponse, Auth, Whitelist } from '../../decorators';
import { EmployeeNotFoundException } from '../../exceptions';
import { CreateEmployeeDto } from './dtos/create-employee.dto';
import { EmployeeDto } from './dtos/employee.dto';
import { EmployeePageOptionsDto } from './dtos/get-employee-page.dto';
import { UpdateEmployeeDto } from './dtos/update-employee.dto';
import { EmployeeService } from './employee.service';

@Controller('employee')
@ApiTags('employee')
export class EmployeeController {
  constructor(private employeeService: EmployeeService) {}

  @Get()
  @Whitelist()
  @Auth([RoleType.ADMIN, RoleType.USER])
  @HttpCode(HttpStatus.OK)
  @ApiPageOkResponse({ type: EmployeeDto, description: 'Get employees list' })
  async getEmployees(
    @Query() query: EmployeePageOptionsDto,
  ): Promise<PageDto<EmployeeDto>> {
    return this.employeeService.findMany(query);
  }

  @Post()
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async createGame(@Body() body: CreateEmployeeDto): Promise<EmployeeDto> {
    const employeeEntity = await this.employeeService.createEmployee(body);

    return employeeEntity.toDto();
  }

  @Patch(':id')
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async updateGame(
    @Param('id') id: Uuid,
    @Body() body: UpdateEmployeeDto,
  ): Promise<EmployeeDto> {
    const toPatchEntity = await this.employeeService.findOne({
      id,
    });

    if (!toPatchEntity) {
      throw new EmployeeNotFoundException();
    }

    const employeeEntity = await this.employeeService.updateEmployee(
      toPatchEntity,
      body,
    );

    return employeeEntity.toDto();
  }
}