Matrice PO #154 : supprimer dossiers famille/AM, parents, enfants et comptes staff avec règles métier (placements clôturés, sans_enfant, cascade foyer, droits gestionnaire/admin). Poubelle en liste, dialogues de confirmation, garde-fou gestionnaire→gestionnaire. Inclut polish hauteur modale fiche AM.
85 lines
3.2 KiB
TypeScript
85 lines
3.2 KiB
TypeScript
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<DossierListItemDto[]> {
|
||
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<DossierUnifieDto> {
|
||
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);
|
||
}
|
||
}
|