Skip to content

Commit 87763e5

Browse files
committed
firebase functions work now
1 parent 018ef9e commit 87763e5

File tree

1 file changed

+27
-232
lines changed

1 file changed

+27
-232
lines changed

firebase/functions/index.js

Lines changed: 27 additions & 232 deletions
Original file line numberDiff line numberDiff line change
@@ -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
120132
OLD 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.
127143
exports.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.
242149
exports.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
268160
exports.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
313167
exports.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.
344174
exports.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.
369182
exports.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

Comments
 (0)