import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Query, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { Roles } from '~/auth/enums'; import { IJwtPayload } from '~/auth/interfaces'; import { AllowedRoles, AuthenticatedUser } from '~/common/decorators'; import { RolesGuard } from '~/common/guards'; import { ApiDataPageResponse, ApiDataResponse, ApiLangRequestHeader } from '~/core/decorators'; import { PageOptionsRequestDto } from '~/core/dtos'; import { CustomParseUUIDPipe } from '~/core/pipes'; import { ResponseFactory } from '~/core/utils'; import { CreateAllowanceRequestDto } from '../dtos/request'; import { AllowanceResponseDto } from '../dtos/response'; import { AllowancesService } from '../services'; @Controller('allowances') @ApiTags('Allowances') @ApiBearerAuth() @ApiLangRequestHeader() export class AllowancesController { constructor(private readonly allowancesService: AllowancesService) {} @Post() @UseGuards(RolesGuard) @AllowedRoles(Roles.GUARDIAN) @ApiDataResponse(AllowanceResponseDto) async createAllowance(@AuthenticatedUser() { sub }: IJwtPayload, @Body() body: CreateAllowanceRequestDto) { const allowance = await this.allowancesService.createAllowance(sub, body); return ResponseFactory.data(new AllowanceResponseDto(allowance)); } @Get() @UseGuards(RolesGuard) @AllowedRoles(Roles.GUARDIAN) @ApiDataPageResponse(AllowanceResponseDto) async findAllowances(@AuthenticatedUser() { sub }: IJwtPayload, @Query() query: PageOptionsRequestDto) { const [allowances, itemCount] = await this.allowancesService.findAllowances(sub, query); return ResponseFactory.dataPage( allowances.map((allowance) => new AllowanceResponseDto(allowance)), { itemCount, page: query.page, size: query.size, }, ); } @Get(':allowanceId') @UseGuards(RolesGuard) @AllowedRoles(Roles.GUARDIAN) @ApiDataResponse(AllowanceResponseDto) async findAllowanceById( @AuthenticatedUser() { sub }: IJwtPayload, @Param('allowanceId', CustomParseUUIDPipe) allowanceId: string, ) { const allowance = await this.allowancesService.findAllowanceById(allowanceId, sub); return ResponseFactory.data(new AllowanceResponseDto(allowance)); } @Delete(':allowanceId') @UseGuards(RolesGuard) @AllowedRoles(Roles.GUARDIAN) @ApiDataResponse(AllowanceResponseDto) @HttpCode(HttpStatus.NO_CONTENT) deleteAllowance( @AuthenticatedUser() { sub }: IJwtPayload, @Param('allowanceId', CustomParseUUIDPipe) allowanceId: string, ) { return this.allowancesService.deleteAllowance(sub, allowanceId); } }