@@ -60,14 +60,25 @@ const compareEmail = (email1, email2, options = { UNIQUE_GMAIL_VALIDATION: false
60
60
* @param {Array } invites existent invites from DB
61
61
* @param {Object } data template for new invites to be put in DB
62
62
* @param {Array } failed failed invites error message
63
+ * @param {Array } members already members of the project
63
64
*
64
65
* @returns {Promise<Promise[]> } list of promises
65
66
*/
66
- const buildCreateInvitePromises = ( req , invite , invites , data , failed ) => {
67
+ const buildCreateInvitePromises = ( req , invite , invites , data , failed , members ) => {
67
68
const invitePromises = [ ] ;
68
69
if ( invite . userIds ) {
69
70
// remove invites for users that are invited already
70
- _ . remove ( invite . userIds , u => _ . some ( invites , i => i . userId === u ) ) ;
71
+ const errMessageForAlreadyInvitedUsers = 'User with such handle is already invited to this project.' ;
72
+ _ . remove ( invite . userIds , u => _ . some ( invites , ( i ) => {
73
+ const isPresent = i . userId === u ;
74
+ if ( isPresent ) {
75
+ failed . push ( _ . assign ( { } , {
76
+ userId : u ,
77
+ message : errMessageForAlreadyInvitedUsers ,
78
+ } ) ) ;
79
+ }
80
+ return isPresent ;
81
+ } ) ) ;
71
82
invite . userIds . forEach ( ( userId ) => {
72
83
const dataNew = _ . clone ( data ) ;
73
84
@@ -96,8 +107,34 @@ const buildCreateInvitePromises = (req, invite, invites, data, failed) => {
96
107
compareEmail ( existentUser . email , inviteEmail , { UNIQUE_GMAIL_VALIDATION : false } ) ) ,
97
108
) ;
98
109
110
+ // remove users that are already member of the team
111
+ const errMessageForAlreadyMemberUsers = 'User with such email is already a member of the team.' ;
112
+
113
+ _ . remove ( existentUsersWithNumberId , user => _ . some ( members , ( m ) => {
114
+ const isPresent = ( m . userId === user . id ) ;
115
+ if ( isPresent ) {
116
+ failed . push ( _ . assign ( { } , {
117
+ email : user . email ,
118
+ message : errMessageForAlreadyMemberUsers ,
119
+ } ) ) ;
120
+ }
121
+ return isPresent ;
122
+ } ) ) ;
123
+
99
124
// remove invites for users that are invited already
100
- _ . remove ( existentUsersWithNumberId , user => _ . some ( invites , i => i . userId === user . id ) ) ;
125
+ const errMessageForAlreadyInvitedUsers = 'User with such email is already invited to this project.' ;
126
+
127
+ _ . remove ( existentUsersWithNumberId , user => _ . some ( invites , ( i ) => {
128
+ const isPresent = ( i . userId === user . id ) ;
129
+ if ( isPresent ) {
130
+ failed . push ( _ . assign ( { } , {
131
+ email : i . email ,
132
+ message : errMessageForAlreadyInvitedUsers ,
133
+ } ) ) ;
134
+ }
135
+ return isPresent ;
136
+ } ) ) ;
137
+
101
138
existentUsersWithNumberId . forEach ( ( user ) => {
102
139
const dataNew = _ . clone ( data ) ;
103
140
@@ -109,8 +146,19 @@ const buildCreateInvitePromises = (req, invite, invites, data, failed) => {
109
146
110
147
// remove invites for users that are invited already
111
148
_ . remove ( nonExistentUserEmails , email =>
112
- _ . some ( invites , i =>
113
- compareEmail ( i . email , email , { UNIQUE_GMAIL_VALIDATION : config . get ( 'UNIQUE_GMAIL_VALIDATION' ) } ) ) ) ;
149
+ _ . some ( invites , ( i ) => {
150
+ const areEmailsSame = compareEmail ( i . email , email , {
151
+ UNIQUE_GMAIL_VALIDATION : config . get ( 'UNIQUE_GMAIL_VALIDATION' ) ,
152
+ } ) ;
153
+ if ( areEmailsSame ) {
154
+ failed . push ( _ . assign ( { } , {
155
+ email : i . email ,
156
+ message : errMessageForAlreadyInvitedUsers ,
157
+ } ) ) ;
158
+ }
159
+ return areEmailsSame ;
160
+ } ) ,
161
+ ) ;
114
162
nonExistentUserEmails . forEach ( ( email ) => {
115
163
const dataNew = _ . clone ( data ) ;
116
164
@@ -204,9 +252,19 @@ module.exports = [
204
252
const projectId = _ . parseInt ( req . params . projectId ) ;
205
253
206
254
const promises = [ ] ;
255
+ const errorMessageForAlreadyMemberUser = 'User with such handle is already a member of the team.' ;
207
256
if ( invite . userIds ) {
208
257
// remove members already in the team
209
- _ . remove ( invite . userIds , u => _ . some ( members , m => m . userId === u ) ) ;
258
+ _ . remove ( invite . userIds , u => _ . some ( members , ( m ) => {
259
+ const isPresent = m . userId === u ;
260
+ if ( isPresent ) {
261
+ failed . push ( _ . assign ( { } , {
262
+ userId : m . userId ,
263
+ message : errorMessageForAlreadyMemberUser ,
264
+ } ) ) ;
265
+ }
266
+ return isPresent ;
267
+ } ) ) ;
210
268
// permission:
211
269
// user has to have constants.MANAGER_ROLES role
212
270
// to be invited as PROJECT_MEMBER_ROLE.MANAGER
@@ -262,7 +320,7 @@ module.exports = [
262
320
} ;
263
321
264
322
req . log . debug ( 'Creating invites' ) ;
265
- return models . sequelize . Promise . all ( buildCreateInvitePromises ( req , invite , invites , data , failed ) )
323
+ return models . sequelize . Promise . all ( buildCreateInvitePromises ( req , invite , invites , data , failed , members ) )
266
324
. then ( ( values ) => {
267
325
values . forEach ( ( v ) => {
268
326
req . app . emit ( EVENT . ROUTING_KEY . PROJECT_MEMBER_INVITE_CREATED , {
0 commit comments