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' }; } }