From 075c1b4d1466dc0d2de9af543997b7c72ad8a893 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 18 Nov 2022 17:43:21 +0800 Subject: [PATCH] Fix send notification failure --- packages/api/src/services/rules.ts | 3 +- packages/notification/package.json | 1 + packages/notification/src/index.ts | 63 +++++++++++-------- packages/notification/src/sendNotification.ts | 8 ++- 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/packages/api/src/services/rules.ts b/packages/api/src/services/rules.ts index 8dafd14c2..01f76f005 100644 --- a/packages/api/src/services/rules.ts +++ b/packages/api/src/services/rules.ts @@ -77,8 +77,9 @@ export const getPubSubSubscriptionOptions = async ( } options.pushConfig = { - pushEndpoint: `${env.queue.notificationEndpoint}/${userId}?token=${env.queue.verificationToken}`, + pushEndpoint: `${env.queue.notificationEndpoint}?token=${env.queue.verificationToken}`, attributes: { + userId, filter, messages: JSON.stringify(params), tokens: JSON.stringify(deviceTokens.map((t) => t.token)), diff --git a/packages/notification/package.json b/packages/notification/package.json index 7cfebd8d1..adc92f007 100644 --- a/packages/notification/package.json +++ b/packages/notification/package.json @@ -24,6 +24,7 @@ "dependencies": { "@google-cloud/functions-framework": "3.1.2", "@google-cloud/pubsub": "^3.2.1", + "dotenv": "^16.0.1", "firebase-admin": "^10.0.2", "@sentry/serverless": "^6.16.1" } diff --git a/packages/notification/src/index.ts b/packages/notification/src/index.ts index fa4f14473..d03bfdcb5 100644 --- a/packages/notification/src/index.ts +++ b/packages/notification/src/index.ts @@ -2,9 +2,17 @@ import * as Sentry from '@sentry/serverless' import { Request, Response } from 'express' import { sendBatchPushNotifications } from './sendNotification' import { Message } from 'firebase-admin/lib/messaging' +import * as dotenv from 'dotenv' // see https://github.com/motdotla/dotenv#how-do-i-use-dotenv-with-import + +dotenv.config() + +interface SubscriptionAttributes { + messages: string[] + tokens: string[] +} interface SubscriptionData { - attributes?: string + attributes?: SubscriptionAttributes data: string } @@ -22,7 +30,10 @@ const readPushSubscription = (req: Request): SubscriptionData | null => { return null } - const body = req.body as { message: { data: string }; attributes?: string } + const body = req.body as { + message: { data: string } + attributes?: SubscriptionAttributes + } const data = Buffer.from(body.message.data, 'base64').toString('utf-8') return { @@ -49,30 +60,32 @@ const getBatchMessages = (messages: string[], tokens: string[]): Message[] => { export const notification = Sentry.GCPFunction.wrapHttpFunction( async (req: Request, res: Response) => { - const subscriptionData = readPushSubscription(req) - if (!subscriptionData) { - res.status(400).send('Invalid request') - return - } - - const { attributes } = subscriptionData - if (!attributes) { - res.status(400).send('Invalid request') - return - } - - const { messages, tokens } = JSON.parse(attributes) as { - messages: string[] - tokens: string[] - } - if (!messages || messages.length === 0 || !tokens || tokens.length === 0) { - res.status(400).send('Invalid request') - return - } - - const batchMessages = getBatchMessages(messages, tokens) - try { + const subscriptionData = readPushSubscription(req) + if (!subscriptionData) { + res.status(400).send('Invalid request') + return + } + + const { attributes } = subscriptionData + if (!attributes) { + res.status(400).send('Invalid request') + return + } + + const { messages, tokens } = attributes + if ( + !messages || + messages.length === 0 || + !tokens || + tokens.length === 0 + ) { + res.status(400).send('Invalid request') + return + } + + const batchMessages = getBatchMessages(messages, tokens) + await sendBatchPushNotifications(batchMessages) res.status(200).send('OK') diff --git a/packages/notification/src/sendNotification.ts b/packages/notification/src/sendNotification.ts index d7df486db..5f1a988d4 100644 --- a/packages/notification/src/sendNotification.ts +++ b/packages/notification/src/sendNotification.ts @@ -1,4 +1,4 @@ -import { initializeApp } from 'firebase-admin/app' +import { applicationDefault, initializeApp } from 'firebase-admin/app' import { BatchResponse, getMessaging, @@ -7,7 +7,9 @@ import { } from 'firebase-admin/messaging' // getting credentials from App Engine -initializeApp() +initializeApp({ + credential: applicationDefault(), +}) export const sendPushNotification = async ( message: Message @@ -25,7 +27,7 @@ export const sendBatchPushNotifications = async ( messages: Message[] ): Promise => { const res = await getMessaging().sendAll(messages) - console.debug('success count: ', res.successCount) + console.debug('res', res) return res }