FirestoreでEnum型風ルールを作成する
Firestoreではセキュリティルールでフィールドの型を指定できます。
フィールドの型にはbool
やint
、string
などがあります。
しかしenum
型は存在しません。
Firebaseのセキュリティルールでは、string
型のフィールドに対して登録できる文字列を制限することができます。
この機能を使うことでenum
型風のフィールドを作成することができます。
String.matches(regex)
String.matchesを使うと、フィールドに登録される値が 指定された正規表現を満たす場合にのみ、DBに登録することができます。 記述はこのようになります。
allow create, update: if request.resource.data.status.matches("^(TODO|IN_PROGRESS|DONE)$")
String.matches(regex)の使用例
例としてTODOアプリを考えます。入力はタスク名とステータス(実施状況)です。
データ構造はこのようになっています。
status(ステータス)には"TODO"(未着手)か"IN_PROGRESS"(作業中)か"DONE"(完了)のみ指定できます。
これをセキュリティルールで書くとこのようになります。
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /todos/{todo} { function validTodo(docData) { return docData.status.matches("^(TODO|IN_PROGRESS|DONE)$") } allow read: if true; allow create, update: if validTodo(request.resource.data); } } }
このセキュリティルールでステータスが"TODO"のタスクを登録します。 Firebaseのコンソールで確認すると登録されていることが分かります。
もし"IN_PROGRESS"を"DOING"と間違えてしまった場合、"Missing or insufficient permissions."のエラーが出ます。DBを確認すると登録ができていないことが確認できます。
最後に、念のため正規表現があっているか確かめておきましょう。
https://jex.im/regulex/#!flags=&re=%5E(TODO%7CIN_PROGRESS%7CDONE)%24
大丈夫そうですね。