Aakash Dave
Aakash Dave

Reputation: 896

Query into firebase realtime database through functions

I am using firebase functions and Admin SDK to implement a functions on a event trigger. I am trying to push a notification to user when a new update is available. So, when the update version changes from the current, I want to make some changes in the user object and set update_available key as true

Now, the location of event(update_version) that is being tracked and the data to be changed are in to completely different objects. The Object model is as follows:

|root
  |- app_info
        |- version

  |- users
        |- <uid>
            |- checker
                  |- update_available: true

Not so far I have achieved this :

 function setUpdateValueTrue() {
    db.ref().orderByChild("checker/update_available").equalTo("false").once('value', (snapshot) => {
        snapshot.forEach((childSnapshot) => {
          console.log("got in here");
          console.log(childSnapshot.val())
      });
   })
 }

I guess this maybe completely wrong. At the moment i feel stuck. Any help is really appreciated. My major concern is how to I bypass the uid or query through it.

Upvotes: 0

Views: 66

Answers (1)

Renaud Tarnec
Renaud Tarnec

Reputation: 83048

The following should work (not tested however).

Note the use of Promise.all(), since you need to update a variable number of users nodes in parallel.

exports.versionUpdate = functions.database.ref('/app_info').onUpdate((change, context) => {
    const beforeData = change.before.val(); // data before the update
    const afterData = change.after.val(); // data after the update

    if (beforeData.version !== afterData.version) {

       const promises = [];
       const usersRef = admin.database().ref('/users');

       return usersRef.once('value', function(snapshot) {
          snapshot.forEach(childSnapshot => {
             const uid = childSnapshot.key;
             promises.push(usersRef.child(uid + '/checker/update_available').set(true));
          });
          return Promise.all(promises);
       });

   } else {
      return null;
   }

});

Upvotes: 1

Related Questions