modules/linagora.esn.signup/backend/lib/invitation/handlers/signup.js
'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;
};