ottijp blog

Firebase Realtime Databaseのルールコンバータを作った

最近Firebaseを使ったシステムを開発しているのですが,Realtime Databaseの規模が少し大きくなると,ルール用JSON(database.rules.json)を直接編集するのが大変になってきました. そこで,ルール設計にはスプレッドシートを使い,それをdatabase.rules.jsonに変換するコンバータツールを作成しました.

ソースとnpmパッケージ

エクセルなどのスプレッドシートで以下のようなエレメントの構造とルールを作成します.

spread sheet input

これを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が指定可能
    • 指定すれば.validatenewData.isString()などのバリデーション条件を入れてくれる
  • CONDITION
    • .conditionに直接入るバリデーション条件
  • READ
    • .readに直接入る読み取り可能条件
  • WRITE
    • .writeに直接入る書き込み可能条件

インストール

$ npm install -g fir-rule-gen

変換コマンド

$ fir-rule-gen <変換元CSVのパス> <変換先JSONのパス>

引数でパス指定せずパイプで渡すことも可能です.

$ cat <変換元CSVのパス> | fir-rule-gen > <変換先JSONのパス>

ottijp
都内でアプリケーションエンジニアをしています
© 2026, ottijp