Files
petitspas/backend/src/modules/evenements-agenda/evenements-agenda.controller.ts
T
jmartinandCursor 2114748d44 feat(#205): renommer absences_garde → evenements_agenda
Migration live + BDD.sql from-scratch, module Nest / API
/evenements-agenda, FK cartes id_evenement. Front stub path aligné.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-01 17:07:54 +02:00

125 lines
4.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<ListeEvenementsAgendaDto> {
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<EvenementAgendaDto> {
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<EvenementAgendaDto> {
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<void> {
await this.evenementsAgendaService.supprimer(userId, role, id);
}
}