src/forms/forgotPassword.js

Summary

Maintainability
A
1 hr
Test Coverage
"use strict";


const waigo = global.waigo,
  _ = waigo._,
  errors = waigo.load('support/errors');


const ForgotPasswordError = errors.define('ForgotPasswordError');


module.exports = {
  fields: [
    {
      name: 'email',
      type: 'text',
      label: 'Email address / Username',
      required: true,
      sanitizers: [ 'trim' ],
      validators: [ 'notEmpty' ],
    },
  ],
  method: 'POST',
  postValidation: [
    function* sendResetPasswordEmail(next) {
      let ctx = this.context,
        App = ctx.App;

      let User = App.models.User;

      // load user
      let user = yield User.getByEmailOrUsername(this.fields.email.value);

      if (!user) {
        ctx.throw(ForgotPasswordError, 'User not found', 404);
      }

      // action
      let token = yield App.actionTokens.create('reset_password', user);

      App.logger.debug('Reset password token for ' + user.id , token);

      // record
      App.emit('record', 'reset_password', user);

      // send email
      yield App.mailer.send({
        to: user,
        subject: 'Reset your password',
        bodyTemplate: 'resetPassword',
        templateVars: {
          link: App.routes.url('reset_password', null, {
            c: token
          }, {
            absolute: true
          })
        }
      });

      yield next;
    }
  ]
};