const { Router } = require('express'); const multer = require('multer'); const path = require('path'); const fs = require('fs'); const pool = require('../config/db'); const { authenticate } = require('../middleware/auth'); const { logActivity } = require('../services/activityLog'); const slidesDir = path.join(__dirname, '..', 'member_slides'); if (!fs.existsSync(slidesDir)) fs.mkdirSync(slidesDir, { recursive: true }); const storage = multer.diskStorage({ destination: (req, file, cb) => cb(null, slidesDir), filename: (req, file, cb) => { const memberId = req.body.member_id && req.user.role === 'admin' ? req.body.member_id : req.user.id; const dateKey = req.body.date_key || '00000000'; const ext = path.extname(file.originalname); cb(null, `${memberId}_${dateKey}_${Date.now()}${ext}`); }, }); const uploadMulter = multer({ storage, limits: { fileSize: 300 * 1024 * 1024 } }); const router = Router(); router.post('/upload', authenticate, uploadMulter.single('file'), async (req, res) => { try { if (!req.file) return res.status(400).json({ error: 'Aucun fichier' }); const { date_key } = req.body; if (!date_key) return res.status(400).json({ error: 'date_key requis' }); const memberId = req.body.member_id && req.user.role === 'admin' ? req.body.member_id : req.user.id; let filename = req.file.filename; const ext = path.extname(filename).toLowerCase(); const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg']; const videoExts = ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.mkv']; const allowedExts = [...imageExts, ...videoExts]; if (!allowedExts.includes(ext)) { fs.unlinkSync(req.file.path); return res.status(400).json({ error: 'Seules les images et vidéos sont acceptées' }); } const [result] = await pool.query( 'INSERT INTO member_slides (member_id, filename, original_name, date_key) VALUES (?, ?, ?, ?)', [memberId, filename, req.file.originalname, date_key] ); res.json({ success: true, id: result.insertId, filename }); logActivity(req, 'slide_upload', { memberId, date_key, original_name: req.file.originalname }); } catch (err) { console.error(err); res.status(500).json({ error: 'Erreur upload' }); } }); router.get('/:memberId', authenticate, async (req, res) => { try { const { memberId } = req.params; if (Number(memberId) !== req.user.id && req.user.role !== 'admin') return res.status(403).json({ error: 'Interdit' }); const [rows] = await pool.query( 'SELECT id, filename, original_name, date_key, created_at FROM member_slides WHERE member_id = ? ORDER BY created_at DESC', [memberId] ); res.json(rows); } catch (err) { console.error(err); res.status(500).json({ error: 'Erreur' }); } }); router.delete('/:id', authenticate, async (req, res) => { try { const [rows] = await pool.query('SELECT * FROM member_slides WHERE id = ?', [req.params.id]); if (rows.length === 0) return res.status(404).json({ error: 'Introuvable' }); const slide = rows[0]; if (slide.member_id !== req.user.id && req.user.role !== 'admin') return res.status(403).json({ error: 'Interdit' }); const filePath = path.join(slidesDir, slide.filename); if (fs.existsSync(filePath)) fs.unlinkSync(filePath); await pool.query('DELETE FROM member_slides WHERE id = ?', [req.params.id]); res.json({ success: true }); logActivity(req, 'slide_suppression', { slideId: req.params.id, filename: slide.filename }); } catch (err) { console.error(err); res.status(500).json({ error: 'Erreur' }); } }); router.use((err, req, res, next) => { if (err instanceof multer.MulterError) { if (err.code === 'LIMIT_FILE_SIZE') { return res.status(413).json({ error: 'Le fichier dépasse la limite autorisée (300 Mo maximum)' }); } return res.status(400).json({ error: err.message }); } if (err) return res.status(500).json({ error: 'Erreur serveur' }); next(); }); module.exports = router;