From e7f0037ac3c5d8ae6ee7bcda41d68fd4a1255569 Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Sat, 11 Apr 2026 16:37:40 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20motivation=20dossier=20famille=20=C3=A0?= =?UTF-8?q?=20l=E2=80=99inscription=20+=20servir=20/uploads=20+=20Traefik?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Inscription parent: créer dossier_famille + dossier_famille_enfants (presentation_dossier) - Nest: useStaticAssets sur le volume uploads (chemins /uploads/photos/…) - docker-compose: route Traefik PathPrefix /uploads → API (priorité 18) - Front: ParentDossier.id depuis user_id (aligné API) Made-with: Cursor --- backend/src/main.ts | 19 +++++++++++++++++++ backend/src/routes/auth/auth.service.ts | 21 +++++++++++++++++++++ docker-compose.yml | 6 ++++++ frontend/lib/models/dossier_unifie.dart | 2 +- 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/backend/src/main.ts b/backend/src/main.ts index bcbaa5a..9c192d2 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -6,6 +6,18 @@ import { SwaggerModule } from '@nestjs/swagger/dist/swagger-module'; import { DocumentBuilder } from '@nestjs/swagger'; import { ValidationPipe } from '@nestjs/common'; import { LogRequestInterceptor } from './common/interceptors/log-request.interceptor'; +import * as path from 'path'; + +/** Répertoire disque contenant le dossier `photos` (ex. /app/uploads si photos dans /app/uploads/photos). */ +function resolveUploadsFilesystemRoot(): string { + const raw = process.env.UPLOAD_PHOTOS_DIR?.trim(); + const photosDir = raw + ? path.isAbsolute(raw) + ? raw + : path.resolve(process.cwd(), raw) + : path.join(process.cwd(), 'uploads', 'photos'); + return path.dirname(photosDir); +} async function bootstrap() { const app = await NestFactory.create(AppModule, { @@ -16,6 +28,13 @@ async function bootstrap() { app.useBodyParser('json', { limit: '15mb' }); app.useBodyParser('urlencoded', { extended: true, limit: '15mb' }); + // Servir les fichiers sous /uploads/... (photos enfants / AM). Traefik doit router /uploads vers l’API. + app.useStaticAssets(resolveUploadsFilesystemRoot(), { + prefix: '/uploads/', + index: false, + fallthrough: true, + }); + // Log de chaque appel API si LOG_API_REQUESTS=true (mode debug) app.useGlobalInterceptors(new LogRequestInterceptor()); diff --git a/backend/src/routes/auth/auth.service.ts b/backend/src/routes/auth/auth.service.ts index f509413..2665721 100644 --- a/backend/src/routes/auth/auth.service.ts +++ b/backend/src/routes/auth/auth.service.ts @@ -23,6 +23,8 @@ import { Parents } from 'src/entities/parents.entity'; import { Children, StatutEnfantType } from 'src/entities/children.entity'; import { ParentsChildren } from 'src/entities/parents_children.entity'; import { AssistanteMaternelle } from 'src/entities/assistantes_maternelles.entity'; +import { DossierFamille, DossierFamilleEnfant } from 'src/entities/dossier_famille.entity'; +import { StatutDossierType } from 'src/entities/dossiers.entity'; import { LoginDto } from './dto/login.dto'; import { RepriseDossierDto } from './dto/reprise-dossier.dto'; import { RepriseIdentifyResponseDto } from './dto/reprise-identify.dto'; @@ -335,6 +337,25 @@ export class AuthService { } } + // Dossier famille : motivation (texte_motivation côté GET) + liaisons enfants (ticket #119) + const presentationTrim = dto.presentation_dossier?.trim(); + const dossierFamilleEnt = manager.create(DossierFamille, { + numero_dossier: numeroDossier, + presentation: presentationTrim || undefined, + statut: StatutDossierType.ENVOYE, + parent: entiteParent, + }); + const dossierFamilleSaved = await manager.save(DossierFamille, dossierFamilleEnt); + for (const enfantEnregistre of enfantsEnregistres) { + await manager.save( + DossierFamilleEnfant, + manager.create(DossierFamilleEnfant, { + id_dossier_famille: dossierFamilleSaved.id, + id_enfant: enfantEnregistre.id, + }), + ); + } + return { parent1: parent1Enregistre, parent2: parent2Enregistre, diff --git a/docker-compose.yml b/docker-compose.yml index d5ff9c8..dcfa74b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -70,6 +70,12 @@ services: - "traefik.http.routers.ptitspas-api.tls.certresolver=leresolver" - "traefik.http.routers.ptitspas-api.priority=20" - "traefik.http.services.ptitspas-api.loadbalancer.server.port=3000" + # Fichiers statiques photos (URL relatives /uploads/...) — priorité > front (10) + - "traefik.http.routers.ptitspas-uploads.rule=Host(\"app.ptits-pas.fr\") && PathPrefix(\"/uploads\")" + - "traefik.http.routers.ptitspas-uploads.entrypoints=websecure" + - "traefik.http.routers.ptitspas-uploads.tls.certresolver=leresolver" + - "traefik.http.routers.ptitspas-uploads.priority=18" + - "traefik.http.routers.ptitspas-uploads.service=ptitspas-api" networks: - ptitspas_network - proxy_network diff --git a/frontend/lib/models/dossier_unifie.dart b/frontend/lib/models/dossier_unifie.dart index 83e3450..9dd4ccd 100644 --- a/frontend/lib/models/dossier_unifie.dart +++ b/frontend/lib/models/dossier_unifie.dart @@ -151,7 +151,7 @@ class ParentDossier { factory ParentDossier.fromJson(Map json) { return ParentDossier( - id: json['id']?.toString() ?? '', + id: json['user_id']?.toString() ?? json['id']?.toString() ?? '', email: json['email']?.toString() ?? '', prenom: json['prenom']?.toString(), nom: json['nom']?.toString(),