Search code examples
javascriptreactjsfirebasefirebase-realtime-databasemultipath

Firebase Multi path atomic update with child values?


I am succesfully updating my user's profile picture on their profile and on all of their reviews posted with this function:

export const storeUserProfileImage = (url) => {
    const { currentUser } = firebase.auth();

        firebase.database().ref(`/users/${currentUser.uid}/profilePic`)
        .update({ url });

        firebase.database().ref('reviews')
          .orderByChild('username')
          .equalTo('User3')
          .once('value', (snapshot) => {
            snapshot.forEach((child) => {
              child.ref.update({ profilePic: url });
            });
        });
  };

I am aware that I should be using an atomic update to do this so the data updates at the same time (in case a user leaves the app or something else goes wrong). I am confused on how I can accomplish this when querying over child values.

Any help or guidance would be greatly appreciated!


Solution

  • Declare a variable to store all the updates. Add the updates as you read them on your listener's loop. When the loop is finished, run the atomic update.

    export const storeUserProfileImage = (url) => {
        const { currentUser } = firebase.auth();
    
            firebase.database().ref('reviews')
              .orderByChild('username')
              .equalTo('User3')
              .once('value', (snapshot) => {
    
                var updates = {};
                updates[`/users/${currentUser.uid}/profilePic`] = url;
    
                snapshot.forEach((child) => {
                  updates[`/reviews/${child.key}/profilePic`] = url;
                });
    
                firebase.database().ref().update(updates);
    
            });
    };