53 lines
1.8 KiB
JavaScript
53 lines
1.8 KiB
JavaScript
const { Router } = require('express');
|
|
const multer = require('multer');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const sharp = require('sharp');
|
|
const { list, upload, deletePhoto } = require('../controllers/galleryController');
|
|
const { authenticate } = require('../middleware/auth');
|
|
|
|
const galleryDir = path.join(__dirname, '..', 'gallery');
|
|
if (!fs.existsSync(galleryDir)) fs.mkdirSync(galleryDir, { recursive: true });
|
|
|
|
const storage = multer.diskStorage({
|
|
destination: (req, file, cb) => cb(null, galleryDir),
|
|
filename: (req, file, cb) => cb(null, Date.now() + '-' + file.originalname),
|
|
});
|
|
const uploadMulter = multer({ storage, limits: { fileSize: 20 * 1024 * 1024 } });
|
|
|
|
const router = Router();
|
|
router.get('/', authenticate, list);
|
|
router.post('/upload', authenticate, uploadMulter.array('photos', 20), upload);
|
|
router.get('/thumbnail/:date/:filename', async (req, res) => {
|
|
try {
|
|
const { date, filename } = req.params;
|
|
const filePath = path.join(galleryDir, date, filename);
|
|
if (!fs.existsSync(filePath)) return res.status(404).json({ error: 'Fichier introuvable' });
|
|
|
|
const ext = path.extname(filename).toLowerCase();
|
|
if (!['.jpg', '.jpeg', '.png', '.webp'].includes(ext)) {
|
|
return res.sendFile(filePath);
|
|
}
|
|
|
|
const thumbDir = path.join(galleryDir, date, '.thumbnails');
|
|
if (!fs.existsSync(thumbDir)) fs.mkdirSync(thumbDir, { recursive: true });
|
|
const thumbPath = path.join(thumbDir, filename);
|
|
|
|
if (!fs.existsSync(thumbPath)) {
|
|
await sharp(filePath)
|
|
.resize(300, 200, { fit: 'cover', position: 'centre' })
|
|
.jpeg({ quality: 70 })
|
|
.toFile(thumbPath);
|
|
}
|
|
|
|
res.sendFile(thumbPath);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Erreur' });
|
|
}
|
|
});
|
|
|
|
router.delete('/:date/:filename', authenticate, deletePhoto);
|
|
|
|
module.exports = router;
|