@@ -30,7 +30,7 @@ exports.osmAuth.token = functions.https.onRequest((req, res) => {
3030
3131 This function also writes to the `contributions` section in the user profile.
3232*/
33- exports . groupUsersCounter = functions . database . ref ( '/v2/results/{projectId}/{groupId}/{userId}/' ) . onCreate ( ( snapshot , context ) => {
33+ exports . groupUsersCounter = functions . database . ref ( '/v2/results/{projectId}/{groupId}/{userId}/' ) . onCreate ( async ( snapshot , context ) => {
3434 // these references/values will be updated by this function
3535 const groupUsersRef = admin . database ( ) . ref ( '/v2/groupsUsers/' + context . params . projectId + '/' + context . params . groupId ) ;
3636 const userRef = admin . database ( ) . ref ( '/v2/users/' + context . params . userId ) ;
@@ -53,6 +53,30 @@ exports.groupUsersCounter = functions.database.ref('/v2/results/{projectId}/{gro
5353 }
5454
5555 const result = snapshot . val ( ) ;
56+
57+
58+ // New versions of app will have the appVersion defined (> 2.2.5)
59+ // appVersion: 2.2.5 (14)-dev
60+ const appVersionString = result . appVersion as string | undefined | null ;
61+
62+ // Check if the app is of older version
63+ // (no need to check for specific version since old app won't sent the version info)
64+ if ( appVersionString === null || appVersionString === undefined || appVersionString . trim ( ) === '' ) {
65+ const projectRef = admin . database ( ) . ref ( `/v2/projects/${ context . params . projectId } ` ) ;
66+ const dataSnapshot = await projectRef . once ( 'value' ) ;
67+
68+ if ( dataSnapshot . exists ( ) ) {
69+ const project = dataSnapshot . val ( ) ;
70+ // Check if project type is footprint and also has
71+ // custom options (i.e. these are new type of projects)
72+ if ( project . projectType === 2 && project . customOptions ) {
73+ // We remove the results submitted from older version of app (< v2.2.6)
74+ console . info ( `Result submitted for ${ context . params . projectId } was discarded: submitted from older version of app` ) ;
75+ return thisResultRef . remove ( ) ;
76+ }
77+ }
78+ }
79+
5680 // if result ref does not contain all required attributes we don't updated counters
5781 // e.g. due to some error when uploading from client
5882 if ( ! Object . prototype . hasOwnProperty . call ( result , 'results' ) ) {
@@ -90,77 +114,72 @@ exports.groupUsersCounter = functions.database.ref('/v2/results/{projectId}/{gro
90114 Update overall taskContributionCount and project taskContributionCount in the user profile
91115 based on the number of results submitted and the existing count values.
92116 */
93- return groupUsersRef . child ( context . params . userId ) . once ( 'value' )
94- . then ( ( dataSnapshot ) => {
95- if ( dataSnapshot . exists ( ) ) {
96- console . log ( 'group contribution exists already. user: ' + context . params . userId + ' project: ' + context . params . projectId + ' group: ' + context . params . groupId ) ;
97- return null ;
98- }
99- const latestNumberOfTasks = Object . keys ( result [ 'results' ] ) . length ;
100-
101- return Promise . all ( [
102- userContributionRef . child ( context . params . groupId ) . set ( true ) ,
103- groupUsersRef . child ( context . params . userId ) . set ( true ) ,
104- totalTaskContributionCountRef . transaction ( ( currentCount ) => {
105- return currentCount + latestNumberOfTasks ;
106- } ) ,
107- totalGroupContributionCountRef . transaction ( ( currentCount ) => {
108- return currentCount + 1 ;
109- } ) ,
110- taskContributionCountRef . transaction ( ( currentCount ) => {
111- return currentCount + latestNumberOfTasks ;
112- } ) ,
113-
114- // Tag userGroups of the user in the result
115- // eslint-disable-next-line promise/no-nesting
116- userRef . child ( 'userGroups' ) . once ( 'value' ) . then ( ( userGroupsOfTheUserSnapshot ) => {
117- if ( ! userGroupsOfTheUserSnapshot . exists ( ) ) {
118- return null ;
119- }
120-
121- // eslint-disable-next-line promise/no-nesting
122- return userGroupsRef . once ( 'value' ) . then ( ( allUserGroupsSnapshot ) => {
123- if ( ! allUserGroupsSnapshot . exists ( ) ) {
124- return null ;
125- }
126-
127- const userGroupsOfTheUserKeyList = Object . keys ( userGroupsOfTheUserSnapshot . val ( ) ) ;
128- if ( userGroupsOfTheUserKeyList . length <= 0 ) {
129- return null ;
130- }
131-
132- const allUserGroups = allUserGroupsSnapshot . val ( ) ;
133- const nonArchivedUserGroupKeys = userGroupsOfTheUserKeyList . filter ( ( key ) => {
134- const currentUserGroup = allUserGroups [ key ] ;
135-
136- // User might have joined some group that was removed but not cleared from their list
137- if ( ! currentUserGroup ) {
138- return false ;
139- }
140-
141- // Skip groups that have been archived
142- if ( currentUserGroup . archivedAt ) {
143- return false ;
144- }
145-
146- return true ;
147- } ) ;
148-
149- if ( nonArchivedUserGroupKeys . length === 0 ) {
150- return null ;
151- }
152-
153- const nonArchivedUserGroupsOfTheUser = nonArchivedUserGroupKeys . reduce ( ( acc , val ) => {
154- acc [ val ] = true ;
155- return acc ;
156- } , { } as Record < string , boolean > ) ;
157-
158- // Include userGroups of the user in the results
159- return thisResultRef . child ( 'userGroups' ) . set ( nonArchivedUserGroupsOfTheUser ) ;
160- } ) ;
161- } ) ,
162- ] ) ;
163- } ) ;
117+ const dataSnapshot = await groupUsersRef . child ( context . params . userId ) . once ( 'value' ) ;
118+ if ( dataSnapshot . exists ( ) ) {
119+ console . log ( 'group contribution exists already. user: ' + context . params . userId + ' project: ' + context . params . projectId + ' group: ' + context . params . groupId ) ;
120+ return null ;
121+ }
122+
123+ const latestNumberOfTasks = Object . keys ( result [ 'results' ] ) . length ;
124+ await Promise . all ( [
125+ userContributionRef . child ( context . params . groupId ) . set ( true ) ,
126+ groupUsersRef . child ( context . params . userId ) . set ( true ) ,
127+ totalTaskContributionCountRef . transaction ( ( currentCount ) => {
128+ return currentCount + latestNumberOfTasks ;
129+ } ) ,
130+ totalGroupContributionCountRef . transaction ( ( currentCount ) => {
131+ return currentCount + 1 ;
132+ } ) ,
133+ taskContributionCountRef . transaction ( ( currentCount ) => {
134+ return currentCount + latestNumberOfTasks ;
135+ } ) ,
136+ ] ) ;
137+
138+
139+ // Tag userGroups of the user in the result
140+ const userGroupsOfTheUserSnapshot = await userRef . child ( 'userGroups' ) . once ( 'value' ) ;
141+ if ( ! userGroupsOfTheUserSnapshot . exists ( ) ) {
142+ return null ;
143+ }
144+
145+ const allUserGroupsSnapshot = await userGroupsRef . once ( 'value' ) ;
146+ if ( ! allUserGroupsSnapshot . exists ( ) ) {
147+ return null ;
148+ }
149+
150+ const userGroupsOfTheUserKeyList = Object . keys ( userGroupsOfTheUserSnapshot . val ( ) ) ;
151+ if ( userGroupsOfTheUserKeyList . length <= 0 ) {
152+ return null ;
153+ }
154+
155+ const allUserGroups = allUserGroupsSnapshot . val ( ) ;
156+ const nonArchivedUserGroupKeys = userGroupsOfTheUserKeyList . filter ( ( key ) => {
157+ const currentUserGroup = allUserGroups [ key ] ;
158+
159+ // User might have joined some group that was removed but not cleared from their list
160+ if ( ! currentUserGroup ) {
161+ return false ;
162+ }
163+
164+ // Skip groups that have been archived
165+ if ( currentUserGroup . archivedAt ) {
166+ return false ;
167+ }
168+
169+ return true ;
170+ } ) ;
171+
172+ if ( nonArchivedUserGroupKeys . length === 0 ) {
173+ return null ;
174+ }
175+
176+ const nonArchivedUserGroupsOfTheUser = nonArchivedUserGroupKeys . reduce ( ( acc , val ) => {
177+ acc [ val ] = true ;
178+ return acc ;
179+ } , { } as Record < string , boolean > ) ;
180+
181+ // Include userGroups of the user in the results
182+ return thisResultRef . child ( 'userGroups' ) . set ( nonArchivedUserGroupsOfTheUser ) ;
164183} ) ;
165184
166185
0 commit comments