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>
125 lines
4.0 KiB
TypeScript
125 lines
4.0 KiB
TypeScript
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);
|
||
}
|
||
}
|