Firebase FunctionsとFirestoreでAPIのようなものをやってみた


よーしパパファイヤーベース使っちゃうぞー。

と思ったり思わなかったりして、Firebaseで何かやってみるべくさしあたりAPIのようなものを作ってみました。

Firebaseとかfunctionsとかfirestoreについての説明は省略します。

charactersというコレクションにドキュメントをCRUDするAPIです。
Firebase的には HTTPリクエストで関数をトリガー ということになります。

TypeScriptやNoSQLはほぼ初めてなので手探り的に作りましたがなんとか動いたのでまとめてみます。

さいしょに

Firebaseのコンソールでプロジェクトを作って、Firebase CLIをインストールしましょう。

$ firebase init functions
$ firebase init firestore
でファイル類の雛形が作成されます。

コードが書けたらデプロイ。
$ firebase deploy --only functions
$ firebase deploy --only firestore

API

CREATE

POST /characters

functions/src/index.ts
api.post('/characters', (req, res) => {
  const character = {
    "name": req.body.name,
    "description": req.body.description
  };
  firestore.collection('characters').add(character).then(_r => {
    res.json(character);
  }).catch(err => res.send(err));
});

こんなふうにリクエストを送ってみると

できました。やったね!
ドキュメントのID (UrA...) は自動で振られるようです。

READ

GET /characters/:id

functions/src/index.ts
api.get('/characters/:id', (req, res) => {
  const record = firestore.collection('characters').doc(req.params.id);
  record.get().then(result => {
    res.json(result.data());
  }).catch(err => res.send(err));
});

さっき作ったドキュメントのIDを指定して、こんなふうにとれます。

UPDATE

PATCH /characters/:id

functions/src/index.ts
api.patch('/characters/:id', (req, res) => {
  const record = firestore.collection('characters').doc(req.params.id);
  const character = {
    "name": req.body.name,
    "description": req.body.description
  };
  record.update(character).then(_r => {
    record.get().then(result => {
      res.json(result.data());
    }).catch(err => res.send(err));
  }).catch(err => res.send(err));
});

さっきのドキュメントを一部書き換えます。

変わった!

DELETE

DELETE /characters/:id

functions/src/index.ts
api.delete('/characters/:id', (req, res) => {
  const record = firestore.collection('characters').doc(req.params.id);
  record.delete().then(result => {
    res.send('deleted');
  }).catch(err => res.send(err));
});

これで消せます。

まとめ

実用にあたってはもちろんバリデーションや重複チェックやその他いろいろな処理を追加しないといけないわけですが、一番基本的な動作を行うところまではこんな感じでした。

Firestoreのセキュリティまわりも本来はもっといろいろ設定することがあるはずなのでこれから勉強ですね。

せっかく作ったのでそれっぽい名前で置いておきます。
https://github.com/asny23/firebase-functions-api-sample