Firebase Realtime Databaseのルールコンバータを作った
最近Firebaseを使ったシステムを開発しているのですが,Realtime Databaseの規模が少し大きくなると,ルール用JSON(database.rules.json)を直接編集するのが大変になってきました.
そこで,ルール設計にはスプレッドシートを使い,それをdatabase.rules.jsonに変換するコンバータツールを作成しました.
ソースとnpmパッケージ
例
エクセルなどのスプレッドシートで以下のようなエレメントの構造とルールを作成します.
これをCSVとして保存し,今回作ったコンバータツールで変換すると,次のようなJSONが作れます.
database.rules.csv
LV1,LV2,LV3,col2,INDEX,TYPE,description,READ,WRITE,CONDITION
users,,,abc,,,,,,
,$user,,,,string,,,,
,groups,,,,,"this
Is
Memo",,,
,,$group,,,string,,,,newData.val().length > 5
,name,,,x,string,,,,
groups,,,,,,,true,,
,users,,,,string,,,,
devices,,,,,,,auth.uid !== null,false,
,$devices,,,,,,,,
,name,,,x,string,,,,
,version,,,,,,,,newData.getPriority() != null
,valid,,,x,boolean,,,,database.rules.json
{
"rules": {
"users": {
"$user": {
".validate": "newData.isString()"
},
"groups": {
"$group": {
".validate": "(newData.isString()) && (newData.val().length > 5)"
}
},
"name": {
".validate": "newData.isString()"
},
".indexOn": [
"name"
]
},
"groups": {
".read": "true"
},
" users": {
".validate": "newData.isString()"
},
"devices": {
".read": "auth.uid !== null",
".write": "false",
"$devices": {},
"name": {
".validate": "newData.isString()"
},
".indexOn": [
"name",
"valid"
],
"version": {
".validate": "newData.getPriority() != null"
},
"valid": {
".validate": "newData.isBoolean()"
}
}
}
}CSVのフォーマット
次のカラムを含む必要があります.これら以外のカラムは無視されます.
- LV1 - LV32
- エレメントのレベル
- ルートエレメントはLV1に配置する
- INDEX
.indexOnに入れる要素の場合はxを入れる
- TYPE
- データタイプ
string,number,booleanが指定可能- 指定すれば
.validateにnewData.isString()などのバリデーション条件を入れてくれる
- CONDITION
.conditionに直接入るバリデーション条件
- READ
.readに直接入る読み取り可能条件
- WRITE
.writeに直接入る書き込み可能条件
インストール
$ npm install -g fir-rule-gen変換コマンド
$ fir-rule-gen <変換元CSVのパス> <変換先JSONのパス>引数でパス指定せずパイプで渡すことも可能です.
$ cat <変換元CSVのパス> | fir-rule-gen > <変換先JSONのパス>