UNPKG

strider

Version:

Brilliant continuous deployment platform

94 lines 3.38 kB
const _ = require('lodash'); const crypto = require('crypto'); const base32 = require('thirty-two'); const mail = require('../../email'); const models = require('../../models'); const User = models.User; const InviteCode = models.InviteCode; module.exports = { add: add, del: del, }; function updateInvite(invite, collaboration, done) { const found = _.find(invite.collaborations, function (c) { return c.project === collaboration.project; }); // There is already an outstanding invite to this user, just push these additional perms onto the collaborations // list and send another email. We only push if they have not already been added to the invite. if (!found) { invite.updateMany({ $push: { collaborations: collaboration } }, function (err) { if (err) return done(err); // Invite updated, should probably send another email to recipient. return done(null, false, false); }); } else { return done(null, false, true); } } function sendInvite(inviter, email, collaboration, done) { const random = crypto.randomBytes(5).toString('hex'); const invite_code = base32.encode(random); const invite = new InviteCode({ code: invite_code, emailed_to: email, created_timestamp: new Date(), collaborations: [collaboration], }); invite.save(function (err) { if (err) return done(err); // Invite created, send email to recipient. mail.sendInviteCollaboratorNewUser(inviter, email, invite_code, collaboration.project); return done(null, false, false); }); } // done(err, userExisted, inviteExisted) function add(project, email, accessLevel, inviter, done) { User.findOne({ email: email }, function (err, user) { if (err) { return done(err); } if (user) { const p = _.find(user.projects, function (p) { return p.name === project.toLowerCase(); }); if (p) { return done('user already a collaborator', true); } User.updateOne({ email: email }, { $push: { projects: { name: project.toLowerCase(), display_name: project, access_level: accessLevel, }, }, }, function (err) { if (err) return done(err, true); done(null, true); }); } else { const collaboration = { project: project, invited_by: inviter._id, access_level: accessLevel, }; InviteCode.findOne({ emailed_to: email, consumed_timestamp: null }, function (err, invite) { if (err) return done(err); if (invite) { return updateInvite(invite, collaboration, done); } sendInvite(inviter, email, collaboration, done); }); } }); } function del(project, email, done) { User.updateOne({ email: email, 'projects.name': project.toLowerCase() }, { $pull: { projects: { name: project.toLowerCase() } } }, done); } //# sourceMappingURL=api.js.map