Help us understand the problem. What is going on with this article?

Firestore セキュリティルールで使える関数一覧

Firestoreのセキュリティルールを使うと値の様々なバリデーションができますよね。
ただ 個人で利用する際はsize()とかmatches()などしか使っていませんでした。
そこで、どんな関数があるのか調べてまとめてみました。

以下記載の関数は、セキュリティルールのrequest.resource.data.プロパティ名の型に合わせて、判定時のデータ整形、判定自体に使えます。

(以下例)

  function isValidUserData(user) {
    return 1 <= user.name.size() && user.name.size() <= 30 // nameは1文字以上30文字以内であること
      && user.gender.matches('male|female|genderDiverse') // `gender`は`male`, `female`, `genderDiverse`の3種類だけが選べる
      && 0 <= user.age && user.age <= 150 // `age`は0〜150の数値である
  }

  match /databases/{database}/documents {
    match /users/{userId} {
      allow read:  if true;
      allow create: if isValidUserData(request.resource.data);
    }
  }

String型の関数

Lower

文字列をLowerケースにする

'ABC'.lower() // 'abc'

upper

文字列をUpperケースにする

'abc'.upper() // 'ABC'

matches

引数に渡した正規表現で、文字列を判定した結果を返す

'user@domain.com'.matches('.*@domain[.]com') // true

size

文字数を返す

'abc'.size() // 3

split

引数に渡したデリミタで文字列を分割して、配列を返す

'a/b/c'.split('/') // ['a', 'b', 'c']

trim

前後の空白を削除した文字列を返す

'  a  '.trim() // 'a'

List型の関数

hasAll

配列内に引数に渡した配列のすべての要素が含まれているかどうかを判定する

['りんご', 'なし', 'ぶどう'].hasAll(['なし', 'りんご']) // true
['りんご', 'なし', 'ぶどう'].hasAll(['ばなな', 'ぶどう']) // false

hasAny

配列の要素が、引数に渡した配列に含まれているかどうかを判定する

['りんご', 'なし', 'ぶどう'].hasAny(['なし', 'りんご']) // true
['りんご', 'なし', 'ぶどう'].hasAny(['ばなな']) // false

hasOnly

配列内のすべての要素が、引数に渡した配列に存在するか判定する

['a', 'b'].hasOnly(['a', 'c'])// false
['a', 'b'].hasOnly(['a', 'b', 'c'])// true

join

配列の要素を結合し文字列で返す

['a', 'b'].join() // 'ab'

size

配列の要素数を数値で返す

['a', 'b'].size() // 2

Map型の関数

keys

マップのキーの配列を返す

{ 'name': '太郎', 'address': '茨城県' }.keys() // ['name', 'address']

values

マップの値の配列を返す

{ 'name': '太郎', 'address': '茨城県' }.values() // ['太郎', '茨城県']

size

マップの要素数を数値で返す

{ 'name': '太郎', 'address': '茨城県' }.size() // ['name', 'address'] // 2

Timestamp型の関数

year, month, day, hours, minutes, seconds

Timestampの指定要素で数値として返す

"1989-12-31T11:22:33Z".year() // 1989
"1989-12-31T11:22:33Z".month() // 12
"1989-12-31T11:22:33Z".day() // 31
"1989-12-31T11:22:33Z".hours() // 11
"1989-12-31T11:22:33Z".minutes() // 22
"1989-12-31T11:22:33Z".seconds() // 33

dayOfWeek

曜日を1〜7の数値で返す

"2019-09-21T11:22:33Z".dayOfWeek() // 1 (日曜日)

dayOfYear

一年を1〜366の数値とした場合の値を数値として返す

"2019-12-31T11:22:33Z".dayOfYear() // 366

終わりに

以上 Firestore セキュリティルールで使える関数一覧でした。
ここで上げた意外にも、様々な型、関数が用意されています。
それぞれの関数を使う具体的なユースケースはまだ思い浮かばないのですが、
今後の個人開発に活かしていきたいです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away