diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/lib/middleware.js | 31 | ||||
| -rw-r--r-- | server/package-lock.json | 136 | ||||
| -rw-r--r-- | server/package.json | 2 | ||||
| -rw-r--r-- | server/routes/api.js | 12 | 
4 files changed, 170 insertions, 11 deletions
diff --git a/server/lib/middleware.js b/server/lib/middleware.js new file mode 100644 index 0000000..735fddb --- /dev/null +++ b/server/lib/middleware.js @@ -0,0 +1,31 @@ +const passport = require('passport'); + +const multer = require('multer'); +const uuid = require('uuid'); +const path = require('path'); + + +const isAuth = passport.authenticate('jwt', {session: false}); +const isAdmin = (req, res, next) => { +  if (!req.user.admin) +    res.status(401).json({status: "You need to be an administrator!"}); +  else next(); +} + + +const multerStorage = multer.diskStorage({ +  destination: (req, file, cb) => { +    cb(null, "uploads/"); +  }, +  filename: (req, file, cb) => { +    cb(null, uuid.v4() + path.extname(file.originalname)); +  } +}); +const upload = multer({storage: multerStorage}); + + +module.exports = { +  isAuth, +  isAdmin, +  upload +}; diff --git a/server/package-lock.json b/server/package-lock.json index 1864692..20078c9 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -103,6 +103,11 @@          "picomatch": "^2.0.4"        }      }, +    "append-field": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", +      "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" +    },      "array-flatten": {        "version": "1.1.1",        "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -201,6 +206,43 @@        "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",        "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="      }, +    "buffer-from": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", +      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" +    }, +    "busboy": { +      "version": "0.2.14", +      "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", +      "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", +      "requires": { +        "dicer": "0.2.5", +        "readable-stream": "1.1.x" +      }, +      "dependencies": { +        "isarray": { +          "version": "0.0.1", +          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", +          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" +        }, +        "readable-stream": { +          "version": "1.1.14", +          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", +          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", +          "requires": { +            "core-util-is": "~1.0.0", +            "inherits": "~2.0.1", +            "isarray": "0.0.1", +            "string_decoder": "~0.10.x" +          } +        }, +        "string_decoder": { +          "version": "0.10.31", +          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", +          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" +        } +      } +    },      "bytes": {        "version": "3.1.0",        "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -329,6 +371,17 @@        "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",        "dev": true      }, +    "concat-stream": { +      "version": "1.6.2", +      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", +      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", +      "requires": { +        "buffer-from": "^1.0.0", +        "inherits": "^2.0.3", +        "readable-stream": "^2.2.2", +        "typedarray": "^0.0.6" +      } +    },      "configstore": {        "version": "5.0.1",        "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", @@ -421,6 +474,38 @@        "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",        "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="      }, +    "dicer": { +      "version": "0.2.5", +      "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", +      "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", +      "requires": { +        "readable-stream": "1.1.x", +        "streamsearch": "0.1.2" +      }, +      "dependencies": { +        "isarray": { +          "version": "0.0.1", +          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", +          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" +        }, +        "readable-stream": { +          "version": "1.1.14", +          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", +          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", +          "requires": { +            "core-util-is": "~1.0.0", +            "inherits": "~2.0.1", +            "isarray": "0.0.1", +            "string_decoder": "~0.10.x" +          } +        }, +        "string_decoder": { +          "version": "0.10.31", +          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", +          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" +        } +      } +    },      "dot-prop": {        "version": "5.3.0",        "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -968,8 +1053,15 @@      "minimist": {        "version": "1.2.5",        "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", -      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", -      "dev": true +      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" +    }, +    "mkdirp": { +      "version": "0.5.5", +      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", +      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", +      "requires": { +        "minimist": "^1.2.5" +      }      },      "mongodb": {        "version": "3.6.8", @@ -1053,6 +1145,21 @@        "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",        "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="      }, +    "multer": { +      "version": "1.4.2", +      "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", +      "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", +      "requires": { +        "append-field": "^1.0.0", +        "busboy": "^0.2.11", +        "concat-stream": "^1.5.2", +        "mkdirp": "^0.5.1", +        "object-assign": "^4.1.1", +        "on-finished": "^2.3.0", +        "type-is": "^1.6.4", +        "xtend": "^4.0.0" +      } +    },      "negotiator": {        "version": "0.6.2",        "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -1114,6 +1221,11 @@        "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",        "dev": true      }, +    "object-assign": { +      "version": "4.1.1", +      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", +      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" +    },      "on-finished": {        "version": "2.3.0",        "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1453,6 +1565,11 @@        "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",        "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="      }, +    "streamsearch": { +      "version": "0.1.2", +      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", +      "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" +    },      "string-width": {        "version": "4.2.2",        "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -1575,6 +1692,11 @@          "mime-types": "~2.1.24"        }      }, +    "typedarray": { +      "version": "0.0.6", +      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", +      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" +    },      "typedarray-to-buffer": {        "version": "3.1.5",        "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -1647,6 +1769,11 @@        "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",        "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="      }, +    "uuid": { +      "version": "8.3.2", +      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", +      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" +    },      "validator": {        "version": "13.6.0",        "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", @@ -1689,6 +1816,11 @@        "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",        "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",        "dev": true +    }, +    "xtend": { +      "version": "4.0.2", +      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", +      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="      }    }  } diff --git a/server/package.json b/server/package.json index 05b399e..a1c3c05 100644 --- a/server/package.json +++ b/server/package.json @@ -15,8 +15,10 @@      "express": "^4.17.1",      "jsonwebtoken": "^8.5.1",      "mongoose": "^5.13.2", +    "multer": "^1.4.2",      "passport": "^0.4.1",      "passport-jwt": "^4.0.0", +    "uuid": "^8.3.2",      "validator": "^13.6.0"    },    "devDependencies": { diff --git a/server/routes/api.js b/server/routes/api.js index 3e9c068..33885c9 100644 --- a/server/routes/api.js +++ b/server/routes/api.js @@ -1,16 +1,10 @@  const express = require('express');  const router = express.Router(); -const passport = require('passport');  const userController = require('../controllers/user');  const productsController = require('../controllers/products'); -const isAuth = passport.authenticate('jwt', {session: false}); -const isAdmin = (req, res, next) => { -  if (!req.user.admin) -    res.status(401).json({status: "You need to be an administrator!"}); -  else next(); -} +const {isAuth, isAdmin, upload} = require('../lib/middleware');  router.post('/register', userController.register);  router.post('/login', userController.login); @@ -18,8 +12,8 @@ router.post('/login', userController.login);  router.get('/products', productsController.index);  router.get('/products/:id', productsController.show); -router.post('/products', isAuth, isAdmin, productsController.store); -router.patch('/products/:id', isAuth, isAdmin, productsController.update); +router.post('/products', isAuth, isAdmin, upload.single('image'), productsController.store); +router.patch('/products/:id', isAuth, isAdmin, upload.single('image'), productsController.update);  router.delete('/products/:id', isAuth, isAdmin, productsController.destroy);  module.exports = router;  | 
