Использование облачной задачи и облачной функции - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать облачную задачу с облачной функцией, чтобы, когда для поля моей коллекции было установлено значение true, задание автоматически устанавливало значение false через 24 часа. Но я не очень хорошо понимаю все об использовании облачных задач и облачных функций, поэтому мне действительно нужна помощь ...

Как я могу получить значение userId функции Trigger onUpdate Cloud для отправки в Облачные функции Http, так что я могу использовать его, чтобы обновить поле Speci c, что карта?

Вот мои функции:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
const { CloudTasksClient } = require('@google-cloud/tasks');

admin.initializeApp()
    exports.onUpdateSavedPostsReUpdateItLater = functions.firestore
      .document("/saved/{userId}/savedPosts/{postId}")
      .onUpdate(async (change, context) => {
        const userId = context.params.userId;
        const postUpdate = change.after.data();
        const pStatus = postUpdate.prayers[userId]; // The field that i want to update


        updateAtSeconds = Date.now() / 1000 + 86400; //86400 equal to 24 hours, because i want my documents to be updated in the next 24 hours


        // Get the project ID from the FIREBASE_CONFIG env var
        const project = JSON.parse(process.env.FIREBASE_CONFIG!).projectId;
        const location = 'europe-west3';
        const queue = 'ijn-amen';

        const tasksClient = new CloudTasksClient();
        const queuePath: string =
          tasksClient.queuePath(project, location, queue);


        const url = 'https://${location}-${project}.cloudfunctions.net/firestoreTtlCallback';
        const docPath = change.ref.path;
        const payload: UpdateTaskPayload = { docPath };

        const task = {
          httpRequest: {
            httpMethod: 'POST',
            url,
            body: Buffer.from(JSON.stringify(payload)).toString('base64'),
            headers: {
              'Content-Type': 'application/json',
            },
          },
          scheduleTime: {
            seconds: updateAtSeconds
          }
        };

        const [response] = await tasksClient.createTask({ parent: queuePath, task });

        console.log('Created task ${response.name}');
      });



    export const firestoreTtlCallback =
      functions.https.onRequest(async (req, res) => {
        const payload = req.body as UpdateTaskPayload
        try {
          await admin.firestore().doc(payload.docPath).update({ 'prayers.${userId}': false });
          res.send(200);
        }
        catch (error) {
          console.error(error);
          res.status(500).send(error);
        }
      });

Спасибо,

...