Firestoreで createdAt , upcatedAt を追加する

Firestoreで createdAt , upcatedAt を追加する

import { addDoc, collection, serverTimestamp } from 'firebase/firestore'

serverTimestamp() 現在時刻をセットすることができます

// 追加するdata
const d = dayjs().format('YYYY-MM-DD_HH_mm_ss')
const data = {
  name: `Tあり追加のテスト-${d}`,
  text: `追加時刻は ${d}`,
  createdAt: serverTimestamp(),
  updatedAt: serverTimestamp()
}

// addDoc() で追加する
const colRef = collection(firebaseDB, 'users', user.uid, 'hogehoge')
await addDoc(colRef, data)

● コンバーターで自動付与する

createdAt が null の場合は serverTimestamp() でサーバーの時間を自動に設定する。
updatedAt は 常に serverTimestamp() でサーバーの時間を自動に設定する。

  toFirestore(news: News): DocumentData {
    return {
      ...news.toArray(),
      createdAt: news.createdAt === null ? serverTimestamp() : Timestamp.fromDate(new Date(news.createdAt)),
      updatedAt: serverTimestamp()
    }
  },

● データ新規登録または更新時にcreatedAt, updatedAt のカラムが含まれるかどうかをチェックするセキュリティルール

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /users/{userID}/{document=**} {
      //  read ( get , list に分類される)と write ( create , update , delete に分類される)

      allow read: if
        isSameAsLoginUser(userID)                 // rule (現在ログインしているユーザのuidが同じIDかどうか?)

      allow create, update: if
        hasFields(["createdAt", "updatedAt"]) &&  // rule (createdAt , updatedAt を含むか?)
        isSameAsLoginUser(userID)                 // rule (現在ログインしているユーザのuidが同じIDかどうか?)

      allow delete: if
        isSameAsLoginUser(userID)                 // rule (現在ログインしているユーザのuidが同じIDかどうか?)
    }

    // columnList で 渡されてきたすべてのカラムが登録したいデータオブジェクトに存在するか
    function hasFields(columnList) {
      return request.resource.data.keys().hasAll(columnList);
    }

    // userID で 渡されてきたユーザーのuidと現在ログインしているユーザのuidが同じIDかどうか?
    function isSameAsLoginUser(userID) {
      return request.auth.uid == userID;
    }

	}
}

引用 : https://zenn.dev/yucatio/articles/c5cc8718f54fd7

セキュリティルール については合わせてこちらも読んでおくと良いでしょう
https://zenn.dev/kosukesaigusa/articles/efc2528898954d95a6ae

No.2230
11/01 10:49

edit