diff --git a/src/libs/models/resetToken.js b/src/libs/models/resetToken.js new file mode 100644 index 0000000000000000000000000000000000000000..78b9f2bd05d2e79d123d9427766eacd52a7673b2 --- /dev/null +++ b/src/libs/models/resetToken.js @@ -0,0 +1,42 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; +const libs = `${process.cwd()}/libs`; +const log = require(`${libs}/log`)(module); +const User = require(`${libs}/models/user`); +const uuid = require('node-uuid'); + +let ResetToken = new Schema({ + userId: { + type: Schema.Types.ObjectId, + required: true, + ref: 'User' + }, + token: { + type: String, + required: true + }, + reset: { + type: Boolean, + required: true, + default: false + }, + createdAt: { + type: Date, + required: true, + default: Date.now + } +}); + +ResetToken.methods.createResetToken = function (done) { + let verificationToken = this; + let token = uuid.v4(); + ResetToken.set('token', token); + ResetToken.reset = false; + resetToken.save(function(err) { + if (err) + return done(err); + return done(null, token); + }) +} + +module.exports = mongoose.model('ResetToken', ResetToken); diff --git a/src/libs/routes/resetToken.js b/src/libs/routes/resetToken.js new file mode 100644 index 0000000000000000000000000000000000000000..f2de70118e20375ce0dafa3207b5bfa4e17a0367 --- /dev/null +++ b/src/libs/routes/resetToken.js @@ -0,0 +1,70 @@ +const express = require('express'); + +const resetTokenApp = express.Router(); + +const libs = `${process.cwd()}/libs`; + +const log = require(`${libs}/log`)(module); + +const ResetToken = require(`${libs}/models/resetToken`); + +const User = require(`${libs}/models/user`); + +resetTokenApp.get('/:token', (req, res, next) => { + let token = req.params.token; + console.log('verificando token'); + ResetToken.findOne({token: token}, (err, rToken) => { + if(err) { + log.error(err); + return next(err); + } + if(!rToken) { + // TODO: generate new reset token + console.log('Token não existe'); + res.statusCode = 404; + return next({msg: 'Token not found', status:404}); + } + User.findById(rToken.userId, (err, user) => { + if(err) { + log.error(err); + next(err); + } + let u = user.toObject(); + delete u.salt; + delete u.hashedPassword; + res.json({user: u}); + }); + }); +}); +resetTokenApp.post('/:token', (req, res, next) => { + let token = req.params.token; + console.log('verificando token'); + ResetToken.findOne({token: token}, (err, rToken) => { + if(err) { + log.error(err); + return next(err); + } + if(!rToken) { + // TODO: generate new reset token + console.log('Token não existe'); + res.statusCode = 404; + return next({msg: 'Token not found', status:404}); + } + User.findById(rToken.userId, (err, user) => { + if(err) { + log.error(err); + next(err); + } + user.password = req.query.password; + user.save((err) => { + if(err) { + log.error(err); + next(err); + } + res.json({msg: "Senha alterada com sucesso"}); + }) + }); + }); +}) + +module.exports = resetTokenApp; diff --git a/src/libs/routes/user.js b/src/libs/routes/user.js index f22f356a58c3e0eb62d4d1b19358a40eed7d5718..4a164230605b6804ea8088fa78cc5ac087947466 100644 --- a/src/libs/routes/user.js +++ b/src/libs/routes/user.js @@ -12,6 +12,8 @@ const User = require(`${libs}/models/user`); const VerificationToken = require(`${libs}/models/verificationToken`); +const ResetToken = require(`${libs}/models/resetToken`); + const response = require(`${libs}/middlewares/response`); const email = require(`${libs}/middlewares/email`); @@ -25,7 +27,7 @@ function emailSyntax(email) { userApp.get('/schooling', (req, res, next) => { req.result = [ - 'Não estudou', + 'Não estudou', 'Ensino Fundamental Incompleto', 'Ensino Fundamental Completo', 'Ensino Médio', @@ -173,4 +175,47 @@ userApp.post('/', (req, res, next) => { }); }); +userApp.get('/reset-password', (req, res, next) => { + let email = req.query.email; + User.findOne({email: email}, (err, user)=> { + if(err) { + log.error(err); + let errors = []; + for(let errName in err.errors) { + errors.push(err.errors[errName].message); + } + res.statusCode = 400; + return res.json({err, errors}); + } + if (!user) + res.json({msg: "O usuário não está cadastrado"}); + else { + let resetToken = new ResetToken({ + userId: user._id + }); + resetToken.createResetToken((err, token) => { + if (err) { + log.error(err); + return next(err); + } + let url = config.default.lde.url + '/reset-password'; + let text = `Olá, ${user.name}.\n\nRecebemos uma solicitação para redefinir sua senha do Laboratório de Dados Educacionais. Clique neste link para redefinir a sua senha: ${url}/${token}`; + let mailOptions = { + to: `"${user.name} <${user.email}>"`, + subject: "Redefinição de Senha - Laboratório de Dados Educacionais", + text + } + email(mailOptions, (err, info) => { + if(err) { + log.error(err); + res.json({msg: 'Undelivered Reset Password Mail'}); + } + log.debug(`Message ${info.messageId} sent: ${info.response}`); + res.json({msg: 'Reset Password Mail Successfully Delivered'}); + }); + }) + } + }) +}) + module.exports = userApp;