firestore security rulesで時間(Timestamp)を比較判定する

2021/02/21に公開

結論 - request.timeとduration.timeを使う

  1. request.timeで現在時刻
  2. timestampとduration.timeで比較対象の計算
  3. request.timeと2を比較する
// 予約時間の15分前以前はcreateを許可する
allow create: if
  request.time < (
    request.resource.data.reservation_time - duration.time(0, 15, 0, 0)
  );

request.timeとduration.timeで時間比較

firestore rules requst time - document

// firestoreにリクエストを送信したserver time
request.time

firestore rules duration - document

// firestore security rules上でtimestampと計算、比較できる値を生成する
// time(Hours, Minutes, Seconds, Nanoseconds)の引数を与える
// 下記は15分を生成
duration.time(0, 15, 0, 0)

全体コード

rules_version = '2';
  service cloud.firestore {
    match /databases/{database}/documents {
      // articles
      match /articles/{article=**} {
        // 新規登録: 投稿予定時間の15分前以前のみ
        allow create: if
	  request.time < (
            request.resource.data.reservation_time - duration.time(0, 15, 0, 0)
          );
        // 更新: 投稿予定時間の15分前以前のみ
        allow update: if 
	  request.time < (
            resource.data.reservation_time - duration.time(0, 15, 0, 0)
          )
          && request.time < (
            request.resource.data.reservation_time - duration.time(0, 15, 0, 0)
          );
        // 削除: 投稿予定時間の15分前以前のみ
        allow delete: if
          && request.time < (
            resource.data.reservation_time - duration.time(0, 15, 0, 0)
          )
      }
    }
  }

Discussion