import { Router } from "express"; import multer from "multer"; import { storagePut } from "../storage"; import { randomBytes } from "crypto"; import path from "path"; 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}`; // Upload vers S3 const result = await storagePut( fileName, file.buffer, file.mimetype ); console.log(`[UploadFile] Fichier uploadé: ${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 (error) { console.error("[UploadFile] Error:", error); return res.status(500).json({ success: false, message: "Erreur lors de l'upload du fichier", }); } }); export default router;