Skip to content

Commit 48f1412

Browse files
author
Vikas Agarwal
committed
Github issue#2742, [Team Management 2.0] Inviting already invited user fails without clear error message
— Fixing the issue when only one user is being invited and is already invited to the team. It was never returning the response in such case.
1 parent 92f3497 commit 48f1412

File tree

1 file changed

+91
-85
lines changed

1 file changed

+91
-85
lines changed

src/routes/projectMemberInvites/create.js

Lines changed: 91 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -95,98 +95,104 @@ module.exports = [
9595
}
9696
}
9797
return models.ProjectMemberInvite.getPendingInvitesForProject(projectId)
98-
.then((invites) => {
99-
const data = {
100-
projectId,
101-
role: invite.role,
102-
status: INVITE_STATUS.PENDING,
103-
createdBy: req.authUser.userId,
104-
updatedBy: req.authUser.userId,
105-
};
106-
const invitePromises = [];
107-
if (invite.userIds) {
108-
// remove invites for users that are invited already
109-
_.remove(invite.userIds, u => _.some(invites, i => i.userId === u));
110-
invite.userIds.forEach((userId) => {
111-
const dataNew = _.clone(data);
112-
_.assign(dataNew, {
113-
userId,
114-
});
115-
invitePromises.push(models.ProjectMemberInvite.create(dataNew));
116-
});
117-
}
118-
data.userId = null;
119-
120-
if (invite.emails) {
121-
// remove invites for users that are invited already
122-
_.remove(invite.emails, u => _.some(invites, i => i.email === u));
123-
invite.emails.forEach((email) => {
124-
const dataNew = _.clone(data);
125-
_.assign(dataNew, {
126-
email,
127-
});
128-
invitePromises.push(models.ProjectMemberInvite.create(dataNew));
98+
.then((invites) => {
99+
const data = {
100+
projectId,
101+
role: invite.role,
102+
status: INVITE_STATUS.PENDING,
103+
createdBy: req.authUser.userId,
104+
updatedBy: req.authUser.userId,
105+
};
106+
const invitePromises = [];
107+
if (invite.userIds) {
108+
// remove invites for users that are invited already
109+
_.remove(invite.userIds, u => _.some(invites, i => i.userId === u));
110+
invite.userIds.forEach((userId) => {
111+
const dataNew = _.clone(data);
112+
_.assign(dataNew, {
113+
userId,
114+
});
115+
invitePromises.push(models.ProjectMemberInvite.create(dataNew));
116+
});
117+
}
118+
data.userId = null;
119+
120+
if (invite.emails) {
121+
// remove invites for users that are invited already
122+
_.remove(invite.emails, u => _.some(invites, i => i.email === u));
123+
invite.emails.forEach((email) => {
124+
const dataNew = _.clone(data);
125+
_.assign(dataNew, {
126+
email,
127+
});
128+
invitePromises.push(models.ProjectMemberInvite.create(dataNew));
129+
});
130+
}
131+
132+
if (invitePromises.length === 0) {
133+
return [];
134+
}
135+
136+
req.log.debug('Creating invites');
137+
const emailEventType = BUS_API_EVENT.PROJECT_MEMBER_EMAIL_INVITE_CREATED;
138+
return models.sequelize.Promise.all(invitePromises)
139+
.then((values) => {
140+
values.forEach((v) => {
141+
req.app.emit(EVENT.ROUTING_KEY.PROJECT_MEMBER_INVITE_CREATED, {
142+
req,
143+
userId: v.userId,
144+
email: v.email,
129145
});
130-
}
131-
132-
req.log.debug('Creating invites');
133-
const emailEventType = BUS_API_EVENT.PROJECT_MEMBER_EMAIL_INVITE_CREATED;
134-
return models.sequelize.Promise.all(invitePromises)
135-
.then((values) => {
136-
values.forEach((v) => {
137-
req.app.emit(EVENT.ROUTING_KEY.PROJECT_MEMBER_INVITE_CREATED, {
138-
req,
139-
userId: v.userId,
140-
email: v.email,
141-
});
142-
req.app.services.pubsub.publish(
143-
EVENT.ROUTING_KEY.PROJECT_MEMBER_INVITE_CREATED,
144-
v,
145-
{ correlationId: req.id },
146-
);
147-
// send email invite (async)
148-
if (v.email) {
149-
models.Project
150-
.find({
151-
where: { id: projectId },
152-
raw: true,
153-
})
154-
.then((_project) => {
155-
createEvent(emailEventType,
156-
{
157-
data: {
158-
connectURL: config.get('connectUrl'),
159-
accountsAppURL: config.get('accountsAppUrl'),
160-
subject: config.get('inviteEmailSubject'),
161-
projects: [
146+
req.app.services.pubsub.publish(
147+
EVENT.ROUTING_KEY.PROJECT_MEMBER_INVITE_CREATED,
148+
v,
149+
{ correlationId: req.id },
150+
);
151+
// send email invite (async)
152+
if (v.email) {
153+
models.Project
154+
.find({
155+
where: { id: projectId },
156+
raw: true,
157+
})
158+
.then((_project) => {
159+
createEvent(emailEventType,
160+
{
161+
data: {
162+
connectURL: config.get('connectUrl'),
163+
accountsAppURL: config.get('accountsAppUrl'),
164+
subject: config.get('inviteEmailSubject'),
165+
projects: [
166+
{
167+
name: _project.name,
168+
projectId,
169+
sections: [
162170
{
163-
name: _project.name,
171+
EMAIL_INVITES: true,
172+
title: config.get('inviteEmailSectionTitle'),
173+
projectName: _project.name,
164174
projectId,
165-
sections: [
166-
{
167-
EMAIL_INVITES: true,
168-
title: config.get('inviteEmailSectionTitle'),
169-
projectName: _project.name,
170-
projectId,
171-
},
172-
],
173175
},
174176
],
175177
},
176-
recipients: [v.email],
177-
version: 'v3',
178-
from: {
179-
name: config.get('EMAIL_INVITE_FROM_NAME'),
180-
email: config.get('EMAIL_INVITE_FROM_EMAIL'),
181-
},
182-
categories: [`${process.env.NODE_ENV}:${emailEventType}`.toLowerCase()],
183-
}, req.log);
184-
});
185-
}
186-
return res.status(201).json(util.wrapResponse(req.id, values, null, 201));
178+
],
179+
},
180+
recipients: [v.email],
181+
version: 'v3',
182+
from: {
183+
name: config.get('EMAIL_INVITE_FROM_NAME'),
184+
email: config.get('EMAIL_INVITE_FROM_EMAIL'),
185+
},
186+
categories: [`${process.env.NODE_ENV}:${emailEventType}`.toLowerCase()],
187+
}, req.log);
187188
});
188-
});
189+
}
190+
});
191+
return values;
189192
});
190-
}).catch(err => next(err));
193+
});
194+
})
195+
.then(values => res.status(201).json(util.wrapResponse(req.id, values, null, 201)))
196+
.catch(err => next(err));
191197
},
192198
];

0 commit comments

Comments
 (0)