const express = require('express'); const userApp = express(); const libs = `${process.cwd()}/libs`; const config = require(`${libs}/config`); const log = require(`${libs}/log`)(module); const User = require(`${libs}/models/user`); const jwt = require('jwt-simple'); const required_fields = ["email", "password", "name", "cpf", "schooling", "segment", "role", "institution_name", "state", "city"]; function emailSyntax(email) { const regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; return regex.test(email); } userApp.post('/', (req, res, next) => { if(req.body.email){ if(!emailSyntax(req.body.email)){ res.status(400); res.json({success: false, msg: 'O email informado é inválido.'}); } else { next(); } } else { next(); } }, (req, res, next) => { User.count({'email': req.body.email}, function(err, count){ if (err){ log.error('MongoDB error: ' + err); res.status(500); res.json({success: false, msg: ['Um erro ocorreu no banco de dados.']}); } if(count){ res.status(400); res.json({success: false, msg: 'O email informado já está cadastrado.'}); } else { next(); } }); }, (req, res, next) => { User.count({'cpf': req.body.cpf}, function(err, count){ if (err){ log.error('MongoDB error: ' + err); res.status(500); res.json({success: false, msg: ['Um erro ocorreu no banco de dados.']}); } if(count){ res.status(400); res.json({success: false, msg: 'O CPF informado já está cadastrado.'}); } else { next(); } }); }, (req, res, next) => { var newUser = new User({ email: req.body.email, password: req.body.password, name: req.body.name, cpf: req.body.cpf, schooling: req.body.schooling, course: req.body.course, segment: req.body.segment, role: req.body.role, institution_name: req.body.institution_name, state: req.body.state, city: req.body.city, receive_emails: req.body.receive_emails }); // save the user newUser.save((err) => { if (err){ let errArray = []; let errMsg = ''; for (var e in err.errors) { errArray.push(err.errors[`${e}`].message); } res.status(400); res.json({success: false, msg: errArray}); } else { res.status(201); res.json({success: true, msg: 'Usuário cadastrado com sucesso!'}); } }); }); userApp.post('/authenticate', (req, res, next) => { if (!req.body.email) { res.status(400); res.json({success: false, msg: 'O campo Email é obrigatório.'}); } else { next(); } }, (req, res, next) => { if (!req.body.password) { res.status(400); res.json({success: false, msg: 'O campo Senha é obrigatório.'}); } else { next(); } }, (req, res, next) => { User.findOne({ email: req.body.email }, (err, user) => { if (err) throw err; if(!user){ res.status(400); res.json({success: false, msg: ['O Email informado não está cadastrado.']}); } else { user.comparePassword(req.body.password, (err, isMatch) => { if (isMatch && !err) { var secret = config.mongodb.secret; // if user is found and password is right create a token var token = jwt.encode(user, secret); //returns user info including token as json res.json({success: true, token: 'JWT ' + token, msg: 'Usuário autenticado com sucesso'}); } else { res.status(400); res.json({success: false, msg: ['A Senha informada é inválida.']}); } }); } }); }); module.exports = userApp;