@@ -24,7 +24,20 @@ async function handleChallengeCreate (message) {
24
24
logger . info ( `Found member ids [${ memberIds . join ( ', ' ) } ] of project id ${ projectId } ` )
25
25
26
26
// search members
27
- const members = await helper . searchMembers ( memberIds )
27
+ let members = await helper . searchMembers ( memberIds )
28
+
29
+ // fetch all members of groups
30
+ const groupIds = _ . difference ( message . payload . groups , config . GROUPS_TO_IGNORE )
31
+
32
+ // filter members who are NOT part of all the groups
33
+ if ( groupIds . length > 0 && members . length > 0 ) {
34
+ const memberIds = members . map ( m => m . id )
35
+ const filteredMemberIds = await helper . filterMemberForGroups ( memberIds , groupIds )
36
+
37
+ // remove the members who are not part of all the groups
38
+ members = members . filter ( m => ! filteredMemberIds . includes ( m . id ) )
39
+ }
40
+
28
41
// create resource for each member
29
42
for ( const member of members ) {
30
43
const resource = await helper . createResource ( challengeId , member . handle )
@@ -46,6 +59,49 @@ handleChallengeCreate.schema = {
46
59
} ) . required ( )
47
60
}
48
61
62
+ /**
63
+ * Process Kafka message of challenge updated
64
+ * @param {Object } message the challenge update message
65
+ */
66
+ async function handleChallengeUpdate ( message ) {
67
+ const challengeId = message . payload . id
68
+ const projectId = message . payload . projectId
69
+ logger . info ( `Process message of challenge id ${ challengeId } and project id ${ projectId } ` )
70
+
71
+ // get challenge resources (all observers for the challenge)
72
+ let challengeResources = await helper . getChallengeResources ( challengeId , config . RESOURCE_ROLE_ID )
73
+
74
+ // fetch all members of groups
75
+ const groupIds = _ . difference ( message . payload . groups , config . GROUPS_TO_IGNORE )
76
+
77
+ // filter members who are NOT part of all the groups
78
+ if ( groupIds . length > 0 && challengeResources . length > 0 ) {
79
+ const memberIds = challengeResources . map ( cr => cr . memberId )
80
+ const filteredMemberIds = await helper . filterMemberForGroups ( memberIds , groupIds )
81
+
82
+ // filter the members who are not part of all the groups
83
+ challengeResources = challengeResources . filter ( member => filteredMemberIds . includes ( member . memberId ) )
84
+
85
+ // remove members from resources who are not part of all the groups
86
+ await Promise . allSettled ( challengeResources . map ( member => helper . deleteResource ( challengeId , member . memberHandle , config . RESOURCE_ROLE_ID ) ) ) ;
87
+ }
88
+
89
+ logger . info ( `Successfully processed message of challenge id ${ challengeId } and project id ${ projectId } ` )
90
+ }
91
+
92
+ handleChallengeUpdate . schema = {
93
+ message : Joi . object ( ) . keys ( {
94
+ topic : Joi . string ( ) . required ( ) ,
95
+ originator : Joi . string ( ) . required ( ) ,
96
+ timestamp : Joi . date ( ) . required ( ) ,
97
+ 'mime-type' : Joi . string ( ) . required ( ) ,
98
+ payload : Joi . object ( ) . keys ( {
99
+ id : Joi . string ( ) . uuid ( ) . required ( ) , // challenge id
100
+ projectId : Joi . number ( ) . integer ( ) . positive ( ) . required ( )
101
+ } ) . unknown ( true ) . required ( )
102
+ } ) . required ( )
103
+ }
104
+
49
105
/**
50
106
* Handle project member changes
51
107
* @param {Number } projectId the project ID
@@ -61,8 +117,8 @@ async function handleProjectMemberChange (projectId, userId, isDeleted) {
61
117
const [ memberDetails ] = await helper . searchMembers ( [ userId ] )
62
118
const { handle } = memberDetails
63
119
for ( const challenge of challenges ) {
64
- const challenngeResources = await helper . getChallengeResources ( challenge . id , config . MANAGER_RESOURCE_ROLE_ID )
65
- const existing = _ . find ( challenngeResources , r => _ . toString ( r . memberId ) === _ . toString ( userId ) )
120
+ const challengeResources = await helper . getChallengeResources ( challenge . id , config . MANAGER_RESOURCE_ROLE_ID )
121
+ const existing = _ . find ( challengeResources , r => _ . toString ( r . memberId ) === _ . toString ( userId ) )
66
122
if ( isDeleted ) {
67
123
if ( existing ) {
68
124
await helper . deleteResource ( challenge . id , handle , config . MANAGER_RESOURCE_ROLE_ID )
0 commit comments