From e12cff2594a9ff76f19e4c5f89a93a84854f3a19 Mon Sep 17 00:00:00 2001
From: Damien <damien.armillon@gmail.com>
Date: Sun, 28 Apr 2019 22:43:46 +0200
Subject: [PATCH] =?UTF-8?q?V=C3=A9rification=20des=20entr=C3=A9es=20avec?=
 =?UTF-8?q?=20celebrate?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 backend/package.json           |  1 +
 backend/routes/routesToucan.js | 52 ++++++++++++++++++----------------
 backend/utils/schema.js        | 10 +++++++
 backend/yarn.lock              | 43 +++++++++++++++++++++++++++-
 4 files changed, 81 insertions(+), 25 deletions(-)
 create mode 100644 backend/utils/schema.js

diff --git a/backend/package.json b/backend/package.json
index 10d4f1a..31bf8b9 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -7,6 +7,7 @@
   "license": "MIT",
   "dependencies": {
     "body-parser": "^1.18.3",
+    "celebrate": "^9.1.0",
     "express": "^4.16.4",
     "mongoose": "^5.5.3"
   }
diff --git a/backend/routes/routesToucan.js b/backend/routes/routesToucan.js
index 83a4af3..c8fb8d7 100644
--- a/backend/routes/routesToucan.js
+++ b/backend/routes/routesToucan.js
@@ -1,6 +1,8 @@
 var express = require("express");
 var fs = require("fs");
 var path = require("path");
+var { celebrate } = require("celebrate");
+var { newToucan, validId } = require("../utils/schema");
 var env = require("../.env");
 var upload = require("../utils/fileSaver");
 var Toucan = require("../models/modelToucan");
@@ -19,45 +21,47 @@ router.route("/toucans")
                 }
             });
     })
+
     // Une route pour créer un toucan
-    .post(upload.fields([{name:"toucan", maxCount:1 }, {name:"cover", maxCount:1 }]),function(req,res) {
-        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 => {
+    .post(
+        upload.fields([{name:"toucan", maxCount:1 }, {name:"cover", maxCount:1 }]),
+        celebrate({body:newToucan}),
+        function(req,res) {
+            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.err(err);
+                    }
+                });
+            }
+            toucan.save(function(err) {
                 if (err) {
-                    res.err(err);
+                    res.send(err);
+                } else {
+                    res.send({message: "Toucan ajouté !", id: id});
                 }
             });
-        }
-        toucan.save(function(err) {
-            if (err) {
-                res.send(err);
-            } else {
-                res.send({message: "Toucan ajouté !", id: id});
-            }
         });
-    });
 
 router.route("/pdf/:id")
-    .get(function (req,res) {
-        //var pdfPath= path.join(env.savedExtensions[1].path,"/",req.params.id,".pdf");
+    .get(celebrate({params: validId}), function (req,res) {
         var pdfPath = path.format({
             dir: env.savedExtensions[1].path,
             name: req.params.id,
             ext: ".pdf"
         });
-        console.log(pdfPath);
         res.sendFile(pdfPath);
     });
 
 router.route("/img/:id")
-    .get(function(req,res) {
+    .get(celebrate({params: validId}),function(req,res) {
         var imgPath = path.join(env.savedExtensions[0].path,"/",req.params.id);
         var fileKnown = false;
         env.savedExtensions[0].extensions.forEach(ext => {
@@ -67,7 +71,7 @@ router.route("/img/:id")
             }
         });
         if (fileKnown) {
-            res.sendfile(imgPath);
+            res.sendFile(imgPath);
         } else {
             res.send(404,"Image non trouvée");
         }
diff --git a/backend/utils/schema.js b/backend/utils/schema.js
new file mode 100644
index 0000000..e053b50
--- /dev/null
+++ b/backend/utils/schema.js
@@ -0,0 +1,10 @@
+var { Joi } = require("celebrate");
+
+var newToucan = Joi.object({
+    title: Joi.string().alphanum().required(),
+    date: Joi.date().required()
+});
+
+var validId = Joi.object({id: Joi.string().hex().length(24)});
+
+module.exports = { newToucan, validId };
\ No newline at end of file
diff --git a/backend/yarn.lock b/backend/yarn.lock
index 320d54b..269d36e 100644
--- a/backend/yarn.lock
+++ b/backend/yarn.lock
@@ -53,6 +53,14 @@ bytes@3.0.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
   integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
 
+celebrate@^9.1.0:
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/celebrate/-/celebrate-9.1.0.tgz#cf5870729100d741c88ade891d6b5ccd15d7b496"
+  integrity sha512-QFVB7HazVEWUFbzyHkzw/f1Mq9Zg6uJ4MYcpl/Snpfa9wkUHn//HUlMvN0BWyZyc/X09HczNGnLBwSQFtMz1QQ==
+  dependencies:
+    escape-html "1.0.3"
+    joi "14.x.x"
+
 content-disposition@0.5.2:
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
@@ -107,7 +115,7 @@ encodeurl@~1.0.2:
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
   integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
 
-escape-html@~1.0.3:
+escape-html@1.0.3, escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
   integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
@@ -176,6 +184,11 @@ fresh@0.5.2:
   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
   integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
 
+hoek@6.x.x:
+  version "6.1.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c"
+  integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==
+
 http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
   version "1.6.3"
   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
@@ -203,6 +216,22 @@ ipaddr.js@1.9.0:
   resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
   integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
 
+isemail@3.x.x:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c"
+  integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==
+  dependencies:
+    punycode "2.x.x"
+
+joi@14.x.x:
+  version "14.3.1"
+  resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c"
+  integrity sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==
+  dependencies:
+    hoek "6.x.x"
+    isemail "3.x.x"
+    topo "3.x.x"
+
 kareem@2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.0.tgz#ef33c42e9024dce511eeaf440cd684f3af1fc769"
@@ -349,6 +378,11 @@ proxy-addr@~2.0.4:
     forwarded "~0.1.2"
     ipaddr.js "1.9.0"
 
+punycode@2.x.x:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
 qs@6.5.2:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -470,6 +504,13 @@ statuses@~1.4.0:
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
   integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
 
+topo@3.x.x:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c"
+  integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==
+  dependencies:
+    hoek "6.x.x"
+
 type-is@~1.6.16:
   version "1.6.16"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
-- 
GitLab