78 lines
3.1 KiB
JavaScript
78 lines
3.1 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
const pool = require('../config/db');
|
|
|
|
const galleryDir = path.join(__dirname, '..', 'gallery');
|
|
|
|
exports.list = async (req, res) => {
|
|
try {
|
|
if (!fs.existsSync(galleryDir)) return res.json([]);
|
|
const dates = fs.readdirSync(galleryDir).filter((d) => fs.statSync(path.join(galleryDir, d)).isDirectory()).sort().reverse();
|
|
const result = [];
|
|
for (const date of dates) {
|
|
const dirPath = path.join(galleryDir, date);
|
|
const files = fs.readdirSync(dirPath)
|
|
.filter((f) => /\.(jpg|jpeg|png|gif|webp|heic)$/i.test(f) && f !== '.thumbnails')
|
|
.map((f) => ({ filename: f, url: `/gallery/${date}/${encodeURIComponent(f)}` }))
|
|
.sort();
|
|
if (files.length > 0) result.push({ date, files });
|
|
}
|
|
res.json(result);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Erreur serveur' });
|
|
}
|
|
};
|
|
|
|
exports.upload = async (req, res) => {
|
|
try {
|
|
if (!req.files || req.files.length === 0) {
|
|
return res.status(400).json({ error: 'Aucun fichier sélectionné' });
|
|
}
|
|
const { date_club } = req.body;
|
|
if (!date_club) return res.status(400).json({ error: 'Date du rendez-vous requise' });
|
|
const dateFolder = date_club.replace(/-/g, '');
|
|
const targetDir = path.join(galleryDir, dateFolder);
|
|
if (!fs.existsSync(targetDir)) fs.mkdirSync(targetDir, { recursive: true });
|
|
const saved = [];
|
|
for (const file of req.files) {
|
|
const ext = path.extname(file.originalname);
|
|
const baseName = path.basename(file.originalname, ext);
|
|
let destPath = path.join(targetDir, file.originalname);
|
|
let counter = 1;
|
|
while (fs.existsSync(destPath)) {
|
|
destPath = path.join(targetDir, `${baseName}_${counter}${ext}`);
|
|
counter++;
|
|
}
|
|
fs.renameSync(file.path, destPath);
|
|
saved.push({ filename: path.basename(destPath), url: `/gallery/${dateFolder}/${path.basename(destPath)}` });
|
|
}
|
|
res.json({ message: `${saved.length} photo(s) ajoutée(s)`, files: saved });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Erreur upload' });
|
|
}
|
|
};
|
|
|
|
exports.deletePhoto = async (req, res) => {
|
|
try {
|
|
if (req.user.role !== 'admin') return res.status(403).json({ error: 'Admin seulement' });
|
|
const { date, filename } = req.params;
|
|
const filePath = path.join(galleryDir, date, filename);
|
|
if (!fs.existsSync(filePath)) return res.status(404).json({ error: 'Fichier introuvable' });
|
|
fs.unlinkSync(filePath);
|
|
const thumbPath = path.join(galleryDir, date, '.thumbnails', filename);
|
|
if (fs.existsSync(thumbPath)) fs.unlinkSync(thumbPath);
|
|
const dirPath = path.join(galleryDir, date);
|
|
if (fs.existsSync(dirPath) && fs.readdirSync(dirPath).filter((f) => f !== '.thumbnails').length === 0) {
|
|
const thumbDir = path.join(galleryDir, date, '.thumbnails');
|
|
if (fs.existsSync(thumbDir)) fs.rmdirSync(thumbDir);
|
|
fs.rmdirSync(dirPath);
|
|
}
|
|
res.json({ message: 'Photo supprimée' });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Erreur serveur' });
|
|
}
|
|
};
|