Firebase
Functions
Firestore

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));
});

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

post.png

できました。やったね!

ドキュメントのID (UrA...) は自動で振られるようです。

post-result.png


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を指定して、こんなふうにとれます。

get.png


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));
});

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

patch.png

変わった!

patch-result.png


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));
});

これで消せます。

delete.png


まとめ

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

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

せっかく作ったのでそれっぽい名前で置いておきます。

https://github.com/asny23/firebase-functions-api-sample