CACとfirestore-seedで初期データを流し込むタスクを作る

公開日:2019-02-06
最終更新:2019-02-06

モチベーション

長年Ruby on Railsを触っていると、「Railsにあるこんなgemが他の言語やフレームワークにあったらなぁ」と思うケースが頻出します。Railsでは初期データを流すときにseed-fuなどをよく使いますが、node + firestore環境でもそれに似た機能を用意出来ます。

ライブラリ

参考

Node.jsでサクッとCLIアプリ作るなら cacjs が便利だよ - Qiita

実際のcli

javascriptファイルを用意


const cac = require('cac')  
const cli = cac()  

const admin = require('firebase-admin')  
const serviceAccount = require('./some-firebase-key.json')  
const seed = require('firestore-seed')  

admin.initializeApp({  
  credential: admin.credential.cert(serviceAccount),  
  databaseURL: "https://some-awesome-firebase-project.firebaseio.com",  
  storageBucket: "some-awesome-firebase-project.appspot.com"  
})  

const firestore = admin.firestore()  

firestore.settings({  
  timestampsInSnapshots: true  
})  

const imageOptions = seed.imageOptions("assets/books/{id}", "public/books/{id}")  

cli.command('hello', {  
  desc: "say hello world",  
}, () => {  
  console.log('hello world !!')  
})  

cli.command('books', {  
  desc: "booksマスタを初期化します"  
}, () => {  

  let books = seed.collection('books', [  
    seed.doc('i-am-a-cat', {  
      title: '吾輩は猫である',  
      isbn: '9784000928212',  
      logo: seed.image('wagahai_cover.png', 'cover.png', imageOptions)  
    }),  
    seed.doc('norweigian-wood', {  
      title: 'ノルウェーの森',  
      isbn: '9784000928333',  
      logo: seed.image('norweigian.png', 'cover.png', imageOptions)  
    })  
  ])  

  books.importDocuments(admin).then(() => {  
    console.log("Booksの初期化が完了しました")  
  }).catch(e => {  
    console.error(e.stack)  
  })  
})  

cli.parse()

画像などのassetもシード出来る

非常に便利なのが画像をGCSにアップロードし、その画像へのURLを保存してくれるところ。

const imageOptions = seed.imageOptions("assets/books/{id}", "public/books/{id}")  
...  

cli.command('books', {  
  desc: "booksマスタを初期化します"  
}, () => {  
  let books = seed.collection('books', [  
    seed.doc('i-am-a-cat', {  
      title: '吾輩は猫である',  
      isbn: '9784000928212',  
      logo: seed.image('wagahai_cover.png', 'cover.png', imageOptions)  
    })  
    })  
...

としておくと、ローカルにあるassets/books/i-am-a-cat/wagahai_cover.pngというPNGをGCSバケットにpublic/books/i-am-a-cat/cover.pngという名前でアップロードしてくれ、そこまでのURLが保存されます。

コマンド一覧

$ node cli.js --help

実行

$ node cli.js books

package.jsonに登録しておく

Packageに登録しておくと便利

{  
  "name": "sample-app",  
  "version": "1.0.0",  
  "description": "My primo node project",  
  "scripts": {  
    "dev": "nuxt",  
    "build": "nuxt build",  
    "start": "nuxt start",  
    "seed:help": "node cli.js -help",  
    "seed:books": "node cli.js books",  
    }  
}
記事が少しでもいいなと思ったらクラップを送ってみよう!
0
+1
217 Technologies Blog

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする