diff --git a/backend/routes/routesToucan.js b/backend/routes/routesToucan.js index 236a5671e4e2b8f7a6b9cc646bc5e879e75ec016..b818b107696749075495dca13116e2b2fab54690 100644 --- a/backend/routes/routesToucan.js +++ b/backend/routes/routesToucan.js @@ -3,13 +3,27 @@ var fs = require("fs"); var path = require("path"); var { celebrate } = require("celebrate"); var mongoose = require("mongoose"); -var { newToucan, validId, validGet, validTitle } = require("../utils/schema"); +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/modelToucan"); var router = express.Router(); +/* const urltoucans = Toucan.aggregate([ + {$addFields: {titlelc: {$split: [{$toLower:"$title"}, " "]}}}, + {$addFields:{year:{$dateToString: {format: "%Y", date: "$date"}}}}, + {$addFields: + {titlelcnospace: + {$reduce: + {input: "$titlelc",initialValue: "", + in: { $concat : ["$$value", "$$this"]}}} }}, + {$addFields: + {urlId: + {$concat:["$titlelcnospace","-","$year"]}}}, + {$unset:["titlelc","year","titlelcnospace"]} +]); */ + 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 @@ -124,20 +138,30 @@ router.route("/img/:id") } }); -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é"); - return; - } - const id = data._id; - res.sendFile(path.resolve(env.savedExtensions[1].path,id+".pdf")); - } - );}); +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 diff --git a/backend/utils/schema.js b/backend/utils/schema.js index d383da96420737f0a82ef7f7aac77ab615cb07eb..3e3d135a57237f17d5ba8dbba4fb385fa1e94b21 100644 --- a/backend/utils/schema.js +++ b/backend/utils/schema.js @@ -13,11 +13,19 @@ var validTitle = Joi.object({ .regex(/^[a-zA-Z0-9áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ._\s'-]{1,60}$/) //Autorise la plupart des acents .required(), }); + var validId = Joi.object({id: Joi.string().hex().length(24).required()}); + var validGet = Joi.object({ limit: Joi.number().integer(), before: Joi.date().timestamp(), after: Joi.date().timestamp() }); -module.exports = { newToucan, validTitle, validId, validGet }; \ No newline at end of file +var validURL = Joi.object({ + urlID: Joi.string() + .regex(/^[a-z0-9áàâäãåçéèêëíìîïñóòôöõúùûüýÿæœ._'-]{1,60}\d{4}$/) // + .required() + }); + +module.exports = { newToucan, validTitle, validId, validURL, validGet }; \ No newline at end of file diff --git a/front/src/view/AllToucanPage/AllToucanPage.js b/front/src/view/AllToucanPage/AllToucanPage.js index 6e56796c2873d44defe4f556120048e151d17d3b..05d8101a2412bf39df98f8cb14ebc9517f92cab5 100644 --- a/front/src/view/AllToucanPage/AllToucanPage.js +++ b/front/src/view/AllToucanPage/AllToucanPage.js @@ -7,6 +7,14 @@ import ToucanCard from './ToucanCard' const date = new Date() const beginYear = 1900 + (date.getMonth() < 7 ? date.getYear()-1 : date.getYear()); +function formToucanUrlId(toucan){ + const urlId = (new Date(toucan.date)).getFullYear()+ + "/"+ + toucan.title.toLowerCase().replace(/\s/g, "-"); + console.log(urlId); + return urlId; +} + function AllToucan(props){ const [toucans,setToucans] = useState([]); const [before,setBefore] = useState((new Date(beginYear+1,6,31)).getTime()); @@ -47,9 +55,10 @@ function AllToucan(props){ /> <Card.Group centered > {toucans.map( toucan => { + console.log(formToucanUrlId(toucan)) return <ToucanCard image={`${props.backURL}/toucan/img/${toucan["_id"]}`} - link={`${props.backURL}/toucan/pdf/${toucan.title}`} + link={`${props.backURL}/toucan/pdf/${formToucanUrlId(toucan)}`} header={toucan.title} toucanId={toucan._id} isAdmin={props.isAdmin}