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] (https://firebase.google.com/docs/reference/rules/rules.Timestamp#minute), 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 セキュリティルールで使える関数一覧でした。
ここで上げた意外にも、様々な型、関数が用意されています。
それぞれの関数を使う具体的なユースケースはまだ思い浮かばないのですが、
今後の個人開発に活かしていきたいです。