iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【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 の取得方法は、公式ドキュメントを参考にしてみてください。

firebase.google.com

次にこの users 配下の likes サブコレクションにドキュメントが作成されたタイミングで通知を送信できるようにしていきます。ということで下記が完成したコードになります。 まずは、context.params.userIdusers/{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.');
    }
});

という感じで本日も以上になります🍺

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com