@@ -18,7 +18,9 @@ exports.groupUsersCounter = functions.database.ref('/v2/results/{projectId}/{gro
1818 // these references/values will be updated by this function
1919 const groupUsersRef = admin . database ( ) . ref ( '/v2/groupsUsers/' + context . params . projectId + '/' + context . params . groupId )
2020 const userRef = admin . database ( ) . ref ( '/v2/users/' + context . params . userId )
21- const userContributionRef = userRef . child ( 'contributionsNew/' + context . params . projectId )
21+ const totalTaskContributionCountRef = userRef . child ( 'taskContributionCount' )
22+ const userContributionRef = userRef . child ( 'contributions/' + context . params . projectId )
23+ const taskContributionCountRef = userRef . child ( 'contributions/' + context . params . projectId + '/taskContributionCount' )
2224
2325 // if result ref does not contain all required attributes we don't updated counters
2426 // e.g. due to some error when uploading from client
@@ -36,7 +38,13 @@ exports.groupUsersCounter = functions.database.ref('/v2/results/{projectId}/{gro
3638 return null
3739 }
3840
39- // Set userId in groupUsersRef
41+ /*
42+ Check if this user has submitted a results for this group already.
43+ If no result has been submitted yet, set userId in v2/groupsUsers.
44+ Then set this group contribution in the user profile.
45+ Update overall taskContributionCount and project taskContributionCount in the user profile
46+ based on the number of results submitted and the existing count values.
47+ */
4048 updateValues = groupUsersRef . child ( context . params . userId ) . once ( 'value' )
4149 . then ( ( dataSnapshot ) => {
4250 if ( dataSnapshot . exists ( ) ) {
@@ -49,15 +57,21 @@ exports.groupUsersCounter = functions.database.ref('/v2/results/{projectId}/{gro
4957 'startTime' : result [ 'startTime' ] ,
5058 'endTime' : result [ 'endTime' ]
5159 }
60+ const numberOfTasks = Object . keys ( result [ 'results' ] ) . length
5261
5362 return {
5463 userContribution : userContributionRef . child ( context . params . groupId ) . set ( data ) ,
5564 groupUsers : groupUsersRef . child ( context . params . userId ) . set ( true ) ,
65+ totalTaskContributionCount : totalTaskContributionCountRef . transaction ( ( currentCount ) => { return currentCount + numberOfTasks } ) ,
66+ taskContributionCount : taskContributionCountRef . transaction ( ( currentCount ) => { return currentCount + numberOfTasks } )
5667 }
5768 }
5869 } )
5970 promises . push ( updateValues . userContribution )
6071 promises . push ( updateValues . groupUsers )
72+ promises . push ( updateValues . totalTaskContributionCount )
73+ promises . push ( updateValues . taskContributionCount )
74+
6175} )
6276
6377
@@ -71,8 +85,8 @@ exports.groupFinishedCountUpdater = functions.database.ref('/v2/groupsUsers/{pro
7185 const groupVerificationNumberRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/verificationNumber' )
7286
7387 // these references/values will be updated by this function
74- const groupFinishedCountRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/finishedCountNew ' )
75- const groupRequiredCountRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/requiredCountNew ' )
88+ const groupFinishedCountRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/finishedCount ' )
89+ const groupRequiredCountRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/requiredCount ' )
7690
7791 /*
7892 Set group finished count based on number of users that finished this group.
@@ -113,149 +127,27 @@ exports.groupFinishedCountUpdater = functions.database.ref('/v2/groupsUsers/{pro
113127} )
114128
115129
116-
117-
118130/*
119131
120132OLD CODE
121133
134+ We first adjust the functions to return null.
135+ Then we have to manually delete the functions from firebase.
136+ Finally, we can remove the code below.
137+
122138*/
123139
124140
125141// Increments or decrements various counters of User and Group once new reults are pushed.
126142// Gets triggered when new results of a group are written to the database.
127143exports . resultCounter = functions . database . ref ( '/v2/results/{projectId}/{groupId}/{userId}/' ) . onCreate ( ( snapshot , context ) => {
128- const promises = [ ] // List of promises to return
129- const result = snapshot . val ( )
130-
131- // if result ref does not contain all required attributes we don't updated counters
132- // e.g. due to some error when uploading from client
133- if ( ! result . hasOwnProperty ( 'results' ) ) {
134- console . log ( 'no results attribute for ' + snapshot . ref )
135- console . log ( 'will not update counters' )
136- return null
137- } else if ( ! result . hasOwnProperty ( 'endTime' ) ) {
138- console . log ( 'no endTime attribute for ' + snapshot . ref )
139- console . log ( 'will not update counters' )
140- return null
141- } else if ( ! result . hasOwnProperty ( 'startTime' ) ) {
142- console . log ( 'no startTime attribute for ' + snapshot . ref )
143- console . log ( 'will not update counters' )
144- return null
145- }
146-
147- // Firebase Realtime Database references
148- const groupRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId )
149- const userRef = admin . database ( ) . ref ( '/v2/users/' + context . params . userId )
150- const userContributionRef = userRef . child ( 'contributions/' + context . params . projectId )
151-
152- // Counter for User contributions across Projects
153- const totalGroupContributionCount = userRef . child ( 'groupContributionCount' ) . transaction ( ( currentCount ) => {
154- return currentCount + 1
155- } ) ;
156- promises . push ( totalGroupContributionCount )
157-
158- const totalTaskContributionCount = groupRef . child ( 'numberOfTasks' ) . once ( 'value' )
159- . then ( ( dataSnapshot ) => {
160- const numberOfTasks = dataSnapshot . val ( )
161- return numberOfTasks
162- } )
163- . then ( ( numberOfTasks ) => {
164- return userRef . child ( 'taskContributionCount' ) . transaction ( ( currentCount ) => {
165- return currentCount + numberOfTasks
166- } )
167- } )
168- promises . push ( totalTaskContributionCount )
169-
170- // Counter for User contributions on a distict Project
171- const groupContributionCount = userContributionRef . child ( 'groupContributionCount' ) . transaction ( ( currentCount ) => {
172- return currentCount + 1
173- } ) ;
174- promises . push ( groupContributionCount )
175-
176- const taskContributionCount = groupRef . child ( 'numberOfTasks' ) . once ( 'value' )
177- . then ( ( dataSnapshot ) => {
178- const numberOfTasks = dataSnapshot . val ( )
179- return numberOfTasks
180- } )
181- . then ( ( numberOfTasks ) => {
182- return userContributionRef . child ( 'taskContributionCount' ) . transaction ( ( currentCount ) => {
183- return currentCount + numberOfTasks
184- } )
185- } )
186- promises . push ( taskContributionCount )
187-
188- const contributionTime = userContributionRef . child ( context . params . groupId ) . once ( 'value' )
189- . then ( ( dataSnapshot ) => {
190- if ( dataSnapshot . exists ( ) ) {
191- console . log ( 'group contribution exists already. user: ' + context . params . userId + ' project: ' + context . params . projectId + ' group: ' + context . params . groupId )
192- return null
193- }
194- else {
195- const data = {
196- 'startTime' : result [ 'startTime' ] ,
197- 'endTime' : result [ 'endTime' ]
198- }
199- return userContributionRef . child ( context . params . groupId ) . set ( data )
200- }
201- } )
202- promises . push ( contributionTime )
203-
204- // Counter for Group
205- const groupFinishedCount = groupRef . child ( 'finishedCount' ) . transaction ( ( currentCount ) => {
206- return currentCount + 1
207- } )
208- promises . push ( groupFinishedCount )
209-
210- const groupRequiredCount = groupRef . child ( 'requiredCount' ) . transaction ( ( currentCount ) => {
211- return currentCount - 1
212- } )
213- promises . push ( groupRequiredCount )
214-
215- // // TODO: Does not work
216- // const startTimeRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/startTime')
217- // const endTimeRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/endTime')
218- // const timeSpentMappingRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/timeSpentMappingRef')
219- //
220- // const timeSpentMapping = timeSpentMappingRef.set((timeSpentMapping) => {
221- // const startTime = startTimeRef.once('value')
222- // .then((startTimePromise) => {
223- // return startTimePromise.val()
224- // })
225- // const endTime = endTimeRef.once('value')
226- // .then((endTimePromise) => {
227- // return endTimePromise.val()
228- // })
229- // const time = Promise.all([startTime, endTime])
230- // .then((values) => {
231- // return JSON.parse(JSON.stringify(Date.parse(values[1]) - Date.parse(values[0])))
232- // })
233- // return time
234- // })
235- // promises.push(timeSpentMapping)
236-
237- return Promise . all ( promises )
144+ return null
238145} )
239146
240147// Counters to keep track of contributors and project contributions of Project and User.
241148// Gets triggered when User contributes to new project.
242149exports . contributionCounter = functions . database . ref ( '/v2/users/{userId}/contributions/{projectId}/' ) . onCreate ( ( snapshot , context ) => {
243- const promises_2 = [ ]
244- // Firebase Realtime Database references
245- const contributorCountRef = admin . database ( ) . ref ( '/v2/projects/' + context . params . projectId + '/contributorCount' )
246- const projectContributionCountRef = admin . database ( ) . ref ( '/v2/users/' + context . params . userId + '/projectContributionCount' )
247-
248- const projectContributionCount = projectContributionCountRef . transaction ( ( currentCount ) => {
249- return currentCount + 1
250- } )
251- promises_2 . push ( projectContributionCount )
252-
253- const contributorCount = contributorCountRef . transaction ( ( currentCount ) => {
254- return currentCount + 1
255- } )
256- promises_2 . push ( contributorCount )
257-
258- return Promise . all ( promises_2 )
150+ return null
259151} )
260152
261153// Increment project.resultCount by group.numberOfTasks.
@@ -266,124 +158,27 @@ exports.contributionCounter = functions.database.ref('/v2/users/{userId}/contrib
266158//
267159// Gets triggered when group.requiredCount gets changed
268160exports . projectCounter = functions . database . ref ( '/v2/groups/{projectId}/{groupId}/requiredCount/' ) . onUpdate ( ( groupRequiredCount , context ) => {
269- const groupNumberOfTasksRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/numberOfTasks' )
270- const projectResultCountRef = admin . database ( ) . ref ( '/v2/projects/' + context . params . projectId + '/resultCount' )
271- const projectRequiredResultsRef = admin . database ( ) . ref ( '/v2/projects/' + context . params . projectId + '/requiredResults' )
272-
273- // if requiredCount ref does not contain any data do nothing
274- if ( ! groupRequiredCount . after . exists ( ) ) {
275- return null
276- }
277-
278- if ( groupRequiredCount . after . val ( ) < groupRequiredCount . before . val ( ) && groupRequiredCount . after . val ( ) >= 0 ) {
279- projectResultCount = groupNumberOfTasksRef . once ( 'value' )
280- . then ( ( dataSnapshot ) => {
281- const groupNumberOfTasks = dataSnapshot . val ( )
282- return groupNumberOfTasks
283- } )
284- . then ( ( groupNumberOfTasks ) => {
285- return projectResultCountRef . transaction ( ( currentCount ) => {
286- return currentCount + groupNumberOfTasks
287- } )
288- } )
289- return projectResultCount
290- }
291- else if ( groupRequiredCount . after . val ( ) > groupRequiredCount . before . val ( ) && groupRequiredCount . after . val ( ) >= 0 ) {
292- projectResultCount = groupNumberOfTasksRef . once ( 'value' )
293- . then ( ( dataSnapshot ) => {
294- const groupNumberOfTasks = dataSnapshot . val ( )
295- return groupNumberOfTasks
296- } )
297- . then ( ( groupNumberOfTasks ) => {
298- return projectRequiredResultsRef . transaction ( ( currentCount ) => {
299- return currentCount + groupNumberOfTasks
300- } )
301- } )
302- return projectResultCount
303- }
304- else {
305- console . log ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/requiredCount/ < 0 or got updated but value did not change: Group progress will not be recalculated' )
306- return null
307- }
161+ return null
308162} )
309163
310164// Calculates group.progress
311165//
312166// Gets triggered when group.requiredCount gets changed
313167exports . calcGroupProgress = functions . database . ref ( '/v2/groups/{projectId}/{groupId}/requiredCount/' ) . onUpdate ( ( groupRequiredCount , context ) => {
314-
315- const groupFinishedCountRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/finishedCount' )
316- const groupProgressRef = admin . database ( ) . ref ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/progress' )
317-
318- // if requiredCount ref does not contain any data do nothing
319- if ( ! groupRequiredCount . after . exists ( ) ) {
320- return null
321- }
322- groupRequiredCount = groupRequiredCount . after . val ( )
323- if ( groupRequiredCount >= 0 ) {
324- groupProgress = groupFinishedCountRef . once ( 'value' )
325- . then ( ( dataSnapshot ) => {
326- return dataSnapshot . val ( )
327- } )
328- . then ( ( groupFinishedCount ) => {
329- return groupProgressRef . transaction ( ( ) => {
330- return Math . floor ( groupFinishedCount / ( groupFinishedCount + groupRequiredCount ) * 100 )
331- } )
332- } )
333- return groupProgress
334- }
335- else {
336- console . log ( '/v2/groups/' + context . params . projectId + '/' + context . params . groupId + '/requiredCount/ < 0: Group progress will not be recalculated' )
337- return null
338- }
168+ return null
339169} )
340170
341171// Calculates project.progress
342172//
343173// Gets triggered when project.resultCount gets changed.
344174exports . incProjectProgress = functions . database . ref ( '/v2/projects/{projectId}/resultCount/' ) . onUpdate ( ( projectResultCount , context ) => {
345- const projectRequiredResultsRef = admin . database ( ) . ref ( '/v2/projects/' + context . params . projectId + '/requiredResults' )
346- const projectProgressRef = admin . database ( ) . ref ( '/v2/projects/' + context . params . projectId + '/progress' )
347-
348- // if requiredCount ref does not contain any data do nothing
349- if ( ! projectResultCount . after . exists ( ) ) {
350- return null
351- }
352- projectResultCount = projectResultCount . after . val ( )
353- projectProgress = projectRequiredResultsRef . once ( 'value' )
354- . then ( ( dataSnapshot ) => {
355- return dataSnapshot . val ( )
356- } )
357- . then ( ( projectRequiredResults ) => {
358- return projectProgressRef . transaction ( ( ) => {
359- return Math . floor ( parseFloat ( projectResultCount ) / parseFloat ( projectRequiredResults ) * 100 )
360- } )
361- } )
362- return projectProgress
175+ return null
363176} )
364177
365178// Calculates project.progress
366179// Almost the same function as the previous one
367180//
368181// Gets triggered when project.requiredResults gets changed.
369182exports . decProjectProgress = functions . database . ref ( '/v2/projects/{projectId}/requiredResults/' ) . onUpdate ( ( projectRequiredResults , context ) => {
370-
371- const projectResultCountRef = admin . database ( ) . ref ( '/v2/projects/' + context . params . projectId + '/resultCount' )
372- const projectProgressRef = admin . database ( ) . ref ( '/v2/projects/' + context . params . projectId + '/progress' )
373-
374- // if requiredCount ref does not contain any data do nothing
375- if ( ! projectRequiredResults . after . exists ( ) ) {
376183 return null
377- }
378- projectRequiredResults = projectRequiredResults . after . val ( )
379- projectProgress = projectResultCountRef . once ( 'value' )
380- . then ( ( dataSnapshot ) => {
381- return dataSnapshot . val ( )
382- } )
383- . then ( ( projectResultCount ) => {
384- return projectProgressRef . transaction ( ( ) => {
385- return Math . floor ( parseFloat ( projectResultCount ) / parseFloat ( projectRequiredResults ) * 100 )
386- } )
387- } )
388- return projectProgress
389184} )
0 commit comments