var express = require("express"); var fs = require("fs"); var path = require("path"); var { celebrate } = require("celebrate"); var { newToucan, validId, validGet, validTitle } = require("../utils/schema"); var env = require("../.env"); var isLogged = require("../utils/authentification"); var upload = require("../utils/fileSaver"); var Toucan = require("../models/modelToucan"); var router = express.Router(); router.route("/toucans") /** * Une route qui renvoie un json avec tous les toucans, si limit est défini et vaut n, on renvoie les n derniers toucans * Si before et after sont définis (dates) on ne renvoie qu'entre ces dates */ .get(celebrate({query: validGet}),function(req,res) { let optionsDate = {}; if (req.query.before){ optionsDate.$lt=req.query.before; } if(req.query.after){ optionsDate.$gt=req.query.after; } Toucan.find((req.query.before || req.query.after) ? {"date": optionsDate} : null) .sort({date:-1}) .limit(req.query.limit) .exec(function (err, toucans) { if (err) { res.send(err); } else { res.json(toucans); } }); }) // Une route pour créer un toucan .post( isLogged, upload.fields([{name:"toucan", maxCount:1 }, {name:"cover", maxCount:1 }]), celebrate({body:newToucan}), function(req,res) { if(Object.keys(req.files).length!==2){ // Vérifie qu'il y a 2 fichiers envoyés res.status(400).send("Il manque un fichier"); } else { var toucan = new Toucan(req.body); var id = (toucan._id).toString(); var index; // On renome les fichier avec la clé de l'entrée dans la database for (index in req.files) { var file = req.files[index][0]; var extension = path.extname(file.path); var newPath = file.destination+"/"+id+extension; fs.rename(file.path,newPath, err => { if (err) { res.status(400).send(err); } }); } toucan.save(function(err) { if (err) { res.status(400).send(err); } else { res.send({message: "Toucan ajouté !", id: id}); } }); }}); // Supprime le toucan avec l'id donné router.route("/delete/:id") .post( isLogged, celebrate({params: validId}), function(req,res) { Toucan.deleteOne({_id:req.params.id}, function(err) { if (err) { res.send(500).send(err); } else { // Si on a supprimée l'entrée, on supprime le pdf var pdfPath = path.format({ dir: env.savedExtensions[1].path, name: req.params.id, ext: ".pdf" }); fs.unlink(pdfPath, (err) => { if (err) { res.status(500).send(err); } else { // Si on a supprimé le pdf on supprime l'image var imgPath = path.join(env.savedExtensions[0].path,"/",req.params.id); env.savedExtensions[0].extensions.forEach(ext => { if (fs.existsSync(imgPath+ext)){ imgPath = imgPath+ext; fs.unlink(imgPath, (err) => { if (err) { res.status(500).send(err); } else { res.send("Toucan supprimé"); } }); } }); } }); } }); }); // Renvoie la cover du toucan avec l'id donné router.route("/img/:id") .get(celebrate({params: validId}),function(req,res) { var imgPath = path.resolve(env.savedExtensions[0].path,req.params.id); var fileKnown = false; env.savedExtensions[0].extensions.forEach(ext => { if (fs.existsSync(imgPath+ext)){ imgPath = imgPath+ext; fileKnown = true; } }); if (fileKnown) { res.sendFile(imgPath); } else { res.send(404,"Image non trouvée"); } }); router.route("/pdf/:title") .get(celebrate({params: validTitle}), function(req,res) { Toucan.findOne({title: req.params.title}, (err,data) => { if (err) { res.end(500); return; } else if (!data) { res.status(404).send("Toucan non trouvée"); return; } const id = data._id; res.sendFile(path.resolve(env.savedExtensions[1].path,id+".pdf")); } );}); module.exports = router;