import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, ParseUUIDPipe, Patch, Post, Query, UseGuards, } from '@nestjs/common'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags, } from '@nestjs/swagger'; import { AuthGuard } from 'src/common/guards/auth.guard'; import { RolesGuard } from 'src/common/guards/roles.guard'; import { Roles } from 'src/common/decorators/roles.decorator'; import { User } from 'src/common/decorators/user.decorator'; import { StatutEvenementAgendaType, TypeEvenementAgendaType, } from 'src/entities/evenements_agenda.entity'; import { RoleType } from 'src/entities/users.entity'; import { EvenementsAgendaService } from './evenements-agenda.service'; import { EvenementAgendaDto, CreerEvenementAgendaDto, ListeEvenementsAgendaDto, MajEvenementAgendaDto, } from './dto/evenements-agenda.dto'; @ApiTags('Événements agenda') @ApiBearerAuth('access-token') @Controller('evenements-agenda') @UseGuards(AuthGuard, RolesGuard) export class EvenementsAgendaController { constructor(private readonly evenementsAgendaService: EvenementsAgendaService) {} @Get() @Roles(RoleType.PARENT, RoleType.ASSISTANTE_MATERNELLE) @ApiOperation({ summary: 'Lister les absences / congés / arrêts — ticket #205 / ex-#172', description: 'Sans placementId : tous les placements du user (parent = famille multi-AM ; AM = tous accueils). ' + 'Avec placementId : un couple enfant–AM.', }) @ApiQuery({ name: 'placementId', required: false }) @ApiQuery({ name: 'type', required: false, enum: TypeEvenementAgendaType }) @ApiQuery({ name: 'statut', required: false, enum: StatutEvenementAgendaType }) @ApiQuery({ name: 'from', required: false, description: 'YYYY-MM-DD' }) @ApiQuery({ name: 'to', required: false, description: 'YYYY-MM-DD' }) @ApiResponse({ status: 200, type: ListeEvenementsAgendaDto }) lister( @User('id') userId: string, @User('role') role: RoleType, @Query('placementId') placementId?: string, @Query('type') type?: TypeEvenementAgendaType, @Query('statut') statut?: StatutEvenementAgendaType, @Query('from') from?: string, @Query('to') to?: string, ): Promise { return this.evenementsAgendaService.lister(userId, role, { placementId, type, statut, from, to, }); } @Post() @Roles(RoleType.PARENT, RoleType.ASSISTANTE_MATERNELLE) @ApiOperation({ summary: 'Créer une période d’absence / congé / arrêt — #172' }) @ApiBody({ type: CreerEvenementAgendaDto }) @ApiResponse({ status: 201, type: EvenementAgendaDto }) @HttpCode(HttpStatus.CREATED) creer( @User('id') userId: string, @User('role') role: RoleType, @Body() dto: CreerEvenementAgendaDto, ): Promise { return this.evenementsAgendaService.creer(userId, role, dto); } @Patch(':id') @Roles(RoleType.PARENT, RoleType.ASSISTANTE_MATERNELLE) @ApiOperation({ summary: 'Mettre à jour dates / statut / motif — #172', description: 'Parent : accept/refuse congé (motivation si refus), ack arrêt. ' + 'AM : modifier dates (en attente / refuse / accepté), republication après refus.', }) @ApiBody({ type: MajEvenementAgendaDto }) @ApiResponse({ status: 200, type: EvenementAgendaDto }) maj( @User('id') userId: string, @User('role') role: RoleType, @Param('id', ParseUUIDPipe) id: string, @Body() dto: MajEvenementAgendaDto, ): Promise { return this.evenementsAgendaService.maj(userId, role, id, dto); } @Delete(':id') @Roles(RoleType.PARENT, RoleType.ASSISTANTE_MATERNELLE) @HttpCode(HttpStatus.NO_CONTENT) @ApiOperation({ summary: 'Supprimer une absence (hard delete) — #172' }) @ApiResponse({ status: 204 }) async supprimer( @User('id') userId: string, @User('role') role: RoleType, @Param('id', ParseUUIDPipe) id: string, ): Promise { await this.evenementsAgendaService.supprimer(userId, role, id); } }