как добавить ответ sendgrid webhook Json в облачную базу Firebase, используя node.js - PullRequest
0 голосов
/ 13 февраля 2020

Я понятия не имею, как реализовать эту вещь, но до этого я сделал часть SendGrid, где создается любой документ, затем он отправит электронное письмо пользователю. но в этой части, о которой я спрашиваю, я понятия не имею, как поступить. Это моя первая часть этой реализации, в которой любая коллекция, если создается новая запись, отправляет электронное письмо на конкретное электронное письмо, и есть ответ, который называется Event Object I хочу написать облачную функцию для хранения данных. и я не знаю, как запустить эту функцию или продолжить эту проблему.

"use strict";
const functions = require("firebase-functions");
const admin = require("firebase-admin");

var serviceAccount1 = require("./key.json");

const newProject = admin.initializeApp({
  credential: admin.credential.cert(serviceAccount1),
  databaseURL: "xyz"
});
const sgMail = require("@sendgrid/mail");
const sgMailKey = "key";
sgMail.setApiKey(sgMailKey);


 exports.sentMail = functions.firestore
  .document("/Offices/{officeId}")
  .onCreate((documentSnapshot,event) => {
    const documentData = documentSnapshot.data()
    const officeID = event.params.officeId;
    console.log(JSON.stringify(event))
    const db = newProject.firestore();
    return db.collection("Offices").doc(officeID).get()
      .then(doc => {
        const data = doc.data();
        const msg = {
          to: "amarjeetkumars34@gmail.com",
          from: "singhamarjeet045@gmail.com",
          text: "hello from this side",
          templateId: "d-8ecfa59aa9d2434eb8b7d47d58b4f2cf",
          substitutionWrappers: ["{{", "}}"],
          substitutions: {
            name: data.name
          }
        };
        return sgMail.send(msg);
      })
      .then(() => console.log("payment mail sent success"))
      .catch(err => console.log(err));
  });

и ожидаемый результат моего вопроса будет похож на имя коллекции XYZ, в котором у объекта есть три поля, такие как

{email:"xyz@gmail.com",
event:"processed",
timestamp:123555558855},
{email:"xyz@gmail.com",
event:"recieved",
timestamp:123555558855},
{email:"xyz@gmail.com",
event:"open",
timestamp:123555558855}

1 Ответ

1 голос
/ 14 февраля 2020

Как вы прочтете в документации Sendgrid :

EventGhog SendGrid будет уведомлять URL-адрес по вашему выбору через HTTP POST с информацией о событиях, которые происходят, когда SendGrid обрабатывает ваш электронная почта

Чтобы реализовать конечную точку HTTP в своем проекте Firebase, вы реализуете Облачная функция HTTPS , которая будет вызываться веб-крючком Sendgrid через запрос POST HTTPS.

Каждый вызов из веб-крючка Sendgrid будет касаться определенного c события , и вы сможете в своей облачной функции получить значение события (processed, delivered, et c ...).

Теперь вам необходимо в облачной функции связать указанное событие c с указанным c электронным письмом, которое ранее было отправлено через вашу облачную функцию. Для этого вы должны использовать пользовательских аргументов .

Точнее, вы добавили бы к вашему msg объекту (который вы передаете методу send()) уникальный идентификатор. Классическим значением является идентификатор документа Firestore, например event.params.officeId, но может быть любой другой уникальный идентификатор, который вы генерируете в своей облачной функции.


Пример реализации

в вашей облачной функции при отправке электронного письма, передайте officeId в объекте custom_args, как показано ниже:

 exports.sentMail = functions.firestore
  .document("/Offices/{officeId}")
  .onCreate((documentSnapshot,event) => {

    const documentData = documentSnapshot.data();

    const officeId = event.params.officeId;

    const msg = {
          to: "amarjeetkumars34@gmail.com",
          from: "singhamarjeet045@gmail.com",
          text: "hello from this side",
          templateId: "d-8ecfa59aa9d2434eb8b7d47d58b4f2cf",
          substitutionWrappers: ["{{", "}}"],
          substitutions: {
            name: documentData.name
          },
          custom_args: {
             "officeId": officeId
          }
    };

    return sgMail.send(msg)
      .then(() => {
         console.log("payment mail sent success"));
         return null;
      })
      .catch(err => {
         console.log(err)
         return null;
      });
  });

Обратите внимание, что вы получаете данные недавно созданного документа (тот, который вызывает функцию облака) до documentSnapshot.data(): вам не нужно запрашивать тот же документ в вашей облачной функции.


Затем создайте простую HTTPS облачную функцию , как показано ниже:

exports.sendgridWebhook = functions.https.onRequest((req, res) => {
    const body = req.body; //body is an array of JavaScript objects

    const promises = [];

    body.forEach(elem => {

        const event = elem.event;
        const eventTimestamp = elem.timestamp;
        const officeId = elem.officeId;

        const updateObj = {};
        updateObj[event] = true;
        updateObj[event + 'Timestamp'] = eventTimestamp;

        promises.push(admin.firestore().collection('Offices').doc(officeId).update(updateObj));

    });

    return Promise.all(promises)
        .then(() => {
            return res.status(200).end();
        })

})

Разверните его и захватите его URL, как показано в терминале: он должен быть похож на https://us-central1-<your-project-id>.cloudfunctions.net/sendgridWebhook.

Обратите внимание, что здесь я использую admin.firestore().collection('Offices').... Вы можете использовать const db = newProject.firestore(); ... db.collection('Offices')...

Также обратите внимание, что тело запроса HTTPS POST, отправленного веб-крючком Sendgrid, содержит массив объектов JavaScript, поэтому мы будем использовать Promise.all() для обрабатывать эти различные объекты, т.е. записывать в документ Firestore различные officeId события.

Затем вам нужно настроить Webhook на платформе Sendgrid, в разделе «Настройки почты / Уведомление о событиях», как объяснено в do c и как показано ниже.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...