🕌
Cloud FunctionsのfirestoreのonWrite()で書き込み状態判定
Cloud Functionsのfirestore.document().onWrite()でcreate, update, deleteを判定する
というタイトルにしたかったんですが、zennのタイトル文字数に引っかかったので、h1で書くことにしました。大した記事じゃないので許してください。
v8のfirebaseの想定です。
筆者は執筆時点でv9の仕様変更をキャッチアップできていません。
解決
ざっくり書きなぐりました。
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
type DocData = admin.firestore.DocumentData;
type DocSnapshot<T = DocData> = admin.firestore.DocumentSnapshot<T>;
const writeStatus = (before: DocSnapshot, after: DocSnapshot) => {
if (!before.exists) return 'create';
if (!after.exists) return 'delete';
return 'update';
};
const HOGE = 'hoge_collection'
const tokyoRegion = 'asia-northeast1';
module.exports = functions
.region(tokyoRegion)
.firestore.document(`${HOGE}/{hogeDocId}`)
.onWrite(async (change, context) => {
const { hogeDocId } = context.params;
const { before, after } = change;
const status = writeStatus(before, after);
if (status === 'create') {
// 新規作成時の処理
// beforeは無い
}
if (status === 'update') {
// 更新時の処理
// NOTE: beforeとafterのデータを見比べることで、例えば配列に何が追加されて、何か取り除かれたかも判定できる
}
if (status === 'delete') {
// 削除時の処理
// afterは無い
}
});
重要な部分はここで、changeのbeforeとafterのある無しで判定できるよ〜
ということを伝えたかっただけの記事です。
const writeStatus = (before: DocSnapshot, after: DocSnapshot) => {
if (!before.exists) return 'create';
if (!after.exists) return 'delete';
return 'update';
};
Discussion