From 9e0bbb40a85cd9834a9c204191d7a397645dee24 Mon Sep 17 00:00:00 2001
From: Damien <damien.armillon@gmail.com>
Date: Sun, 28 Apr 2019 11:49:18 +0200
Subject: [PATCH] On peut transmettre le toucan en pdf et sa cover

---
 .gitignore                     |  1 +
 backend/.gitignore             |  3 +-
 backend/routes/routesToucan.js | 18 +++++++++++-
 backend/utils/fileSaver.js     | 54 ++++++++++++++++++++++++++++++++++
 4 files changed, 74 insertions(+), 2 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 backend/utils/fileSaver.js

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..600d2d3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.vscode
\ No newline at end of file
diff --git a/backend/.gitignore b/backend/.gitignore
index 30bc162..cd1dfd8 100644
--- a/backend/.gitignore
+++ b/backend/.gitignore
@@ -1 +1,2 @@
-/node_modules
\ No newline at end of file
+/node_modules
+.env.json
\ No newline at end of file
diff --git a/backend/routes/routesToucan.js b/backend/routes/routesToucan.js
index 7d254e0..5d36390 100644
--- a/backend/routes/routesToucan.js
+++ b/backend/routes/routesToucan.js
@@ -1,4 +1,7 @@
 var express = require("express");
+var fs = require("fs");
+var path = require("path");
+var upload = require("../utils/fileSaver");
 var Toucan = require("../models/modelToucan");
 var router = express.Router();
 
@@ -16,8 +19,21 @@ router.route("/toucans")
             });
     })
     // Une route pour créer un toucan
-    .post(function(req,res) {
+    .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 => {
+                if (err) {
+                    res.err(err);
+                }
+            });
+        }
         toucan.save(function(err) {
             if (err) {
                 res.send(err);
diff --git a/backend/utils/fileSaver.js b/backend/utils/fileSaver.js
new file mode 100644
index 0000000..899edf3
--- /dev/null
+++ b/backend/utils/fileSaver.js
@@ -0,0 +1,54 @@
+var multer = require("multer");
+var env = require("../.env");
+
+//Renvoie le nom de l'extension de file si son mime est autorisé, null sinon
+var isAllowedMime = function(file) {
+    var mime = file.mimetype;
+    var ext = null;
+    env.savedExtensions.forEach(extension => {
+        var index = extension.knownMime.indexOf(mime);
+        if (index>=0) {
+            var theMime = extension.knownMime[index].split("/");
+            ext = theMime[theMime.length-1];
+        }
+    });
+    return ext;
+};
+
+
+// On ne sauvegarde que si on connait l'extension
+var fileFilter = function(req,file,cb) {
+    var shouldPass= isAllowedMime(file);
+    cb(!shouldPass ? new Error("Extension inconnue"): null ,shouldPass);
+};
+
+
+// On envoie dans le dossier de destination en fonction de l'extension
+var saveDestination = function(req,file,cb) {
+    var mime = file.mimetype;
+    var hasPassed = false;
+    env.savedExtensions.forEach(extension => {
+        if (extension.knownMime.includes(mime)) {
+            hasPassed = true;
+            cb(null,extension.path);
+        }
+    });
+    if (!hasPassed) {
+        cb(new Error("Impossible d'enregistrer le fichier"));
+    }
+};
+
+//Les toucans sont només par leur date de parution
+var aFileNeedAName = function(req,file,cb) {
+    var extension = isAllowedMime(file);
+    cb(null,"defaultName."+extension);
+};
+
+var storage = multer.diskStorage({
+    destination: saveDestination,
+    filename: aFileNeedAName,
+});
+
+var upload = multer({storage: storage, fileFilter: fileFilter});
+
+module.exports = upload;
\ No newline at end of file
-- 
GitLab