🕌

Cloud FunctionsのfirestoreのonWrite()で書き込み状態判定

2021/09/02に公開

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