penisularhr / src / modules / public-holiday / public-holiday.controller.ts
public-holiday.controller.ts
Raw
import {
  Body,
  Controller,
  Delete,
  Get,
  HttpCode,
  HttpStatus,
  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,
  UUIDParam,
  Whitelist,
} from '../../decorators';
import { PublicHolidayNotFoundException } from '../../exceptions';
import { CreatePublicHolidayDto } from './dtos/create-public-holiday.dto';
import { PublicHolidayPageOptionsDto } from './dtos/get-public-holiday-page.dto';
import { PublicHolidayDto } from './dtos/public-holiday.dto';
import { UpdatePublicHolidayDto } from './dtos/update-public-holiday.dto';
import { PublicHolidayService } from './public-holiday.service';

@Controller('public-holiday')
@ApiTags('public-holiday')
export class PublicHolidayController {
  constructor(private publicHolidayService: PublicHolidayService) {}

  @Get()
  @Whitelist()
  @Auth([RoleType.ADMIN, RoleType.USER])
  @HttpCode(HttpStatus.OK)
  @ApiPageOkResponse({
    type: PublicHolidayDto,
    description: 'Get public holidays list',
  })
  async getPublicHoliday(
    @Query() query: PublicHolidayPageOptionsDto,
  ): Promise<PageDto<PublicHolidayDto>> {
    return this.publicHolidayService.findMany(query);
  }

  @Post()
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async createPublicHoliday(
    @Body() body: CreatePublicHolidayDto,
  ): Promise<PublicHolidayDto> {
    const publicHolidayEntity =
      await this.publicHolidayService.createPublicHoliday(body);

    return publicHolidayEntity.toDto();
  }

  @Patch(':id')
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async updatePublicHoliday(
    @UUIDParam('id') id: Uuid,
    @Body() body: UpdatePublicHolidayDto,
  ): Promise<PublicHolidayDto> {
    const toPatchEntity = await this.publicHolidayService.findOne({
      id,
    });

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

    const publicHolidayEntity =
      await this.publicHolidayService.updatePublicHoliday(toPatchEntity, body);

    return publicHolidayEntity.toDto();
  }

  @Delete(':id')
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async delete(@UUIDParam('id') id: Uuid) {
    const toDeleteEntity = await this.publicHolidayService.findOne({
      id,
    });

    if (!toDeleteEntity) {
      throw new PublicHolidayNotFoundException();
    }

    await this.publicHolidayService.delete(toDeleteEntity);

    return { status: 'success' };
  }
}