From 757e3c4d1ad2c6aa8979561a393016ee4cea952f Mon Sep 17 00:00:00 2001 From: caioagiani Date: Wed, 14 Oct 2020 19:52:26 -0300 Subject: [PATCH] feat: added middleware verification and fix column name --- README.MD | 19 +++++---- package.json | 3 +- src/app/controllers/UserController.js | 21 +++++----- src/app/middlewares/Check.js | 39 +++++++++++++++++++ .../Token.js} | 0 src/app/models/User.js | 18 ++++----- src/routes.js | 6 ++- tests/api.test.js | 34 ++++++++-------- 8 files changed, 89 insertions(+), 51 deletions(-) create mode 100644 src/app/middlewares/Check.js rename src/app/{controllers/TokenController.js => middlewares/Token.js} (100%) diff --git a/README.MD b/README.MD index 21655bf..1d048f5 100644 --- a/README.MD +++ b/README.MD @@ -133,25 +133,24 @@ Observação importante: rota `/user/:user_id` é necessário passsar no **heade ## Test -```java -caioh@developer MINGW64 ~/OneDrive/Documentos/Node/api-sky -$ yarn test -yarn run v1.22.0 +```javascript +caio-agiani in api-restful on  master [!] took 2s ❯ yarn test +yarn run v1.22.5 $ jest --setupFiles dotenv/config --detectOpenHandles --forceExit - PASS tests/api.test.js (6.721 s) + PASS tests/api.test.js Authentication - √ should create session authentication (5382 ms) + ✓ should create session authentication (1233 ms) Login - √ should create user session (24 ms) + ✓ should create user session (131 ms) User - √ should list user by id (7 ms) + ✓ should list user by id (9 ms) Test Suites: 1 passed, 1 total Tests: 3 passed, 3 total Snapshots: 0 total -Time: 6.776 s, estimated 17 s +Time: 2.136 s Ran all test suites. -Done in 7.37s. +Done in 2.58s. ``` ## Contato diff --git a/package.json b/package.json index d9df0c8..da33a73 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "cors": "^2.8.5", "express": "^4.17.1", "jsonwebtoken": "^8.5.1", - "mongoose": "^5.9.15" + "mongoose": "^5.9.15", + "yup": "^0.29.3" }, "devDependencies": { "dotenv": "^8.2.0", diff --git a/src/app/controllers/UserController.js b/src/app/controllers/UserController.js index 7998398..8137d04 100644 --- a/src/app/controllers/UserController.js +++ b/src/app/controllers/UserController.js @@ -1,5 +1,5 @@ const bcryptjs = require('bcryptjs'); -const { createToken } = require('./TokenController'); +const { createToken } = require('../middlewares/Token'); const User = require('../models/User'); @@ -14,8 +14,7 @@ module.exports = { const user = await User.findById({ _id: user_id }); - user.password = undefined; - user.__v = undefined; + user.senha = undefined; return res.status(200).json(user); }, @@ -31,16 +30,15 @@ module.exports = { const user = await User.create(req.body); - user.password = undefined; - user.__v = undefined; + user.senha = undefined; return res.status(200).json(user); }, async show(req, res) { - const { email, password } = req.body; + const { email, senha } = req.body; - const user = await User.findOne({ email }, '+password'); + const user = await User.findOne({ email }, '+senha'); if (!user) { return res @@ -48,7 +46,7 @@ module.exports = { .json({ mensagem: 'Usuário e/ou senha inválidos.' }); } - const checkPass = await bcryptjs.compare(password, user.password); + const checkPass = bcryptjs.compareSync(senha, user.senha); if (!checkPass) { return res @@ -58,17 +56,16 @@ module.exports = { const token = createToken({ id: user.id, - name: user.name, + nome: user.nome, email }); await User.findOneAndUpdate( { _id: user._id }, - { token, lastLoginAt: Date.now() } + { token, data_ultima_atualizacao: Date.now() } ); - user.password = undefined; - user.__v = undefined; + user.senha = undefined; user.token = token; return res.status(200).json(user); diff --git a/src/app/middlewares/Check.js b/src/app/middlewares/Check.js new file mode 100644 index 0000000..3c893bd --- /dev/null +++ b/src/app/middlewares/Check.js @@ -0,0 +1,39 @@ +const Yup = require('yup'); + +module.exports = { + async SingIn(req, res, next) { + try { + const schema = Yup.object().shape({ + email: Yup.string().email().required(), + senha: Yup.string().required() + }); + + await schema.validate(req.body, { abortEarly: false }); + + return next(); + } catch (error) { + return res.json({ error }); + } + }, + async SingUp(req, res, next) { + try { + const schema = Yup.object().shape({ + nome: Yup.string().required(), + email: Yup.string().email().required(), + senha: Yup.string().required(), + telefones: Yup.array( + Yup.object().shape({ + numero: Yup.string().required(), + ddd: Yup.string().required() + }) + ) + }); + + await schema.validate(req.body, { abortEarly: false }); + + return next(); + } catch (error) { + return res.json({ error }); + } + } +}; diff --git a/src/app/controllers/TokenController.js b/src/app/middlewares/Token.js similarity index 100% rename from src/app/controllers/TokenController.js rename to src/app/middlewares/Token.js diff --git a/src/app/models/User.js b/src/app/models/User.js index 3ce900f..148eebd 100644 --- a/src/app/models/User.js +++ b/src/app/models/User.js @@ -1,9 +1,9 @@ const { Schema, model } = require('mongoose'); -const bcryptjs = require('bcryptjs'); +const { hashSync } = require('bcryptjs'); const UserSchema = new Schema( { - name: { + nome: { type: String, required: true }, @@ -19,12 +19,12 @@ const UserSchema = new Schema( ddd: String } ], - password: { + senha: { type: String, required: true, select: false }, - lastLoginAt: { + data_ultima_atualizacao: { type: Date, default: Date.now() }, @@ -34,18 +34,18 @@ const UserSchema = new Schema( } }, { - timestamps: true + timestamps: { createdAt: 'data_criacao', updatedAt: 'data_atualizacao' } } ); -UserSchema.pre('save', async function () { - this.password = await bcryptjs.hash(this.password, 1); +UserSchema.pre('save', function () { + this.senha = hashSync(this.senha, 1); }); UserSchema.pre('updateOne', async function () { - const pass = this.getUpdate().password; + const pass = this.getUpdate().senha; - if (pass) this.getUpdate().password = bcryptjs.hashSync(pass, 10); + if (pass) this.getUpdate().senha = hashSync(pass, 10); }); module.exports = model('User', UserSchema); diff --git a/src/routes.js b/src/routes.js index dd6a12f..95b2e21 100644 --- a/src/routes.js +++ b/src/routes.js @@ -5,9 +5,11 @@ const { AuthMiddleware } = require('./app/controllers'); +const { SingIn, SingUp } = require('./app/middlewares/Check'); + routes - .post('/login', UserController.show) - .post('/user/create', UserController.store) + .post('/login', SingIn, UserController.show) + .post('/user/create', SingUp, UserController.store) .get('/user/:user_id', AuthMiddleware, UserController.index); module.exports = routes; diff --git a/tests/api.test.js b/tests/api.test.js index 81e177e..366b4f6 100644 --- a/tests/api.test.js +++ b/tests/api.test.js @@ -1,26 +1,14 @@ const request = require('supertest'); const app = require('../src/app'); -describe('Authentication', () => { - it('should create session authentication', async (done) => { - const response = await request(app).post('/login').send({ - email: 'caio.agiani14@gmail.com', - password: '123' - }); - - expect(response.status).toBe(200); - done(); - }); -}); - -describe('Login', () => { +describe('Create', () => { it('should create user session', async (done) => { const response = await request(app) .post('/user/create') .send({ - name: 'Caio Agiani', - email: 'caio.agiani14@gmail.com', - password: '123', + nome: 'Caio Agiani', + email: `caio.agiani${Math.floor(Math.random() * 9999) + 1}@gmail.com`, + senha: '123123123', telefones: [ { numero: '999865802', @@ -34,10 +22,22 @@ describe('Login', () => { }); }); +describe('Authentication', () => { + it('should create session authentication', async (done) => { + const response = await request(app).post('/login').send({ + email: 'caio.agiani14@gmail.com', + senha: '123' + }); + + expect(response.status).toBe(200); + done(); + }); +}); + describe('User', () => { it('should list user by id', async (done) => { const response = await request(app) - .get('/user/5ec46b12bf6de842bc001b08') + .get('/user/5f877dc25d9f7b5c08f77c16') .send(); expect(response.status).toBe(401);