Help us understand the problem. What is going on with this article?

Cloud Firestoreの柔軟性を利用して新しいパーミッションの仕組みを考えた

More than 1 year has passed since last update.

はじめに

どうも、@1amageekです。
これは僕が実践で利用しているテクニックの一つです。応用範囲が広いので、まとめることにしました。

Cloud Firestoreの設計で困るところ

  • ルールがめんどくさい
  • ルールによって構造を変えなければならない

特に問題なのはReadですね。やっぱりセキュアに保ちたいドキュメントをルートコレクションに配置することはできないし、かと行ってサブコレクションにすると横断的にQueryかけないし

と言うことで、ブログの構造について考えてみましょう。

今までのブログの構造

RDBであれば、例えばデータベースの構造はこんな感じかな?

article table

id title body is_published author
0 hoge hoge false 1amageek
1 hoge1 hoge true 1amageek
2 hoge3 hoge true 1amageek
3 hoge4 hoge true 1amageek

公開・非公開はis_publishedで管理するような形。

Firestoreなら次の二つが考えられる。

// /version/1/article/0
{
  title: "hoge",
  body: "hoge",
  isPublished: true,
  author: "1amageek"
}

// もしくは

// /version/1/user/1amageek/article/0
{
  title: "hoge",
  body: "hoge",
  isPublished: true,
  author: "1amageek"
}

どっちがいいでしょうか?
前者は、検索性に優れているけど、isPublished === trueを入れ忘れただけの簡単なヒューマンエラーでサービス潰す可能性ありますよね?😇
僕ならやりたくない。と言うことで、後者にしましょう。

いや待てよ。。。🤔

公開した時に必ず全文検索を噛ませないといけない。。orz

このくらいはCloud Firestoreだけでやりたいじゃん。

Cloud Firestoreの特性を使えばできますよ

ではどちらの構造を使えばいいでしょうか?

正解はどちらも使う

次の構造をみてください。

// 未公開時の記事はuserのSubCollectionに
// /version/1/user/1amageek/article/0
{
  title: "hoge",
  body: "hoge",
  isPublished: true,
  author: "1amageek"
}

// 公開時の記事はRootCollectionに
// /version/1/article/0
{
  title: "hoge",
  body: "hoge",
  author: "1amageek"
}

Cloud FirestoreにはWriteBatchと呼ばれる機能が入っています。二つのノードを同時に安全に更新できることで、一つのノードを更新・一つのノードへは追加を同時できます。

他の手段として、CloudFunctionsに任せるのもいいかもしれません。次のノードをトリガーにセットして

/version/1/user/1amageek/article/${article_id}

isPublished == trueなら、次のノードへデータを渡す。

/version/1/article/${article_id}

これでセキュアかつ、横断的な検索が可能なブログを作ることが可能となります。


Cloud Firestoreについて気になり始めたら次もどうぞ

1amageek
I am a geek. Firebase, Firestore 😎 Firebase Japan User Groupのオーガナイザー 半導体エンジニアから、Timers , Cookpadを経て独立。 新規事業の技術顧問として、あらゆる企業をバックアップさせて頂いております。 お困りごとがあれば何なりとご質問ください。
https://stamp.inc/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした