andrewedgar
andrewedgar

Reputation: 877

Getting document not a function

I am attempting to retrieve the boolean child (notificationsOn) of an object stored as a Firestore document to see if the rest of a function should be executed.

The overall function works to completion without this portion, but adding the portion from let threadDoc to the if statement presents a "threadDoc.get is not a function" error. I think my syntax is wrong but I don't know how, as a similar function works in a later part of the function:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();

exports.sendDMNotification =functions.firestore.document('/dm_threads/{thread_id}/messages/{message_id}').onCreate((snapshot, context) => {


    const newMessage = snapshot.data();

    const senderName = newMessage.authorName;
    const senderID = newMessage.authorUID;
    const messageText = newMessage.message;
    const recipientID = newMessage.recipientUID;
    var notificationsOn = null;

    let deviceTokenQuery = admin.firestore().collection(`/users/${recipientID}/device_tokens/`);

    var idsToBeSorted = [senderID, recipientID];
    idsToBeSorted.sort();
    var threadID = idsToBeSorted[0] + idsToBeSorted[1];


    console.log(recipientID);
    console.log(threadID);


    let threadDoc = admin.firestore().document(`users/${recipientID}/threads/${threadID}/`);

    return threadDoc.get().then(doc => {

        let notificationsOn = doc.data.notificationsOn;
        console.log(notificationsOn);


        if (notificationsOn !== false){


            return deviceTokenQuery.get().then(querySnapshot => {

                let tokenShapshot = querySnapshot.docs;

                const notificationPromises = tokenShapshot.map(doc => {


                    let token_id = doc.data().tokenID;


                    const payload = {

                        data: {

                            title: senderName,
                            body: messageText,
                            senderID: senderID,
                            senderName: senderName

                        }

                    };


                    return admin.messaging().sendToDevice(token_id, payload).then(response => {

                        console.log("Notification sent: ", response);
                    })
                        .catch(error => {

                            console.log("Error sending message: ", error);

                        });


                });

                return Promise.all(notificationPromises);

            });


        }

        return;

    });


});

Upvotes: 0

Views: 136

Answers (2)

andrewedgar
andrewedgar

Reputation: 877

admin.firestore().document() was supposed to be admin.firestore().collection(...).doc(...)

This fixed my problem

Upvotes: 1

Doug Stevenson
Doug Stevenson

Reputation: 317467

I think you meant to say admin.firestore() instead of functions.firestore.

Upvotes: 0

Related Questions