Skip to content

Commit eed617b

Browse files
authored
Merge pull request #426 from mapswipe/firebase-counter
Make Firebase Function code more readable
2 parents fc0b8f1 + 1ac69fd commit eed617b

File tree

1 file changed

+38
-50
lines changed

1 file changed

+38
-50
lines changed

firebase/functions/index.js

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,84 +5,70 @@ const functions = require('firebase-functions')
55
const admin = require('firebase-admin')
66
admin.initializeApp()
77

8-
// Increments or Decrements various counter
9-
//
10-
// Gets triggered when new results of the group are written to the database.
11-
exports.counter = functions.database.ref('/v2/results/{projectId}/{groupId}/{userId}/').onCreate((snapshot, context) => {
12-
const promises = []
8+
// Increments or decrements various counters of User and Group once new reults are pushed.
9+
// Gets triggered when new results of a group are written to the database.
10+
exports.resultCounter = functions.database.ref('/v2/results/{projectId}/{groupId}/{userId}/').onCreate((snapshot, context) => {
11+
const promises = [] // List of promises to return
1312
const result = snapshot.val()
1413

1514
// if result ref does not contain all required attributes we don't updated counters
1615
// e.g. due to some error when uploading from client
1716
if (!result.hasOwnProperty('results')) {
18-
console.log('no results attribute for /v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId )
17+
console.log('no results attribute for ' + snapshot.ref)
1918
console.log('will not update counters')
2019
return null
2120
} else if (!result.hasOwnProperty('endTime')) {
22-
console.log('no endTime attribute for /v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId )
21+
console.log('no endTime attribute for ' + snapshot.ref)
2322
console.log('will not update counters')
2423
return null
2524
} else if (!result.hasOwnProperty('startTime')) {
26-
console.log('no startTime attribute for /v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId )
25+
console.log('no startTime attribute for ' + snapshot.ref)
2726
console.log('will not update counters')
2827
return null
2928
}
3029

31-
3230
// Firebase Realtime Database references
33-
const groupFinishedCountRef = admin.database().ref('/v2/groups/'+context.params.projectId+'/'+context.params.groupId+'/finishedCount')
34-
const groupRequiredCountRef = admin.database().ref('/v2/groups/'+context.params.projectId+'/'+context.params.groupId+'/requiredCount')
35-
const numberOfTasksRef = admin.database().ref('/v2/groups/'+context.params.projectId+'/'+context.params.groupId+'/numberOfTasks')
36-
37-
const taskContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/taskContributionCount')
38-
const groupContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/groupContributionCount')
39-
const projectContributionsRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId)
40-
const groupContributionsRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId +'/'+context.params.groupId)
41-
const projectTaskContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId+'/taskContributionCount')
42-
const projectGroupContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/contributions/'+context.params.projectId+'/groupContributionCount')
43-
const totalTimeSpentMappingRef = admin.database().ref('/v2/users/'+context.params.userId+'/timeSpentMapping')
31+
const groupRef = admin.database().ref('/v2/groups/' + context.params.projectId + '/' + context.params.groupId)
32+
const userRef = admin.database().ref('/v2/users/' + context.params.userId)
33+
const userContributionRef = userRef.child('contributions/' + context.params.projectId)
4434

45-
const startTimeRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/startTime')
46-
const endTimeRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/endTime')
47-
const timeSpentMappingRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/timeSpentMappingRef')
48-
49-
// Counter for users
50-
const groupContributionCount = groupContributionCountRef.transaction((currentCount) => {
35+
// Counter for User contributions across Projects
36+
const totalGroupContributionCount = userRef.child('groupContributionCount').transaction((currentCount) => {
5137
return currentCount + 1
5238
});
53-
promises.push(groupContributionCount)
39+
promises.push(totalGroupContributionCount)
5440

55-
const taskContributionCount = numberOfTasksRef.once('value')
41+
const totalTaskContributionCount = groupRef.child('numberOfTasks').once('value')
5642
.then((dataSnapshot) => {
5743
const numberOfTasks = dataSnapshot.val()
5844
return numberOfTasks
5945
})
6046
.then((numberOfTasks) => {
61-
return taskContributionCountRef.transaction((currentCount) => {
47+
return userRef.child('taskContributionCount').transaction((currentCount) => {
6248
return currentCount + numberOfTasks
6349
})
6450
})
65-
promises.push(taskContributionCount)
51+
promises.push(totalTaskContributionCount)
6652

67-
// Counters for tasks and groups per user and per project
68-
const projectGroupContributionCount = projectGroupContributionCountRef.transaction((currentCount) => {
53+
// Counter for User contributions on a distict Project
54+
const groupContributionCount = userContributionRef.child('groupContributionCount').transaction((currentCount) => {
6955
return currentCount + 1
7056
});
71-
promises.push(projectGroupContributionCount)
57+
promises.push(groupContributionCount)
7258

73-
const projectTaskContributionCount = numberOfTasksRef.once('value')
59+
const taskContributionCount = groupRef.child('numberOfTasks').once('value')
7460
.then((dataSnapshot) => {
7561
const numberOfTasks = dataSnapshot.val()
7662
return numberOfTasks
7763
})
7864
.then((numberOfTasks) => {
79-
return projectTaskContributionCountRef.transaction((currentCount) => {
65+
return userContributionRef.child('taskContributionCount').transaction((currentCount) => {
8066
return currentCount + numberOfTasks
8167
})
8268
})
83-
promises.push(projectTaskContributionCount)
69+
promises.push(taskContributionCount)
8470

85-
const contributions = groupContributionsRef.once('value')
71+
const contributionTime = userContributionRef.child(context.params.groupId).once('value')
8672
.then((dataSnapshot) => {
8773
if (dataSnapshot.exists()) {
8874
return null
@@ -92,23 +78,27 @@ exports.counter = functions.database.ref('/v2/results/{projectId}/{groupId}/{use
9278
'startTime': result['startTime'],
9379
'endTime': result['endTime']
9480
}
95-
return groupContributionsRef.set(data)
81+
return userContributionRef.child(context.params.groupId).set(data)
9682
}
9783
})
98-
promises.push(contributions)
84+
promises.push(contributionTime)
9985

100-
// Counter for groups
101-
const groupFinishedCount = groupFinishedCountRef.transaction((currentCount) => {
86+
// Counter for Group
87+
const groupFinishedCount = groupRef.child('finishedCount').transaction((currentCount) => {
10288
return currentCount + 1
10389
})
10490
promises.push(groupFinishedCount)
10591

106-
const groupRequiredCount = groupRequiredCountRef.transaction((currentCount) => {
92+
const groupRequiredCount = groupRef.child('requiredCount').transaction((currentCount) => {
10793
return currentCount - 1
10894
})
10995
promises.push(groupRequiredCount)
11096

11197
// // TODO: Does not work
98+
// const startTimeRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/startTime')
99+
// const endTimeRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/endTime')
100+
// const timeSpentMappingRef = admin.database().ref('/v2/results/'+context.params.projectId+'/'+context.params.groupId+'/'+context.params.userId+'/timeSpentMappingRef')
101+
//
112102
// const timeSpentMapping = timeSpentMappingRef.set((timeSpentMapping) => {
113103
// const startTime = startTimeRef.once('value')
114104
// .then((startTimePromise) => {
@@ -129,10 +119,10 @@ exports.counter = functions.database.ref('/v2/results/{projectId}/{groupId}/{use
129119
return Promise.all(promises)
130120
})
131121

132-
133-
exports.counter_2 = functions.database.ref('/v2/users/{userId}/contributions/{projectId}/').onCreate((snapshot, context) => {
122+
// Counters to keep track of contributors and project contributions of Project and User.
123+
// Gets triggered when User contributes to new project.
124+
exports.contributionCounter = functions.database.ref('/v2/users/{userId}/contributions/{projectId}/').onCreate((snapshot, context) => {
134125
const promises_2 = []
135-
136126
// Firebase Realtime Database references
137127
const contributorCountRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/contributorCount')
138128
const projectContributionCountRef = admin.database().ref('/v2/users/'+context.params.userId+'/projectContributionCount')
@@ -150,8 +140,6 @@ exports.counter_2 = functions.database.ref('/v2/users/{userId}/contributions/{pr
150140
return Promise.all(promises_2)
151141
})
152142

153-
154-
155143
// Increment project.resultCount by group.numberOfTasks.
156144
// Or (Depending of increase or decrease of group.RequiredCount)
157145
// Increment project.resultCount by group.numberOfTasks
@@ -162,7 +150,7 @@ exports.counter_2 = functions.database.ref('/v2/users/{userId}/contributions/{pr
162150
exports.projectCounter = functions.database.ref('/v2/groups/{projectId}/{groupId}/requiredCount/').onUpdate((groupRequiredCount, context) => {
163151
const groupNumberOfTasksRef = admin.database().ref('/v2/groups/'+context.params.projectId+'/'+context.params.groupId+'/numberOfTasks')
164152
const projectResultCountRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/resultCount')
165-
const projectRequiredResultsRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/requiredResults')
153+
const projectRequiredResultsRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/requiredResults')
166154

167155
// if requiredCount ref does not contain any data do nothing
168156
if (!groupRequiredCount.after.exists()) {
@@ -237,7 +225,7 @@ exports.calcGroupProgress = functions.database.ref('/v2/groups/{projectId}/{grou
237225
// Gets triggered when project.resultCount gets changed.
238226
exports.incProjectProgress = functions.database.ref('/v2/projects/{projectId}/resultCount/').onUpdate((projectResultCount, context) => {
239227
const projectRequiredResultsRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/requiredResults')
240-
const projectProgressRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/progress')
228+
const projectProgressRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/progress')
241229

242230
// if requiredCount ref does not contain any data do nothing
243231
if (!projectResultCount.after.exists()) {
@@ -263,7 +251,7 @@ exports.incProjectProgress = functions.database.ref('/v2/projects/{projectId}/re
263251
exports.decProjectProgress = functions.database.ref('/v2/projects/{projectId}/requiredResults/').onUpdate((projectRequiredResults, context) => {
264252

265253
const projectResultCountRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/resultCount')
266-
const projectProgressRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/progress')
254+
const projectProgressRef = admin.database().ref('/v2/projects/'+context.params.projectId+'/progress')
267255

268256
// if requiredCount ref does not contain any data do nothing
269257
if (!projectRequiredResults.after.exists()) {

0 commit comments

Comments
 (0)