From 926086e9322f0dfc6f2cf7dd9a423d3c45af8fe8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?In=C3=A8s=20Yeterian?= <ines.yeterian@student-cs.fr>
Date: Tue, 8 Feb 2022 23:38:09 +0100
Subject: [PATCH] Url/year/title

---
 backend/routes/routesToucan.js                | 54 +++++++++++++------
 backend/utils/schema.js                       | 10 +++-
 front/src/view/AllToucanPage/AllToucanPage.js | 11 +++-
 3 files changed, 58 insertions(+), 17 deletions(-)

diff --git a/backend/routes/routesToucan.js b/backend/routes/routesToucan.js
index 236a567..b818b10 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 d383da9..3e3d135 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 6e56796..05d8101 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}
-- 
GitLab