import { Controller, Delete, Get, Param, Query, UseGuards, } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiParam, ApiQuery, ApiResponse, ApiTags, } from '@nestjs/swagger'; import { Roles } from 'src/common/decorators/roles.decorator'; import { RoleType, Users } from 'src/entities/users.entity'; import { AuthGuard } from 'src/common/guards/auth.guard'; import { RolesGuard } from 'src/common/guards/roles.guard'; import { User } from 'src/common/decorators/user.decorator'; import { DossiersService } from './dossiers.service'; import { SuppressionService } from '../suppressions/suppression.service'; import { DossierUnifieDto } from './dto/dossier-unifie.dto'; import { DossierListItemDto } from './dto/dossier-list-item.dto'; @ApiTags('Dossiers') @ApiBearerAuth('access-token') @Controller('dossiers') @UseGuards(AuthGuard, RolesGuard) export class DossiersController { constructor( private readonly dossiersService: DossiersService, private readonly suppressionService: SuppressionService, ) {} @Get() @Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR, RoleType.GESTIONNAIRE) @ApiOperation({ summary: 'Liste unifiée des dossiers (familles + AM) — ticket #153', description: '1 entrée = 1 numero_dossier. Types `famille` | `assistante_maternelle`. ' + 'Filtre optionnel `q` (n°, nom, email). Tri : à valider d’abord, puis n° décroissant. ' + '`sans_enfant` (#159) pour dossiers famille sans enfant.', }) @ApiQuery({ name: 'q', required: false, description: 'Recherche libre : n° dossier, libellé, email…', }) @ApiResponse({ status: 200, type: [DossierListItemDto] }) @ApiResponse({ status: 403, description: 'Accès refusé' }) list(@Query('q') q?: string): Promise { return this.dossiersService.listDossiers(q); } @Get(':numeroDossier') @Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR, RoleType.GESTIONNAIRE) @ApiOperation({ summary: 'Dossier complet par numéro (AM ou famille) – Ticket #119' }) @ApiParam({ name: 'numeroDossier', description: 'Numéro de dossier (ex: 2026-000001)' }) @ApiResponse({ status: 200, description: 'Dossier famille ou AM', type: DossierUnifieDto }) @ApiResponse({ status: 404, description: 'Aucun dossier pour ce numéro' }) @ApiResponse({ status: 403, description: 'Accès refusé' }) getDossier(@Param('numeroDossier') numeroDossier: string): Promise { return this.dossiersService.getDossierByNumero(numeroDossier); } @Delete(':numeroDossier') @Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR, RoleType.GESTIONNAIRE) @ApiOperation({ summary: 'Supprimer un dossier (famille ou AM) — #159', description: 'Famille : parents + enfants. AM : compte AM + dossier AM (enfants conservés, placements clos).', }) @ApiParam({ name: 'numeroDossier', description: 'Numéro de dossier' }) @ApiResponse({ status: 200, description: 'Résultat de suppression' }) @ApiResponse({ status: 404, description: 'Dossier introuvable' }) remove( @Param('numeroDossier') numeroDossier: string, @User() currentUser: Users, ) { return this.suppressionService.deleteDossier(numeroDossier, currentUser); } }