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(),