【Node.js】Functions でユーザが通知を有効にしている場合にプッシュ通知を送信するやつをやってみた
今回は Firebase Firestore
であるドキュメントが作成された時、ユーザの通知設定に応じて通知も送信をハンドリングする実装を行ったので、簡単に記事にまとめてみようと思います👷♀️
それではやっていく
今回は、一般的にありえそうな下記のようなユースケースに置き換えて実装を行ってみます。
- ユーザからいいねがあった場合に通知を送信する
- いいねの通知を無効にしていた場合は通知を送信しないようにする
コレクションとドキュメントはとりあえず下記のような雰囲気を想定してもらえれば、、
ユーザコレクション:
users/{user_id}/likes/{like_id}
like: { userId: String, name: String }
通知設定
settings/{user_id}
setting: { fcmToken: String, isEnableLikeNotification: Boolean }
token
の取得方法は、公式ドキュメントを参考にしてみてください。
次にこの users
配下の likes
サブコレクションにドキュメントが作成されたタイミングで通知を送信できるようにしていきます。ということで下記が完成したコードになります。
まずは、context.params.userId
で users/{userId}
のパスを取得しています。今回の例だと users
コレクションに含まれているドキュメントの ID
はそれぞれ、ユーザの ID
と同じになっている想定なので、settings
という別コレクションにそれぞれのユーザの設定が入っていても、パス経由でデータを取得することができます。そしてそのデータを元に、通知設定の検証を行い admin sdk
で通知を送信しています。
exports.onUserLikeCreated = functions.firestore.document(`users/{userId}/likes/{likeId}`).onCreate(async (snap, context) => { const userId = context.params.userId; const body = `${snap.data().name}さんにいいねされました!`; const doc = await db.doc(`settings/${userId}`).get(); const setting = doc.data(); if (!doc.exists) { return console.log('No such document!'); } else if (setting.isEnableLikeNotification) { const token = setting.fcmToken; const message = { notification: { body: body }, token: token }; await admin.messaging().send(message) .then((response) => { console.log('Successfully sent message:', response); }) .catch((error) => { console.log('Error sending message:', error); }); return; } else { return console.log('Guide notifications are not enabled.'); } });
という感じで本日も以上になります🍺
参考
- https://firebase.google.com/docs/functions/callable?hl=ja
- https://firebase.google.com/docs/cloud-messaging/send-message?hl=ja