Compare commits

...

3 Commits

Author SHA1 Message Date
25b5e0dd93 merge: fix upload documents légaux (#126) 2026-04-17 17:35:16 +02:00
9acfc31e72 fix(infra): droits écriture /app/documents/legaux pour upload PDF (#126)
Le conteneur tournait en nestjs sans permission sur /app : mkdir sur
/app/documents/legaux échouait → 500 sur POST documents-legaux.
Création + chown dans l’image Docker + volume nommé pour persistance.

Made-with: Cursor
2026-04-17 13:42:35 +02:00
d8a81a56ae fix(documents-legaux): éviter 500 upload sans utilisateur valide (#126)
Ne plus associer televersePar à un UUID fictif inexistant ; laisser null tant que l’auth n’est pas branchée sur l’endpoint d’upload.

Made-with: Cursor
2026-04-17 13:33:36 +02:00
4 changed files with 11 additions and 6 deletions

View File

@ -32,8 +32,9 @@ COPY --from=builder /app/dist ./dist
RUN addgroup -g 1001 -S nodejs RUN addgroup -g 1001 -S nodejs
RUN adduser -S nestjs -u 1001 RUN adduser -S nestjs -u 1001
# Créer le dossier uploads et donner les permissions # Dossiers écriture runtime (nestjs non-root) : photos + documents légaux (PDF)
RUN mkdir -p /app/uploads/photos && chown -R nestjs:nodejs /app/uploads RUN mkdir -p /app/uploads/photos /app/documents/legaux && \
chown -R nestjs:nodejs /app/uploads /app/documents
USER nestjs USER nestjs

View File

@ -101,8 +101,9 @@ export class DocumentsLegauxController {
throw new BadRequestException('Aucun fichier fourni'); throw new BadRequestException('Aucun fichier fourni');
} }
// TODO: Récupérer l'ID utilisateur depuis le guard // TODO: Récupérer l'ID utilisateur depuis le guard quand l'auth sera branchée.
const userId = '00000000-0000-0000-0000-000000000000'; // Temporaire // En attendant, on n'associe pas d'utilisateur plutôt que d'envoyer un UUID fictif invalide.
const userId: string | null = null;
const document = await this.documentsService.uploadNouvelleVersion( const document = await this.documentsService.uploadNouvelleVersion(
uploadDto.type, uploadDto.type,

View File

@ -43,7 +43,7 @@ export class DocumentsLegauxService {
async uploadNouvelleVersion( async uploadNouvelleVersion(
type: 'cgu' | 'privacy', type: 'cgu' | 'privacy',
file: Express.Multer.File, file: Express.Multer.File,
userId: string, userId?: string | null,
): Promise<DocumentLegal> { ): Promise<DocumentLegal> {
// Validation du type de fichier // Validation du type de fichier
if (file.mimetype !== 'application/pdf') { if (file.mimetype !== 'application/pdf') {
@ -84,7 +84,7 @@ export class DocumentsLegauxService {
fichier_path: filePath, fichier_path: filePath,
fichier_hash: hash, fichier_hash: hash,
actif: false, // Pas actif par défaut actif: false, // Pas actif par défaut
televersePar: { id: userId } as any, televersePar: userId ? ({ id: userId } as any) : null,
televerseLe: new Date(), televerseLe: new Date(),
}); });

View File

@ -61,6 +61,8 @@ services:
UPLOAD_PHOTOS_DIR: ${UPLOAD_PHOTOS_DIR:-/app/uploads/photos} UPLOAD_PHOTOS_DIR: ${UPLOAD_PHOTOS_DIR:-/app/uploads/photos}
volumes: volumes:
- backend_uploads:/app/uploads/photos - backend_uploads:/app/uploads/photos
# PDF CGU / privacy (upload admin) — persistance entre redémarrages
- backend_documents_legaux:/app/documents/legaux
depends_on: depends_on:
- database - database
labels: labels:
@ -105,6 +107,7 @@ services:
volumes: volumes:
postgres_data: postgres_data:
backend_uploads: backend_uploads:
backend_documents_legaux:
networks: networks:
ptitspas_network: ptitspas_network: