linagora/openpaas-esn

View on GitHub
modules/linagora.esn.signup/backend/lib/invitation/handlers/signup.js

Summary

Maintainability
D
1 day
Test Coverage
'use strict';

var emailAddresses = require('email-addresses');
var async = require('async');
var invitationValidityDays = 7;

module.exports = dependencies => {
  const logger = dependencies('logger'),
        signupEmail = dependencies('email').system.signupConfirmation,
        exports = {};

  exports.isStillValid = function(invitation, done) {
    var limitDate = new Date(invitation.timestamps.created.getTime());
    limitDate.setDate(limitDate.getDate() + invitationValidityDays);
    if (limitDate.getTime() < Date.now()) {
      return done(null, false);
    }
    return done(null, true);
  };

  /**
   * Validate the input data: required properties are firstname, lastname and email.
   */
  exports.validate = function(invitation, done) {
    if (!invitation.data) {
      return done(null, false);
    }
    if (!invitation.data.firstname || !invitation.data.lastname || !invitation.data.email) {
      return done(null, false);
    }
    if (emailAddresses.parseOneAddress(invitation.data.email) === null) {
      return done(null, false);
    }
    return done(null, true);
  };

  /**
   * Send email to the user. At this step, the data is valid and we should have an invitation UUID.
   */
  exports.init = function(invitation, done) {
    if (!invitation.uuid) {
      return done(new Error('Invitation UUID is required'));
    }
    if (!invitation.data.url) {
      return done(new Error('Invitation URL is required'));
    }
    signupEmail(invitation, function(err, result) {
      if (err) {
        logger.warn('Signup invitation have not been sent %s', err.message);
      } else {
        logger.debug('Signup invitation has been sent ' + invitation);
      }
      done(err, result);
    });
  };

  /**
   * Redirect the user to the right invitation page
   */
  exports.process = function(invitation, data, done) {
    if (invitation) {
      return done(null, {redirect: '/#/signup/' + invitation.uuid});
    }
    return done(new Error('Can not find any valid invitation'));
  };

  /**
   * Create the user resources
   */
  exports.finalize = function(invitation, data, done) {

    if (!invitation) {
      return done(new Error('Invalid invitation request'));
    }

    if (!data) {
      return done(new Error('Request data is required'));
    }
    var formValues = data.body.data;
    var helper = dependencies('invitation').initHelper(invitation, formValues);

    async.waterfall(
      [
        helper.isInvitationFinalized,
        helper.testDomainCompany,
        helper.checkUser,
        helper.createUser,
        helper.createDomain,
        helper.addUserToDomain,
        helper.finalizeInvitation,
        helper.result
      ], function(err, result) {
        if (err) {
          logger.error('Error while finalizing invitation', err);
          return done(err);
        } else if (result) {
          return done(null, {status: 201, result: result});
        }
      });
  };

  return exports;
};