From 8329ee29c2d274964c9211bc9f71013b00d59489 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 15 Mar 2020 20:02:32 -0300 Subject: [PATCH 01/19] =?UTF-8?q?Criando=20endpoint=20de=20cria=C3=A7?= =?UTF-8?q?=C3=A3o,=20edi=C3=A7=C3=A3o=20e=20remo=C3=A7=C3=A3o=20de=20rep?= =?UTF-8?q?=C3=BAblica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 10 +++ src/controllers/RepublicaController.js | 93 ++++++++++++++++++++++++++ src/index.js | 12 ++-- src/models/RepublicaModel.js | 56 ++++++++++++++++ src/routes.js | 10 ++- 5 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 .editorconfig create mode 100644 src/controllers/RepublicaController.js create mode 100644 src/models/RepublicaModel.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ba2d776 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf + +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js new file mode 100644 index 0000000..0ce2e2a --- /dev/null +++ b/src/controllers/RepublicaController.js @@ -0,0 +1,93 @@ +const Republica = require('../models/RepublicaModel'); + +exports.create = async (req, res) => { + const { + nome, + tipo, + vaga, + genero, + historia, + comodos, + contas, + endereco, + adicionais, + telefones, + fotos + } = req.body; + + try{ + return res.status(201).send( + await Republica.create({ + nome: nome, + tipo: tipo, + vaga: vaga, + genero: genero, + historia: historia, + comodos: comodos, + contas: contas, + endereco: endereco, + adicionais: adicionais, + telefones: telefones, + fotos: fotos + }) + ); + }catch (err) { + let message = "Ocorreu um erro no cadastro da república" + let code = "400.00"; + return res.status(400).send({code, message}); + } +}; + +exports.update = async (req, res) => { + const { + id, + nome, + tipo, + vaga, + genero, + historia, + comodos, + contas, + endereco, + adicionais, + telefones, + fotos + } = req.body; + + try { + return res.status(200).send( + await Republica.updateOne({_id: id}, {$set: { + nome: nome, + tipo: tipo, + vaga: vaga, + genero: genero, + historia: historia, + comodos: comodos, + contas: contas, + endereco: endereco, + adicionais: adicionais, + telefones: telefones, + fotos: fotos + }}) + ); + } catch (err) { + let message = "Ocorreu um erro na alteração da república"; + let code = "400.00"; + return res.status(400).send({code, message}); + } +}; + +exports.remove = async (req, res) => { + const { + id + } = req.body; + + try { + return res.status(200).send( + await Republica.remove({_id: id})); + } catch (err) { + let message = "Ocorreu um erro na exclusão da república"; + let code = "400.00"; + return res.status(400).send({code, message}); + } +}; diff --git a/src/index.js b/src/index.js index 522905c..1c6df8c 100644 --- a/src/index.js +++ b/src/index.js @@ -6,15 +6,15 @@ const mongoose = require('mongoose'); const app = express(); mongoose.connect( - "mongodb://127.0.0.1:27017/acharep?gssapiServiceName=mongodb", - { - useNewUrlParser: true, - useUnifiedTopology: true - } + "mongodb://127.0.0.1:27017/acharep?gssapiServiceName=mongodb", + { + useNewUrlParser: true, + useUnifiedTopology: true + } ); app.use(cors()); app.use(express.json()); app.use(routes); -app.listen(3000); \ No newline at end of file +app.listen(3000); diff --git a/src/models/RepublicaModel.js b/src/models/RepublicaModel.js new file mode 100644 index 0000000..b569a74 --- /dev/null +++ b/src/models/RepublicaModel.js @@ -0,0 +1,56 @@ +const mongoose = require('mongoose'); + +const RepublicaSchema = new mongoose.Schema({ + nome: { + type: String, + required: true + }, + tipo: { + type: String, + required: true + }, + vaga: { + tipo: { + type: String, + required: true + }, + livre: { + type: Number, + required: true + }, + total: { + type: Number, + required: true + } + }, + premium: { + type: Boolean, + default: false + }, + genero: { + type: String, + required: true + }, + historia: String, + comodos: [String], + contas: [String], + endereco: { + type: String, + required: true + }, + adicionais: [String], + telefones: [String], + fotos: [String], + createdAt: { + type: Date, + default: Date.now + }, + updatedAt: { + type: Date, + default: Date.now + } +}); + +const Republica = mongoose.model("Republica", RepublicaSchema); + +module.exports = Republica; diff --git a/src/routes.js b/src/routes.js index 4f8c964..3e6d3b8 100644 --- a/src/routes.js +++ b/src/routes.js @@ -2,8 +2,14 @@ const { Router } = require('express'); const route = Router(); +const RepublicaController = require('./controllers/RepublicaController'); + route.get('/', (req, res) => { - res.send('Hello'); + res.send('Hello'); }); -module.exports = route; \ No newline at end of file +route.post('/rep', RepublicaController.create); +route.put('/rep', RepublicaController.update); +route.delete('/rep', RepublicaController.remove); + +module.exports = route; From 02c3abcf46d469c13c3403ae632497d60355f5c9 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Wed, 25 Mar 2020 22:35:09 -0300 Subject: [PATCH 02/19] =?UTF-8?q?Ajustando=20endpoint=20de=20registro=20da?= =?UTF-8?q?=20republica=20e=20criando=20endpoint=20para=20buscar=20detlahe?= =?UTF-8?q?s=20da=20rep=C3=BAblica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/RepublicaController.js | 55 +++++++++++++++++++++++--- src/models/RepublicaModel.js | 26 +++++++++++- src/routes.js | 1 + 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index 0ce2e2a..0c9677e 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -15,17 +15,35 @@ exports.create = async (req, res) => { fotos } = req.body; + if((!nome || !tipo || !vaga || !genero || !comodos || !contas || !endereco || !adicionais || !telefones)){ + let message = "Alguns campos obrigatórios não foram informados!!"; + let required_fields = ['nome', "tipo", "vaga", "genero", "comodos", "contas", "endereco", "adicionais", "fotos"]; + let code = "400.002"; + return res.status(400).send({message, code, required_fields}); + } + try{ return res.status(201).send( await Republica.create({ nome: nome, tipo: tipo, - vaga: vaga, + vaga: { + tipo: vaga.tipo, + livre: vaga.livre, + total: vaga.total + }, genero: genero, historia: historia, comodos: comodos, contas: contas, - endereco: endereco, + endereco: { + cep: endereco.cep, + rua: endereco.rua, + numero: endereco.numero, + bairro: endereco.bairro, + cidade: endereco.cidade, + uf: endereco.uf + }, adicionais: adicionais, telefones: telefones, fotos: fotos @@ -33,7 +51,7 @@ exports.create = async (req, res) => { ); }catch (err) { let message = "Ocorreu um erro no cadastro da república" - let code = "400.00"; + let code = "400.000"; return res.status(400).send({code, message}); } }; @@ -59,12 +77,23 @@ exports.update = async (req, res) => { await Republica.updateOne({_id: id}, {$set: { nome: nome, tipo: tipo, - vaga: vaga, + vaga: { + tipo: vaga.tipo, + livre: vaga.livre, + total: vaga.total + }, genero: genero, historia: historia, comodos: comodos, contas: contas, - endereco: endereco, + endereco: { + cep: endereco.cep, + rua: endereco.rua, + numero: endereco.numero, + bairro: endereco.bairro, + cidade: endereco.cidade, + uf: endereco.uf + }, adicionais: adicionais, telefones: telefones, fotos: fotos @@ -91,3 +120,19 @@ exports.remove = async (req, res) => { return res.status(400).send({code, message}); } }; + +exports.detail = async (req, res) => { + const { + id + } = req.params; + + try { + return res.status(200).send( + await Republica.findById(id) + ); + } catch (error) { + let message = "Ocorreu um erro ao buscar detalhes da república"; + let code = "400.00"; + return res.status(400).send({code, message}); + } +} diff --git a/src/models/RepublicaModel.js b/src/models/RepublicaModel.js index b569a74..4aafcba 100644 --- a/src/models/RepublicaModel.js +++ b/src/models/RepublicaModel.js @@ -35,8 +35,30 @@ const RepublicaSchema = new mongoose.Schema({ comodos: [String], contas: [String], endereco: { - type: String, - required: true + cep: { + type: String, + required: true + }, + rua: { + type: String, + required: true + }, + numero: { + type: String, + required: true + }, + bairro: { + type: String, + required: true + }, + cidade: { + type: String, + required: true + }, + uf: { + type: String, + required: true + } }, adicionais: [String], telefones: [String], diff --git a/src/routes.js b/src/routes.js index 3e6d3b8..e73dbce 100644 --- a/src/routes.js +++ b/src/routes.js @@ -11,5 +11,6 @@ route.get('/', (req, res) => { route.post('/rep', RepublicaController.create); route.put('/rep', RepublicaController.update); route.delete('/rep', RepublicaController.remove); +route.get('/rep/:id', RepublicaController.detail); module.exports = route; From 932dd5a554f47c7d5ad7c740d37ae7b97b915fe9 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sat, 28 Mar 2020 18:37:19 -0300 Subject: [PATCH 03/19] Ajustes no cadastro da republica --- src/controllers/RepublicaController.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index 0c9677e..e34ac55 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -5,6 +5,7 @@ exports.create = async (req, res) => { nome, tipo, vaga, + premium, genero, historia, comodos, @@ -15,9 +16,9 @@ exports.create = async (req, res) => { fotos } = req.body; - if((!nome || !tipo || !vaga || !genero || !comodos || !contas || !endereco || !adicionais || !telefones)){ + if((!nome || !tipo || !vaga || !premium || !genero || !comodos || !contas || !endereco || !adicionais || !telefones)){ let message = "Alguns campos obrigatórios não foram informados!!"; - let required_fields = ['nome', "tipo", "vaga", "genero", "comodos", "contas", "endereco", "adicionais", "fotos"]; + let required_fields = ['nome', "tipo", "vaga", "premium", "genero", "comodos", "contas", "endereco", "adicionais", "fotos"]; let code = "400.002"; return res.status(400).send({message, code, required_fields}); } @@ -32,6 +33,7 @@ exports.create = async (req, res) => { livre: vaga.livre, total: vaga.total }, + premium: premium, genero: genero, historia: historia, comodos: comodos, From 972605bb8da14a7c19f9d31d40499bc541cf7e9c Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sat, 28 Mar 2020 21:41:47 -0300 Subject: [PATCH 04/19] Criando endpoint de SignIn e SignUp --- package-lock.json | 631 +++++++++++++++++++++++++-- package.json | 6 +- src/config/config.js | 5 + src/controllers/UsuarioController.js | 61 +++ src/index.js | 2 +- src/models/UsuarioModel.js | 24 + src/routes.js | 6 +- 7 files changed, 684 insertions(+), 51 deletions(-) create mode 100644 src/config/config.js create mode 100644 src/controllers/UsuarioController.js create mode 100644 src/models/UsuarioModel.js diff --git a/package-lock.json b/package-lock.json index cfdd757..a61a70e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, "requires": { "string-width": "^2.0.0" } @@ -35,6 +36,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -43,11 +45,26 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -58,10 +75,20 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "bcrypt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-4.0.1.tgz", + "integrity": "sha512-hSIZHkUxIDS5zA2o00Kf2O5RfVbQ888n54xQoF/eIaquU4uaLxK8vhhBdktd0B3n2MjkcAWzv4mnhogykBKOUQ==", + "requires": { + "node-addon-api": "^2.0.0", + "node-pre-gyp": "0.14.0" + } + }, "binary-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true }, "bl": { "version": "2.2.0", @@ -98,6 +125,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, "requires": { "ansi-align": "^2.0.0", "camelcase": "^4.0.0", @@ -121,6 +149,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -130,6 +159,11 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -138,17 +172,20 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -159,6 +196,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -170,20 +208,33 @@ "readdirp": "~3.3.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -191,7 +242,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "concat-map": { "version": "0.0.1", @@ -202,6 +254,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", @@ -211,6 +264,11 @@ "xdg-basedir": "^3.0.0" } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -252,6 +310,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, "requires": { "capture-stack-trace": "^1.0.0" } @@ -260,6 +319,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -269,7 +329,8 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true }, "debug": { "version": "2.6.9", @@ -284,6 +345,11 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "denque": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", @@ -299,10 +365,16 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, "requires": { "is-obj": "^1.0.0" } @@ -310,7 +382,16 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } }, "ee-first": { "version": "1.1.1", @@ -330,7 +411,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "etag": { "version": "1.8.1", @@ -341,6 +423,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -392,6 +475,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -420,21 +504,98 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, "fsevents": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, "optional": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -443,6 +604,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, "requires": { "ini": "^1.3.4" } @@ -451,6 +613,7 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, "requires": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", @@ -468,12 +631,19 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "http-errors": { "version": "1.7.2", @@ -498,17 +668,37 @@ "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, "inherits": { "version": "2.0.3", @@ -529,6 +719,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -537,6 +728,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, "requires": { "ci-info": "^1.5.0" } @@ -544,7 +736,8 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -555,6 +748,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -563,6 +757,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, "requires": { "global-dirs": "^0.1.0", "is-path-inside": "^1.0.0" @@ -571,22 +766,26 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, "requires": { "path-is-inside": "^1.0.1" } @@ -594,17 +793,20 @@ "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true }, "is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "isarray": { "version": "1.0.0", @@ -614,7 +816,51 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } }, "kareem": { "version": "2.3.1", @@ -625,19 +871,57 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, "requires": { "package-json": "^4.0.0" } }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -647,6 +931,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, "requires": { "pify": "^3.0.0" } @@ -703,6 +988,38 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + }, "mongodb": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.4.tgz", @@ -778,15 +1095,74 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "needle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", + "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "node-addon-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", + "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==" + }, + "node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } + } + }, "nodemon": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz", "integrity": "sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw==", + "dev": true, "requires": { "chokidar": "^3.2.2", "debug": "^3.2.6", @@ -804,6 +1180,7 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, "requires": { "ms": "^2.1.1" } @@ -811,7 +1188,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -819,6 +1197,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, "requires": { "abbrev": "1" } @@ -826,16 +1205,57 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, "requires": { "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -849,15 +1269,44 @@ "ee-first": "1.1.1" } }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, "requires": { "got": "^6.7.1", "registry-auth-token": "^3.0.1", @@ -870,15 +1319,22 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-to-regexp": { "version": "0.1.7", @@ -886,19 +1342,22 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true }, "process-nextick-args": { "version": "2.0.1", @@ -917,12 +1376,14 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "pstree.remy": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", - "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==" + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "dev": true }, "qs": { "version": "6.7.0", @@ -974,6 +1435,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, "requires": { "picomatch": "^2.0.7" } @@ -987,6 +1449,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, "requires": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" @@ -996,6 +1459,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, "requires": { "rc": "^1.0.1" } @@ -1014,6 +1478,14 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -1033,6 +1505,11 @@ "sparse-bitfield": "^3.0.3" } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1042,6 +1519,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, "requires": { "semver": "^5.0.3" } @@ -1084,6 +1562,11 @@ "send": "0.17.1" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -1093,6 +1576,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -1100,7 +1584,8 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "sift": { "version": "7.0.1", @@ -1108,9 +1593,9 @@ "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "sliced": { "version": "1.0.1", @@ -1159,7 +1644,8 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-json-comments": { "version": "2.0.1", @@ -1170,14 +1656,37 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, "requires": { "execa": "^0.7.0" } @@ -1185,12 +1694,14 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "requires": { "is-number": "^7.0.0" } @@ -1204,6 +1715,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, "requires": { "nopt": "~1.0.10" } @@ -1221,6 +1733,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, "requires": { "debug": "^2.2.0" } @@ -1229,6 +1742,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, "requires": { "crypto-random-string": "^1.0.0" } @@ -1241,12 +1755,14 @@ "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", @@ -1264,6 +1780,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, "requires": { "prepend-http": "^1.0.1" } @@ -1287,22 +1804,38 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, "requires": { "string-width": "^2.1.1" } }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, "write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -1312,12 +1845,14 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true } } } diff --git a/package.json b/package.json index 79db6d2..3acfe4c 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,13 @@ "author": "VIFE", "license": "ISC", "dependencies": { + "bcrypt": "^4.0.1", "cors": "^2.8.5", "express": "^4.17.1", - "mongoose": "^5.9.4", + "jsonwebtoken": "^8.5.1", + "mongoose": "^5.9.4" + }, + "devDependencies": { "nodemon": "^2.0.2" } } diff --git a/src/config/config.js b/src/config/config.js new file mode 100644 index 0000000..af59bb1 --- /dev/null +++ b/src/config/config.js @@ -0,0 +1,5 @@ +const configs = { + key: "7ce76799a1c6616fa3937efb188d4be40e0dd162aaa05cc99ff0131fc543410b" +}; + +module.exports = configs; diff --git a/src/controllers/UsuarioController.js b/src/controllers/UsuarioController.js new file mode 100644 index 0000000..08fd37c --- /dev/null +++ b/src/controllers/UsuarioController.js @@ -0,0 +1,61 @@ +const Usuario = require('../models/UsuarioModel'); +const bcrypt = require('bcrypt'); +const jwt = require('jsonwebtoken'); +const config = require('../config/config'); + +exports.signUp = async (req, res) => { + const { + email, + senha + } = req.body; + + if(!email, !senha){ + let message = "Alguns campos obrigatórios não foram informados"; + let required_fields = ["email", "senha"]; + let code = "400.002"; + return res.status(400).send({code, message, required_fields}); + } + + await Usuario.findOne({email: email}, async (err, result) => { + if(result){ + let message = "Este email já se encontra cadastrado"; + let code = "400.009"; + res.status(409).send({code, message}); + } + const crypted = bcrypt.hashSync(senha, 10); + + const { _id } = await Usuario.create({ + email: email, + senha: crypted + }); + + const token = jwt.sign({id: _id}, config.key, { expiresIn: '30m' }); + + return res.status(201).send(token); + }); +} + +exports.signIn = async (req, res) => { + const { + email, + senha + } = req.body; + + const usuario = await Usuario.findOne({email: email}); + + if(!usuario){ + let message = "Email não cadastrado"; + let code = "400.000"; + return res.status(400).send({code, message}); + } + + if(!bcrypt.compareSync(senha, usuario.senha)){ + let message = "Senha incorreta"; + let code = "400.000"; + return res.status(400).send({code, message}); + } + + const token = jwt.sign({id: usuario._id}, config.key, { expiresIn: '30m'}); + + res.status(200).send(token); +} diff --git a/src/index.js b/src/index.js index 1c6df8c..ee7b546 100644 --- a/src/index.js +++ b/src/index.js @@ -17,4 +17,4 @@ app.use(cors()); app.use(express.json()); app.use(routes); -app.listen(3000); +app.listen(3333); diff --git a/src/models/UsuarioModel.js b/src/models/UsuarioModel.js new file mode 100644 index 0000000..6d57659 --- /dev/null +++ b/src/models/UsuarioModel.js @@ -0,0 +1,24 @@ +const mongoose = require('mongoose'); + +const UsuariosSchema = new mongoose.Schema({ + email: { + type: String, + required: true + }, + senha: { + type: String, + required: true + }, + createdAt: { + type: Date, + default: Date.now + }, + updatedAt: { + type: Date, + default: Date.now + } +}); + +const Usuario = mongoose.model('Usuarios', UsuariosSchema); + +module.exports = Usuario; diff --git a/src/routes.js b/src/routes.js index e73dbce..893db2f 100644 --- a/src/routes.js +++ b/src/routes.js @@ -2,10 +2,11 @@ const { Router } = require('express'); const route = Router(); +const UsuarioController = require('./controllers/UsuarioController'); const RepublicaController = require('./controllers/RepublicaController'); route.get('/', (req, res) => { - res.send('Hello'); + }); route.post('/rep', RepublicaController.create); @@ -13,4 +14,7 @@ route.put('/rep', RepublicaController.update); route.delete('/rep', RepublicaController.remove); route.get('/rep/:id', RepublicaController.detail); +route.post('/user', UsuarioController.signUp); +route.get('/user', UsuarioController.signIn); + module.exports = route; From f43af8d1bf7604037cab3f48022b4e26ef25e261 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sat, 28 Mar 2020 22:03:59 -0300 Subject: [PATCH 05/19] Ajuste no retorno dos endpoints de SignIn e SignUp --- src/controllers/UsuarioController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/UsuarioController.js b/src/controllers/UsuarioController.js index 08fd37c..a790cfc 100644 --- a/src/controllers/UsuarioController.js +++ b/src/controllers/UsuarioController.js @@ -31,7 +31,7 @@ exports.signUp = async (req, res) => { const token = jwt.sign({id: _id}, config.key, { expiresIn: '30m' }); - return res.status(201).send(token); + return res.status(201).send({token: token}); }); } @@ -57,5 +57,5 @@ exports.signIn = async (req, res) => { const token = jwt.sign({id: usuario._id}, config.key, { expiresIn: '30m'}); - res.status(200).send(token); + res.status(200).send({token: token}); } From ee9d841527e5471da96f865f85ba54a9231e23c8 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sat, 28 Mar 2020 23:12:21 -0300 Subject: [PATCH 06/19] Criando middleware de autenticacao --- src/controllers/UsuarioController.js | 44 ++++++++++++++++++++++++++++ src/routes.js | 9 ++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/controllers/UsuarioController.js b/src/controllers/UsuarioController.js index a790cfc..492859a 100644 --- a/src/controllers/UsuarioController.js +++ b/src/controllers/UsuarioController.js @@ -2,6 +2,7 @@ const Usuario = require('../models/UsuarioModel'); const bcrypt = require('bcrypt'); const jwt = require('jsonwebtoken'); const config = require('../config/config'); +const mongoose = require('mongoose'); exports.signUp = async (req, res) => { const { @@ -59,3 +60,46 @@ exports.signIn = async (req, res) => { res.status(200).send({token: token}); } + +exports.auth = async (req, res, next) => { + if(!req.header('Authorization')){ + let message = "Token de autenticação não fornecido"; + let code = "400.000"; + return res.status(400).send({code, message}); + } + + const token = req.header('Authorization').split(' ')[1]; + + jwt.verify(token, config.key, async (err, decoded) => { + if(err){ + switch (err.name) { + case 'JsonWebTokenError': + message = "Token de autorização inválido"; + code = "400.000"; + return res.status(400).send({code, message}); + break; + case 'TokenExpiredError': + message = "O token informado expirou, reenvie suas credenciais de login"; + code = "400.000"; + return res.status(400).send({code, message}); + break; + } + } + + try { + const usuario = await Usuario.findById(decoded.id); + + if(!usuario){ + let message = "Você não está autorizado a realizar esta operação"; + let code = "400.000"; + return res.status(400).send({code, message}); + } + + next(); + } catch (error) { + let message = "Você não está autorizado a realizar esta operação"; + let code = "401.000"; + return res.status(401).send({code, message}); + } + }); +} diff --git a/src/routes.js b/src/routes.js index 893db2f..f2f4cee 100644 --- a/src/routes.js +++ b/src/routes.js @@ -9,12 +9,15 @@ route.get('/', (req, res) => { }); -route.post('/rep', RepublicaController.create); -route.put('/rep', RepublicaController.update); -route.delete('/rep', RepublicaController.remove); route.get('/rep/:id', RepublicaController.detail); route.post('/user', UsuarioController.signUp); route.get('/user', UsuarioController.signIn); +route.use('/rep', UsuarioController.auth); + +route.post('/rep', RepublicaController.create); +route.put('/rep', RepublicaController.update); +route.delete('/rep', RepublicaController.remove); + module.exports = route; From 247fdc8a78ba7af0d1f0f295dd9a318f583f36fa Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 17:12:47 -0300 Subject: [PATCH 07/19] =?UTF-8?q?Alterando=20busca=20de=20detalhes=20da=20?= =?UTF-8?q?rep=C3=BAblica=20e=20inserindo=20campo=20para=20salvar=20id=20d?= =?UTF-8?q?e=20usuario=20dono=20da=20republica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/RepublicaController.js | 16 ++++++++++++---- src/models/RepublicaModel.js | 4 ++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index e34ac55..11c9175 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -1,4 +1,5 @@ const Republica = require('../models/RepublicaModel'); +const jwt = require('jsonwebtoken'); exports.create = async (req, res) => { const { @@ -129,12 +130,19 @@ exports.detail = async (req, res) => { } = req.params; try { - return res.status(200).send( - await Republica.findById(id) - ); + const republica = await Republica.findById(id); + + if(!republica){ + let message = "Repúbica não encontrada"; + let code = "400.000"; + return res.status(400).send({code, message}); + } + + return res.status(200).send({republica}); + } catch (error) { let message = "Ocorreu um erro ao buscar detalhes da república"; - let code = "400.00"; + let code = "400.000"; return res.status(400).send({code, message}); } } diff --git a/src/models/RepublicaModel.js b/src/models/RepublicaModel.js index 4aafcba..b0842f4 100644 --- a/src/models/RepublicaModel.js +++ b/src/models/RepublicaModel.js @@ -63,6 +63,10 @@ const RepublicaSchema = new mongoose.Schema({ adicionais: [String], telefones: [String], fotos: [String], + usuario_id: { + type: mongoose.Types.ObjectId, + required: true + }, createdAt: { type: Date, default: Date.now From 9c46aa1278599a1ba2d74a0771cbb08554295402 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 17:27:59 -0300 Subject: [PATCH 08/19] =?UTF-8?q?Salvando=20id=20do=20usuario=20na=20cria?= =?UTF-8?q?=C3=A7=C3=A3o=20da=20rep=C3=BAblica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/RepublicaController.js | 10 ++++++++-- src/controllers/UsuarioController.js | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index 11c9175..0e96a0b 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -1,5 +1,6 @@ const Republica = require('../models/RepublicaModel'); const jwt = require('jsonwebtoken'); +const config = require('../config/config'); exports.create = async (req, res) => { const { @@ -24,6 +25,10 @@ exports.create = async (req, res) => { return res.status(400).send({message, code, required_fields}); } + let id = jwt.verify(req.header('Authorization').split(' ')[1], config.key, (err, decoded) => { + return decoded.id; + }); + try{ return res.status(201).send( await Republica.create({ @@ -49,7 +54,8 @@ exports.create = async (req, res) => { }, adicionais: adicionais, telefones: telefones, - fotos: fotos + fotos: fotos, + usuario_id: id }) ); }catch (err) { @@ -138,7 +144,7 @@ exports.detail = async (req, res) => { return res.status(400).send({code, message}); } - return res.status(200).send({republica}); + return res.status(200).send(republica); } catch (error) { let message = "Ocorreu um erro ao buscar detalhes da república"; diff --git a/src/controllers/UsuarioController.js b/src/controllers/UsuarioController.js index 492859a..cdeaae3 100644 --- a/src/controllers/UsuarioController.js +++ b/src/controllers/UsuarioController.js @@ -81,7 +81,8 @@ exports.auth = async (req, res, next) => { case 'TokenExpiredError': message = "O token informado expirou, reenvie suas credenciais de login"; code = "400.000"; - return res.status(400).send({code, message}); + login = true; + return res.status(400).send({code, message, login}); break; } } From 30f29ead90e0634d95390a3777611782d1fcd932 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 17:45:36 -0300 Subject: [PATCH 09/19] =?UTF-8?q?Mudan=C3=A7a=20no=20recurso=20de=20remo?= =?UTF-8?q?=C3=A7=C3=A3o=20da=20rep=C3=BAblica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/RepublicaController.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index 0e96a0b..5e5a969 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -121,12 +121,19 @@ exports.remove = async (req, res) => { } = req.body; try { - return res.status(200).send( - await Republica.remove({_id: id})); + const deleted = await Republica.remove({_id: id}); + + if(!deleted.deletedCount){ + let message = "Ocorreu um erro na exclusão da república"; + let code = "500.000"; + return res.status(500).send({code, message}); + } + + return res.status(200).send({ok: true}); } catch (err) { let message = "Ocorreu um erro na exclusão da república"; - let code = "400.00"; - return res.status(400).send({code, message}); + let code = "500.000"; + return res.status(500).send({code, message}); } }; From 5843c282550ada7e483ed8d307bc29242966c7bd Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 17:59:22 -0300 Subject: [PATCH 10/19] =?UTF-8?q?Adicionando=20preco=20no=20registro=20da?= =?UTF-8?q?=20rep=C3=BAblica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/RepublicaController.js | 10 +++++++--- src/models/RepublicaModel.js | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index 5e5a969..9873261 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -6,6 +6,7 @@ exports.create = async (req, res) => { const { nome, tipo, + preco, vaga, premium, genero, @@ -18,10 +19,10 @@ exports.create = async (req, res) => { fotos } = req.body; - if((!nome || !tipo || !vaga || !premium || !genero || !comodos || !contas || !endereco || !adicionais || !telefones)){ + if((!nome || !tipo || !preco || !vaga || !premium || !genero || !comodos || !contas || !endereco || !adicionais || !telefones)){ let message = "Alguns campos obrigatórios não foram informados!!"; - let required_fields = ['nome', "tipo", "vaga", "premium", "genero", "comodos", "contas", "endereco", "adicionais", "fotos"]; - let code = "400.002"; + let required_fields = ['nome', "tipo", "preco", "vaga", "premium", "genero", "comodos", "contas", "endereco", "adicionais", "fotos"]; + let code = "400.000"; return res.status(400).send({message, code, required_fields}); } @@ -34,6 +35,7 @@ exports.create = async (req, res) => { await Republica.create({ nome: nome, tipo: tipo, + preco: preco, vaga: { tipo: vaga.tipo, livre: vaga.livre, @@ -70,6 +72,7 @@ exports.update = async (req, res) => { id, nome, tipo, + preco, vaga, genero, historia, @@ -86,6 +89,7 @@ exports.update = async (req, res) => { await Republica.updateOne({_id: id}, {$set: { nome: nome, tipo: tipo, + preco: preco, vaga: { tipo: vaga.tipo, livre: vaga.livre, diff --git a/src/models/RepublicaModel.js b/src/models/RepublicaModel.js index b0842f4..8451bb9 100644 --- a/src/models/RepublicaModel.js +++ b/src/models/RepublicaModel.js @@ -9,6 +9,10 @@ const RepublicaSchema = new mongoose.Schema({ type: String, required: true }, + preco: { + type: Number, + required: true + }, vaga: { tipo: { type: String, From c8dbeac189581dc3c609f8315bbd854201b0fa20 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 19:19:29 -0300 Subject: [PATCH 11/19] =?UTF-8?q?Criando=20endpoint=20para=20listagem=20de?= =?UTF-8?q?=20rep=C3=BAblicas=20ja=20inclu=C3=ADndo=20filtros?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/RepublicaController.js | 30 ++++++++++++++++++++++++++ src/routes.js | 1 + 2 files changed, 31 insertions(+) diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index 9873261..4a48112 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -163,3 +163,33 @@ exports.detail = async (req, res) => { return res.status(400).send({code, message}); } } + +exports.list = async (req, res) => { + const fields = {}; + + if(req.query.limite){ + limite = parseInt(req.query.limite); + }else{ + limite = 500; + } + + if(req.query.genero){ + fields.genero = req.query.genero; + } + + if(req.query.cidade){ + fields["endereco.cidade"] = req.query.cidade; + } + + if(req.query.preco){ + fields.preco = { $lte: req.query.preco}; + } + + if(req.query.tipo){ + fields["vaga.tipo"] = req.query.tipo; + } + + const republica = await Republica.find(fields).sort({createdAt: -1}).limit(limite); + + return res.send(republica); +} diff --git a/src/routes.js b/src/routes.js index f2f4cee..4cf8501 100644 --- a/src/routes.js +++ b/src/routes.js @@ -10,6 +10,7 @@ route.get('/', (req, res) => { }); route.get('/rep/:id', RepublicaController.detail); +route.get('/rep/', RepublicaController.list); route.post('/user', UsuarioController.signUp); route.get('/user', UsuarioController.signIn); From 00dd3ed8bc910367ada9e613d9e5f37ba39fc8c8 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 19:40:07 -0300 Subject: [PATCH 12/19] Adicionando variaveis de ambiente --- src/config/config.js | 2 +- src/controllers/RepublicaController.js | 3 +-- src/controllers/UsuarioController.js | 7 +++---- src/index.js | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/config/config.js b/src/config/config.js index af59bb1..1d73ab4 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -1,5 +1,5 @@ const configs = { - key: "7ce76799a1c6616fa3937efb188d4be40e0dd162aaa05cc99ff0131fc543410b" + key: "" }; module.exports = configs; diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index 4a48112..d7bbc97 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -1,6 +1,5 @@ const Republica = require('../models/RepublicaModel'); const jwt = require('jsonwebtoken'); -const config = require('../config/config'); exports.create = async (req, res) => { const { @@ -26,7 +25,7 @@ exports.create = async (req, res) => { return res.status(400).send({message, code, required_fields}); } - let id = jwt.verify(req.header('Authorization').split(' ')[1], config.key, (err, decoded) => { + let id = jwt.verify(req.header('Authorization').split(' ')[1], process.env.APP_KEY, (err, decoded) => { return decoded.id; }); diff --git a/src/controllers/UsuarioController.js b/src/controllers/UsuarioController.js index cdeaae3..6ef08ca 100644 --- a/src/controllers/UsuarioController.js +++ b/src/controllers/UsuarioController.js @@ -1,7 +1,6 @@ const Usuario = require('../models/UsuarioModel'); const bcrypt = require('bcrypt'); const jwt = require('jsonwebtoken'); -const config = require('../config/config'); const mongoose = require('mongoose'); exports.signUp = async (req, res) => { @@ -30,7 +29,7 @@ exports.signUp = async (req, res) => { senha: crypted }); - const token = jwt.sign({id: _id}, config.key, { expiresIn: '30m' }); + const token = jwt.sign({id: _id}, process.env.APP_KEY, { expiresIn: '30m' }); return res.status(201).send({token: token}); }); @@ -56,7 +55,7 @@ exports.signIn = async (req, res) => { return res.status(400).send({code, message}); } - const token = jwt.sign({id: usuario._id}, config.key, { expiresIn: '30m'}); + const token = jwt.sign({id: usuario._id}, process.env.APP_KEY, { expiresIn: '30m'}); res.status(200).send({token: token}); } @@ -70,7 +69,7 @@ exports.auth = async (req, res, next) => { const token = req.header('Authorization').split(' ')[1]; - jwt.verify(token, config.key, async (err, decoded) => { + jwt.verify(token, process.env.APP_KEY, async (err, decoded) => { if(err){ switch (err.name) { case 'JsonWebTokenError': diff --git a/src/index.js b/src/index.js index ee7b546..9fdc6cc 100644 --- a/src/index.js +++ b/src/index.js @@ -6,7 +6,7 @@ const mongoose = require('mongoose'); const app = express(); mongoose.connect( - "mongodb://127.0.0.1:27017/acharep?gssapiServiceName=mongodb", + process.env.MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true From 083daa96ef2f220de531a336aa35429a6b5fe5cb Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 20:02:26 -0300 Subject: [PATCH 13/19] Adicionando Procfile Heroku --- Procfile | 1 + package.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Procfile diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..2be5f80 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: yarn start diff --git a/package.json b/package.json index 3acfe4c..98372de 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "nodemon src/index.js" + "dev": "nodemon src/index.js", + "start": "node src/index.js" }, "author": "VIFE", "license": "ISC", From 8045d72dc6de30af3e240776892a80c9bd3241fb Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 20:05:05 -0300 Subject: [PATCH 14/19] Adicionando porta Heroku --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 9fdc6cc..bd82934 100644 --- a/src/index.js +++ b/src/index.js @@ -17,4 +17,4 @@ app.use(cors()); app.use(express.json()); app.use(routes); -app.listen(3333); +app.listen(process.env.PORT || 3333); From 409c1446517bf7a29a4d64a2857500e35340a25d Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 29 Mar 2020 20:26:37 -0300 Subject: [PATCH 15/19] Alterando Procfile --- Procfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procfile b/Procfile index 2be5f80..063b78f 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: yarn start +web: npm start From f53aef5c4db1e4f25839e9c5e01e1189d499cbac Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Wed, 8 Apr 2020 21:57:06 -0300 Subject: [PATCH 16/19] Alterando limite do payload --- src/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index bd82934..12ec6b9 100644 --- a/src/index.js +++ b/src/index.js @@ -14,7 +14,8 @@ mongoose.connect( ); app.use(cors()); -app.use(express.json()); +app.use(express.json({limit: '50mb'})); +app.use(express.urlencoded({limit: '50mb'})); app.use(routes); app.listen(process.env.PORT || 3333); From 5847caa0acc5b408bc29c930a88046d69cc140f3 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Tue, 2 Jun 2020 19:31:36 -0300 Subject: [PATCH 17/19] =?UTF-8?q?Ajuste=20no=20filtro=20de=20listagem=20da?= =?UTF-8?q?s=20rep=C3=BAblicas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/RepublicaController.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/controllers/RepublicaController.js b/src/controllers/RepublicaController.js index d7bbc97..25bbcdc 100644 --- a/src/controllers/RepublicaController.js +++ b/src/controllers/RepublicaController.js @@ -180,12 +180,16 @@ exports.list = async (req, res) => { fields["endereco.cidade"] = req.query.cidade; } - if(req.query.preco){ - fields.preco = { $lte: req.query.preco}; + if(req.query.precoMin && req.query.precoMax){ + fields.preco = { $gt: req.query.precoMin, $lt: req.query.precoMax }; + } + + if(req.query.vaga){ + fields["vaga.tipo"] = req.query.vaga; } if(req.query.tipo){ - fields["vaga.tipo"] = req.query.tipo; + fields["tipo"] = req.query.tipo; } const republica = await Republica.find(fields).sort({createdAt: -1}).limit(limite); From 6fd799fb3b9ff1700f04bbddd69cc80f7afd0204 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 2 Aug 2020 20:00:43 -0300 Subject: [PATCH 18/19] Alterando parametros da request de signin --- src/controllers/UsuarioController.js | 85 ++++++++++++++-------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/src/controllers/UsuarioController.js b/src/controllers/UsuarioController.js index 6ef08ca..464e2a3 100644 --- a/src/controllers/UsuarioController.js +++ b/src/controllers/UsuarioController.js @@ -1,87 +1,86 @@ -const Usuario = require('../models/UsuarioModel'); -const bcrypt = require('bcrypt'); -const jwt = require('jsonwebtoken'); -const mongoose = require('mongoose'); +const Usuario = require("../models/UsuarioModel"); +const bcrypt = require("bcrypt"); +const jwt = require("jsonwebtoken"); +const mongoose = require("mongoose"); exports.signUp = async (req, res) => { - const { - email, - senha - } = req.body; + const { email, senha } = req.body; - if(!email, !senha){ + if ((!email, !senha)) { let message = "Alguns campos obrigatórios não foram informados"; let required_fields = ["email", "senha"]; let code = "400.002"; - return res.status(400).send({code, message, required_fields}); + return res.status(400).send({ code, message, required_fields }); } - await Usuario.findOne({email: email}, async (err, result) => { - if(result){ + await Usuario.findOne({ email: email }, async (err, result) => { + if (result) { let message = "Este email já se encontra cadastrado"; let code = "400.009"; - res.status(409).send({code, message}); + res.status(409).send({ code, message }); } const crypted = bcrypt.hashSync(senha, 10); const { _id } = await Usuario.create({ email: email, - senha: crypted + senha: crypted, }); - const token = jwt.sign({id: _id}, process.env.APP_KEY, { expiresIn: '30m' }); + const token = jwt.sign({ id: _id }, process.env.APP_KEY, { + expiresIn: "30m", + }); - return res.status(201).send({token: token}); + return res.status(201).send({ token: token }); }); -} +}; exports.signIn = async (req, res) => { - const { - email, - senha - } = req.body; + const { email, senha } = req.query; - const usuario = await Usuario.findOne({email: email}); + const usuario = await Usuario.findOne({ email: email }); - if(!usuario){ + if (!usuario) { let message = "Email não cadastrado"; let code = "400.000"; - return res.status(400).send({code, message}); + return res.status(400).send({ code, message }); } - if(!bcrypt.compareSync(senha, usuario.senha)){ + if (!bcrypt.compareSync(senha, usuario.senha)) { let message = "Senha incorreta"; let code = "400.000"; - return res.status(400).send({code, message}); + return res.status(400).send({ code, message }); } - const token = jwt.sign({id: usuario._id}, process.env.APP_KEY, { expiresIn: '30m'}); + const token = jwt.sign({ id: usuario._id }, process.env.APP_KEY, { + expiresIn: "30m", + }); - res.status(200).send({token: token}); -} + res.status(200).send({ token: token }); +}; exports.auth = async (req, res, next) => { - if(!req.header('Authorization')){ + if (!req.header("Authorization")) { let message = "Token de autenticação não fornecido"; let code = "400.000"; - return res.status(400).send({code, message}); + return res.status(400).send({ code, message }); } - const token = req.header('Authorization').split(' ')[1]; + const token = req.header("Authorization").split(" ")[1]; jwt.verify(token, process.env.APP_KEY, async (err, decoded) => { - if(err){ + if (err) { switch (err.name) { - case 'JsonWebTokenError': + case "JsonWebTokenError": message = "Token de autorização inválido"; code = "400.000"; - return res.status(400).send({code, message}); + return res.status(400).send({ code, message }); break; - case 'TokenExpiredError': - message = "O token informado expirou, reenvie suas credenciais de login"; + case "TokenExpiredError": + message = + "O token informado expirou, reenvie suas credenciais de login"; code = "400.000"; login = true; - return res.status(400).send({code, message, login}); + return res.status(400).send({ code, message, login }); break; } } @@ -89,17 +88,17 @@ exports.auth = async (req, res, next) => { try { const usuario = await Usuario.findById(decoded.id); - if(!usuario){ + if (!usuario) { let message = "Você não está autorizado a realizar esta operação"; let code = "400.000"; - return res.status(400).send({code, message}); + return res.status(400).send({ code, message }); } next(); } catch (error) { let message = "Você não está autorizado a realizar esta operação"; - let code = "401.000"; - return res.status(401).send({code, message}); + let code = "401.000"; + return res.status(401).send({ code, message }); } }); -} +}; From 5dde391342708fbc50d6e9634f8c31136fad7794 Mon Sep 17 00:00:00 2001 From: Felipe Novais Date: Sun, 2 Aug 2020 20:10:08 -0300 Subject: [PATCH 19/19] Alterando parametros da request de signin --- src/controllers/UsuarioController.js | 2 +- src/routes.js | 26 ++++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/controllers/UsuarioController.js b/src/controllers/UsuarioController.js index 464e2a3..9be1bc0 100644 --- a/src/controllers/UsuarioController.js +++ b/src/controllers/UsuarioController.js @@ -35,7 +35,7 @@ exports.signUp = async (req, res) => { }; exports.signIn = async (req, res) => { - const { email, senha } = req.query; + const { email, senha } = req.body; const usuario = await Usuario.findOne({ email: email }); diff --git a/src/routes.js b/src/routes.js index 4cf8501..0be4e80 100644 --- a/src/routes.js +++ b/src/routes.js @@ -1,24 +1,22 @@ -const { Router } = require('express'); +const { Router } = require("express"); const route = Router(); -const UsuarioController = require('./controllers/UsuarioController'); -const RepublicaController = require('./controllers/RepublicaController'); +const UsuarioController = require("./controllers/UsuarioController"); +const RepublicaController = require("./controllers/RepublicaController"); -route.get('/', (req, res) => { +route.get("/", (req, res) => {}); -}); +route.get("/rep/:id", RepublicaController.detail); +route.get("/rep/", RepublicaController.list); -route.get('/rep/:id', RepublicaController.detail); -route.get('/rep/', RepublicaController.list); +route.post("/user", UsuarioController.signUp); +route.post("/signin", UsuarioController.signIn); -route.post('/user', UsuarioController.signUp); -route.get('/user', UsuarioController.signIn); +route.use("/rep", UsuarioController.auth); -route.use('/rep', UsuarioController.auth); - -route.post('/rep', RepublicaController.create); -route.put('/rep', RepublicaController.update); -route.delete('/rep', RepublicaController.remove); +route.post("/rep", RepublicaController.create); +route.put("/rep", RepublicaController.update); +route.delete("/rep", RepublicaController.remove); module.exports = route;