Open23

Firebase

Googleアカウントを切り替える

firebase login --reauth

functionsだけdeployする

firebase deploy --only functions

firebase.jsonにこういう記述があるので firebase deployするとlintとbuildが実行されているらしい

firebase.json
% cat firebase.json
{
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint",
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ]
  }
}

functionの記述例

index.ts
export const helloWorld = functions.https.onRequest((request, response) => {
  functions.logger.info("Hello logs!", {structuredData: true});
  response.send("Hello from Firebase!");
});

export const helloWorld2 = functions.https.onRequest((request, response) => {
  functions.logger.info("Hello2 logs!", {structuredData: true});
  response.send("Hello2 from Firebase!");
});

firebase auth のユーザ作成時と削除時に関数を実行、関数からfirestoreへのアクセスを行う

index.ts
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";

admin.initializeApp();

exports.onCreateUser = functions.auth.user().onCreate((user) => {
  const uid = user.uid;
  const email = user.email;
  const displayName = user.displayName;
  const newUser = {
    uid: uid,
    email: email,
    displayName: displayName,
  };
  return admin.firestore().collection("users").doc(uid).set(newUser);
});

exports.onDeleteUser = functions.auth.user().onDelete((user) => {
  const uid = user.uid;
  return admin.firestore().collection("users").doc(uid).delete();
});

https://tech-blog.sgr-ksmt.org/2019/12/31/160623/

しかし、このリストに多量のデータを持つとなると、ドキュメントひとつあたりのデータサイズ(byte)が増加してしまうのと、ひとつのドキュメントでは**1MiB(1024KB)**までしかデータを持てない制限があるため、
仮に数十万ほどいいねがついた時に1MiBの容量制限に達してしまう可能性が出てきます。

例えば、一度投稿したらその投稿が削除以外更新されることがほぼないのであれば、参照元のデータをサブコレクションに書き写す方が良いでしょう。 一方でUserモデルのようにユーザー名やアイコンの画像の情報が頻繁に変わる場合は参照だけサブコレクションに持たせるようにして、

別の方法として、現在はドキュメントのフィールドに、FieldValue.incrementを使って書き込むことで比較的簡単に記録することができます。 性能としては 「最大書き込み速度が1秒間に1回」 ではありますが、トランザクション処理により確実に値を増減させることができるため、
一度に数万も値を増減させるようなオペレーションが発生しない限りは分散カウンタを使うよりは手軽そうです。

jestを使ったfirebase.rulesのテスト環境の構築手順

  • jestのインストール

    • npm install -j jest
  • 初期化

    • jest --init
    • firebase/rules-unit-testing を追加
      • npm i -D @firebase/rules-unit-testing
  • テストコード

    • firestore.rules.test.jsなどを作成
  • テスト実行

    • firebase emulators:exec --only firestore "jest --detectOpenHandles"
  • firestore.rules のテストを実行

firebase emulators:exec --only firestore "jest --detectOpenHandles"

  • firestore のルールだけデプロイする

firebase deploy --only firestore

  • homebrew でnodeをインストールすると v15 になる
  • node が v15 だとfunctionsのビルドに失敗する

https://stackoverflow.com/questions/64437656/gcp-cloud-function-error-fetching-storage-source-during-build-deploy
  • 以下の記事を参考に古いバージョンを(グローバルではなく)プロジェクトに追加した

https://qiita.com/funeasy-soft/items/d08e5a7d96d4bf5b79ed
  • homebrew で node の特定バージョンをインストールする方法

https://qiita.com/rutko/items/016ae50018c5ca19ed95

バケット単位でオブジェクトを公開する方法

  • Cloud Storage for Firebase のpublic urlはtokenベースの検証をするのでアクセスが遅い

  • URLを取得するためにgetDownloadURL()が必要

  • GCPのCloud Storageのパブリックアクセスを利用すると速くなる

  • アクセス制御がいらないコンテンツで使う

https://cloud.google.com/storage/docs/access-control/making-data-public?hl=ja#buckets
ログインするとコメントできます