@@ -67,7 +67,7 @@ async function addGroupMember(currentUser, groupId, data) {
67
67
const targetObjectType = data . membershipType === config . MEMBERSHIP_TYPES . Group ? 'Group' : 'User'
68
68
const memberCheckRes = await tx . run (
69
69
`MATCH (g:Group {id: {groupId}})-[r:GroupContains]->(o:${ targetObjectType } {id: {memberId}}) RETURN o` ,
70
- { groupId, memberId : data . memberId }
70
+ { groupId, memberId : data . memberId }
71
71
)
72
72
if ( memberCheckRes . records . length > 0 ) {
73
73
throw new errors . ConflictError ( 'The member is already in the group' )
@@ -77,7 +77,7 @@ async function addGroupMember(currentUser, groupId, data) {
77
77
if ( data . membershipType === config . MEMBERSHIP_TYPES . Group ) {
78
78
const pathRes = await tx . run (
79
79
'MATCH p=shortestPath( (g1:Group {id: {fromId}})-[*]->(g2:Group {id: {toId}}) ) RETURN p' ,
80
- { fromId : data . memberId , toId : groupId }
80
+ { fromId : data . memberId , toId : groupId }
81
81
)
82
82
if ( pathRes . records . length > 0 ) {
83
83
throw new errors . ConflictError ( 'There is cyclical group reference' )
@@ -107,9 +107,9 @@ async function addGroupMember(currentUser, groupId, data) {
107
107
oldId : data . oldId ,
108
108
name : group . name ,
109
109
createdAt,
110
- ...( currentUser === 'M2M' ? { } : { createdBy : currentUser . userId } ) ,
110
+ ...( currentUser === 'M2M' ? { } : { createdBy : currentUser . userId } ) ,
111
111
memberId : data . memberId ,
112
- ...( data . memberOldId ? { memberOldId : data . memberOldId } : { } ) ,
112
+ ...( data . memberOldId ? { memberOldId : data . memberOldId } : { } ) ,
113
113
membershipType : data . membershipType
114
114
}
115
115
@@ -174,7 +174,7 @@ async function deleteGroupMember(currentUser, groupId, memberId) {
174
174
175
175
// delete membership
176
176
const query = 'MATCH (g:Group {id: {groupId}})-[r:GroupContains]->(o {id: {memberId}}) DELETE r'
177
- await tx . run ( query , { groupId, memberId } )
177
+ await tx . run ( query , { groupId, memberId} )
178
178
179
179
if ( validate ( memberId , 4 ) ) {
180
180
const getMember = await helper . ensureExists ( tx , 'Group' , memberId )
@@ -210,6 +210,103 @@ deleteGroupMember.schema = {
210
210
memberId : Joi . id ( )
211
211
}
212
212
213
+ /**
214
+ * Add universal member.
215
+ * @param {Object } currentUser the current user
216
+ * @param {String } groupId the id of group to add member
217
+ * @param {Object } data the data to add member
218
+ * @returns {Object } the added group membership
219
+ */
220
+ async function addUniversalMember ( currentUser , groupId , data ) {
221
+ logger . debug ( `Enter in addGroupMember - Group = ${ groupId } Criteria = ${ data } ` )
222
+ let session = helper . createDBSession ( )
223
+ let tx = session . beginTransaction ( )
224
+
225
+ try {
226
+ logger . debug ( `Check for groupId ${ groupId } exist or not` )
227
+ const group = await helper . ensureExists (
228
+ tx ,
229
+ 'Group' ,
230
+ groupId ,
231
+ currentUser !== 'M2M' && helper . hasAdminRole ( currentUser )
232
+ )
233
+ data . oldId = group . oldId
234
+ groupId = group . id
235
+ data . membershipType = config . MEMBERSHIP_TYPES . User
236
+
237
+ if ( currentUser !== 'M2M' && ! helper . hasAdminRole ( currentUser ) ) {
238
+ throw new errors . ForbiddenError ( 'You are not allowed to perform this action!' )
239
+ }
240
+
241
+ logger . debug ( `Check for memberId ${ data . universalUID } exist or not` )
242
+ await helper . ensureExists ( tx , 'User' , data . universalUID )
243
+
244
+ logger . debug ( `check member ${ data . universalUID } is part of group ${ groupId } ` )
245
+ const memberCheckRes = await tx . run (
246
+ `MATCH (g:Group {id: {groupId}})-[r:GroupContains]->(o:User {universalUID: {universalUID}}) RETURN o` ,
247
+ { groupId, universalUID : data . universalUID }
248
+ )
249
+ if ( memberCheckRes . records . length > 0 ) {
250
+ throw new errors . ConflictError ( 'The member is already in the group' )
251
+ }
252
+
253
+ // add membership
254
+ const membershipId = uuid ( )
255
+ const createdAt = new Date ( ) . toISOString ( )
256
+ const query = `MATCH (g:Group {id: {groupId}}) MATCH (o:User {universalUID: {universalUID}}) CREATE (g)-[r:GroupContains {universalUID: {universalUID}, type: {membershipType}, createdAt: {createdAt}, createdBy: {createdBy}}]->(o) RETURN r`
257
+
258
+ const params = {
259
+ groupId,
260
+ universalUID : data . universalUID ,
261
+ membershipId,
262
+ membershipType : data . membershipType ,
263
+ createdAt,
264
+ createdBy : currentUser === 'M2M' ? '00000000' : currentUser . userId
265
+ }
266
+
267
+ logger . debug ( `quey for adding membership ${ query } with params ${ JSON . stringify ( params ) } ` )
268
+ await tx . run ( query , params )
269
+
270
+ const result = {
271
+ id : membershipId ,
272
+ groupId,
273
+ oldId : data . oldId ,
274
+ name : group . name ,
275
+ createdAt,
276
+ ...( currentUser === 'M2M' ? { } : { createdBy : currentUser . userId } ) ,
277
+ memberId : '00000000' ,
278
+ universalUID : data . universalUID ,
279
+ handle : data . handle ,
280
+ ...( data . memberOldId ? { memberOldId : data . memberOldId } : { } ) ,
281
+ membershipType : data . membershipType
282
+ }
283
+
284
+ logger . debug ( `sending message ${ JSON . stringify ( result ) } to kafka topic ${ config . KAFKA_GROUP_MEMBER_ADD_TOPIC } ` )
285
+ await helper . postBusEvent ( config . KAFKA_GROUP_MEMBER_ADD_TOPIC , result )
286
+
287
+ await tx . commit ( )
288
+ return result
289
+ } catch ( error ) {
290
+ logger . error ( error )
291
+ logger . debug ( 'Transaction Rollback' )
292
+ await tx . rollback ( )
293
+ throw error
294
+ } finally {
295
+ logger . debug ( 'Session Close' )
296
+ await session . close ( )
297
+ }
298
+ }
299
+
300
+ addUniversalMember . schema = {
301
+ currentUser : Joi . any ( ) ,
302
+ groupId : Joi . id ( ) , // defined in app-bootstrap
303
+ data : Joi . object ( )
304
+ . keys ( {
305
+ universalUID : Joi . id ( ) ,
306
+ handle : Joi . string ( ) . required ( )
307
+ } )
308
+ . required ( )
309
+ }
213
310
/**
214
311
* Get group members
215
312
* @param {Object } currentUser the current user
@@ -235,7 +332,7 @@ async function getGroupMembers(currentUser, groupId, criteria) {
235
332
}
236
333
237
334
const matchClause = 'MATCH (g:Group {id: {groupId}})-[r:GroupContains]->(o)'
238
- const params = { groupId }
335
+ const params = { groupId}
239
336
240
337
// query total record count
241
338
const totalRes = await session . run ( `${ matchClause } RETURN COUNT(o)` , params )
@@ -299,7 +396,7 @@ async function getGroupMemberWithSession(session, groupId, memberId) {
299
396
groupId = group . id
300
397
301
398
const query = 'MATCH (g:Group {id: {groupId}})-[r:GroupContains]->(o {id: {memberId}}) RETURN r'
302
- const membershipRes = await session . run ( query , { groupId, memberId } )
399
+ const membershipRes = await session . run ( query , { groupId, memberId} )
303
400
if ( membershipRes . records . length === 0 ) {
304
401
throw new errors . NotFoundError ( 'The member is not in the group' )
305
402
}
@@ -375,9 +472,9 @@ async function getGroupMembersCount(groupId, query) {
375
472
queryToExecute = 'MATCH (g:Group {id: {groupId}})-[r:GroupContains]->(o:User) RETURN COUNT(o) AS count'
376
473
}
377
474
378
- const res = await session . run ( queryToExecute , { groupId } )
475
+ const res = await session . run ( queryToExecute , { groupId} )
379
476
380
- return { count : res . records [ 0 ] . _fields [ 0 ] . low }
477
+ return { count : res . records [ 0 ] . _fields [ 0 ] . low }
381
478
} catch ( error ) {
382
479
logger . error ( error )
383
480
throw error
@@ -426,6 +523,7 @@ getMemberGroups.schema = {
426
523
module . exports = {
427
524
getGroupMembers,
428
525
addGroupMember,
526
+ addUniversalMember,
429
527
getGroupMember,
430
528
deleteGroupMember,
431
529
getGroupMembersCount,
0 commit comments