101 lines
4.0 KiB
JavaScript
101 lines
4.0 KiB
JavaScript
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;
|