fix: motivation dossier famille à l’inscription + servir /uploads + Traefik
- 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
This commit is contained in:
parent
4969be5809
commit
e7f0037ac3
@ -6,6 +6,18 @@ import { SwaggerModule } from '@nestjs/swagger/dist/swagger-module';
|
|||||||
import { DocumentBuilder } from '@nestjs/swagger';
|
import { DocumentBuilder } from '@nestjs/swagger';
|
||||||
import { ValidationPipe } from '@nestjs/common';
|
import { ValidationPipe } from '@nestjs/common';
|
||||||
import { LogRequestInterceptor } from './common/interceptors/log-request.interceptor';
|
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() {
|
async function bootstrap() {
|
||||||
const app = await NestFactory.create<NestExpressApplication>(AppModule, {
|
const app = await NestFactory.create<NestExpressApplication>(AppModule, {
|
||||||
@ -16,6 +28,13 @@ async function bootstrap() {
|
|||||||
app.useBodyParser('json', { limit: '15mb' });
|
app.useBodyParser('json', { limit: '15mb' });
|
||||||
app.useBodyParser('urlencoded', { extended: true, 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)
|
// Log de chaque appel API si LOG_API_REQUESTS=true (mode debug)
|
||||||
app.useGlobalInterceptors(new LogRequestInterceptor());
|
app.useGlobalInterceptors(new LogRequestInterceptor());
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,8 @@ import { Parents } from 'src/entities/parents.entity';
|
|||||||
import { Children, StatutEnfantType } from 'src/entities/children.entity';
|
import { Children, StatutEnfantType } from 'src/entities/children.entity';
|
||||||
import { ParentsChildren } from 'src/entities/parents_children.entity';
|
import { ParentsChildren } from 'src/entities/parents_children.entity';
|
||||||
import { AssistanteMaternelle } from 'src/entities/assistantes_maternelles.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 { LoginDto } from './dto/login.dto';
|
||||||
import { RepriseDossierDto } from './dto/reprise-dossier.dto';
|
import { RepriseDossierDto } from './dto/reprise-dossier.dto';
|
||||||
import { RepriseIdentifyResponseDto } from './dto/reprise-identify.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 {
|
return {
|
||||||
parent1: parent1Enregistre,
|
parent1: parent1Enregistre,
|
||||||
parent2: parent2Enregistre,
|
parent2: parent2Enregistre,
|
||||||
|
|||||||
@ -70,6 +70,12 @@ services:
|
|||||||
- "traefik.http.routers.ptitspas-api.tls.certresolver=leresolver"
|
- "traefik.http.routers.ptitspas-api.tls.certresolver=leresolver"
|
||||||
- "traefik.http.routers.ptitspas-api.priority=20"
|
- "traefik.http.routers.ptitspas-api.priority=20"
|
||||||
- "traefik.http.services.ptitspas-api.loadbalancer.server.port=3000"
|
- "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:
|
networks:
|
||||||
- ptitspas_network
|
- ptitspas_network
|
||||||
- proxy_network
|
- proxy_network
|
||||||
|
|||||||
@ -151,7 +151,7 @@ class ParentDossier {
|
|||||||
|
|
||||||
factory ParentDossier.fromJson(Map<String, dynamic> json) {
|
factory ParentDossier.fromJson(Map<String, dynamic> json) {
|
||||||
return ParentDossier(
|
return ParentDossier(
|
||||||
id: json['id']?.toString() ?? '',
|
id: json['user_id']?.toString() ?? json['id']?.toString() ?? '',
|
||||||
email: json['email']?.toString() ?? '',
|
email: json['email']?.toString() ?? '',
|
||||||
prenom: json['prenom']?.toString(),
|
prenom: json['prenom']?.toString(),
|
||||||
nom: json['nom']?.toString(),
|
nom: json['nom']?.toString(),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user