diff --git a/backend/app.js b/backend/app.js index 64b035a9ccfcaf2937f06f6b6dfe81adf89a428e..7cc1475b0bcdb0157b2db4283a6a6539a6da153b 100644 --- a/backend/app.js +++ b/backend/app.js @@ -5,6 +5,7 @@ var mongoose = require("mongoose"); var connectMango = require("connect-mongo"); var cors = require("cors"); var routesToucan = require("./routes/routesToucan"); +var routesToucanD = require("./routes/routesToucand"); var routesOauth = require("./routes/routesOauth"); var env = require("./.env"); @@ -32,6 +33,7 @@ app.use(session({ })); app.use("/oauth",routesOauth); app.use("/toucan",routesToucan); +app.use("/toucand",routesToucanD); app.set("port", process.env.PORT || 8000); diff --git a/backend/routes/routesToucand.js b/backend/routes/routesToucand.js new file mode 100644 index 0000000000000000000000000000000000000000..6aa7e51aa310af01384c0e05eb291173d124e638 --- /dev/null +++ b/backend/routes/routesToucand.js @@ -0,0 +1,153 @@ +var express = require("express"); +var fs = require("fs"); +var path = require("path"); +var { celebrate } = require("celebrate"); +var mongoose = require("mongoose"); +var { newToucan, validId, validGet, validTitle, validURL} = require("../utils/schema"); +var env = require("../.env"); +var isLogged = require("../utils/authentification"); +var upload = require("../utils/fileSaver"); +var Toucan = require("../models/modelToucanD"); +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.get('/pdf/:year/:title', (req, res) => { + var title = req.params.title; + var year = parseInt(req.params.year); + var nextyear = year + 1; + var title = new RegExp((title.split("-")).join(".")); + console.log(title); + + Toucan.find( + { + title : { $regex: title, $options : 'i' }, + date : { + $gte: new Date(year+"-01-01T00:00:00.000Z"), + $lt: new Date(nextyear+"-01-01T00:00:00.000Z"), + } + }) + .exec(function (err, toucan) { + if (err) {res.send(err);} + else { + const id = toucan[0]._id; + res.sendFile(path.resolve(env.savedExtensions[1].path,id+".pdf")); + } + }); +}); + + +module.exports = router; \ No newline at end of file