Initial commit: Club DynaSQY

This commit is contained in:
2026-08-23 09:04:47 +00:00
commit 0875890dc7
145 changed files with 16947 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
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;