import { Router } from "express"; import multer from "multer"; import { storagePut } from "../storage"; import { randomBytes } from "crypto"; import path from "path"; import fs from "fs/promises"; const router = Router(); // Configuration de multer pour gérer les uploads en mémoire const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: 10 * 1024 * 1024, // 10MB max }, }); /** * Route d'upload de fichiers vers S3 * POST /api/upload-file * Body: multipart/form-data avec un champ "file" */ router.post("/", upload.single("file"), async (req, res) => { try { if (!req.file) { return res.status(400).json({ success: false, message: "Aucun fichier fourni", }); } const file = req.file; // Générer un nom de fichier unique const randomSuffix = randomBytes(8).toString("hex"); const ext = path.extname(file.originalname); const baseName = path.basename(file.originalname, ext); const safeBaseName = baseName.replace(/[^a-zA-Z0-9-_]/g, "_"); const fileName = `rappels-attachments/${Date.now()}-${randomSuffix}-${safeBaseName}${ext}`; // Essayer d'uploader vers S3, sinon utiliser le stockage local try { const result = await storagePut( fileName, file.buffer, file.mimetype ); console.log(`[UploadFile] Fichier uploadé vers S3: ${file.originalname} (${file.size} octets)`); return res.json({ success: true, url: result.url, key: fileName, filename: file.originalname, mimetype: file.mimetype, size: file.size, message: "Fichier uploadé avec succès", }); } catch (s3Error) { console.warn(`[UploadFile] Échec S3, utilisation du stockage local:`, s3Error); // Fallback: sauvegarder localement const uploadsDir = path.join(process.cwd(), 'uploads', 'rappels-attachments'); await fs.mkdir(uploadsDir, { recursive: true }); const localFileName = `${Date.now()}-${randomSuffix}-${safeBaseName}${ext}`; const localPath = path.join(uploadsDir, localFileName); await fs.writeFile(localPath, file.buffer); const publicUrl = `/uploads/rappels-attachments/${localFileName}`; console.log(`[UploadFile] Fichier sauvegardé localement: ${file.originalname} (${file.size} octets)`); return res.json({ success: true, url: publicUrl, key: fileName, filename: file.originalname, mimetype: file.mimetype, size: file.size, message: "Fichier uploadé avec succès (stockage local)", }); } } catch (error) { console.error("[UploadFile] Error:", error); return res.status(500).json({ success: false, message: "Erreur lors de l'upload du fichier", }); } }); export default router;