penisularhr / src / modules / block / block.controller.ts
block.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 { BlockNotFoundException } from '../../exceptions';
import { BlockService } from './block.service';
import { BlockDto } from './dtos/block.dto';
import { CreateBlockDto } from './dtos/create-block.dto';
import { BlockPageOptionsDto } from './dtos/get-block-page.dto';
import { UpdateBlockDto } from './dtos/update-block.dto';

@Controller('block')
@ApiTags('block')
export class BlockController {
  constructor(private blockService: BlockService) {}

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

  @Post()
  @Whitelist()
  @Auth([RoleType.ADMIN])
  @HttpCode(HttpStatus.OK)
  @ApiOkResponse()
  async createPublicHoliday(@Body() body: CreateBlockDto): Promise<BlockDto> {
    const blockEntity = await this.blockService.createBlock(body);

    return blockEntity.toDto();
  }

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

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

    const blockEntity = await this.blockService.updateblock(
      toPatchEntity,
      body,
    );

    return blockEntity.toDto();
  }
}