Cloud functionでOGPを生成してFirestoreにアップロードする
やりたい流れ
firestoreでドキュメントが新しくできたときにcloud functionを発火する
onCreateイベントで発火させる
Cloud Firestore トリガー  |  Firebase
画像を生成してCloud Strageに保存してFirestoreにURLをセットする
Cloud Functions + ImageMagickでOPG画像の動的生成してCloud Storageにアップロードする - くらげになりたい。
cloud functionではimage magickが使える
Cloud Storage トリガー  |  ファイルをダウンロード、変換、アップロードする
ファイルのダウンロード
code:js
await bucket.file(filePath).download({destination: tempFilePath});
functions-samples/index.js at master · firebase/functions-samples
firestoreにURLを保存
code:js
// Add the URLs to the Database
await admin.database().ref('images').push({path: fileUrl, thumbnail: thumbFileUrl});
署名つきURLははまるのでやめたほうがいいらしい
Firebase Storegeの署名付きURLを使用してハマる - Qiita
けど結局署名付きURLをFirestoreに入れるのが面倒くさそうだったので、署名つきURL使った
CDN通す
料金をおさえるためと速度向上のため
Cloud Storage for Firebaseのレスポンスを爆速化した話 - Qiita
いらなさそうな気がする
imageMagic
Imagemagickで画像を合成する1 (画像を重ね合わせる) | Imagemagickの使い方日本語マニュアル
画像を合成して、円を書く
code:bash
convert twicall-ogp.png -gravity northwest -compose over \( icon.png -resize 120x120 \) -geometry +82+127 -composite -fill '#ffffff' -draw 'circle 187,138 211,138' -fill '#77D473' -draw 'circle 187,138 204,138' after.png
上記のdraw部分でspawn('convert')で実行できなかったので、以下のように画像を2回合成する形にした
code:bash
convert twicall-ogp.png \( icon.png -resize 120x120 \) -gravity northwest -geometry +82+127 -compose over -composite online-circle.png -gravity northwest -geometry +167+118 -compose over -composite exit.png
https://gyazo.com/441cdbc58b32bc700dfda516e832cbe4
ImageMagickで丸いサムネイル画像を作る - YuG1224 blog
透過画像を作って、
code:bash
convert cafe_extent.png circle.png -compose CopyOpacity -composite cafe_after.png
これを使ってこう
code:bash
convert twicall-ogp.png \( icon.png -resize 120x120 circle.png -compose CopyOpacity -composite \) -gravity northwest -geometry +82+127 -compose over -composite online-circle.png -gravity northwest -geometry +167+118 -compose over -composite exit.png
https://gyazo.com/a9dbf4d0629ea1a61db2d755effb68de
はまったポイントはこれで回避
firebase-adminからCloudStorageの署名付きURLの取得(getSignedUrl)ができるようにする設定 - Qiita
ユーザー新規作成時とphotoURLが変更された時に発火させたい
Cloud Firestoreの勘所 パート2 — データ設計 - google-cloud-jp - Medium
create : 引数のdataで新規作成(すでに存在していればエラー)
update : すでにあるデータの更新(存在しなければエラー、キー配下のものは置き換わる)
set : すでに存在しているかは関係無く全置き換え
先ほどのコードでは set を使いつつ { merge: true } というオプションを指定してキーの被らない既存データはそのまま残すようにしています。
初回サインインかどうかfirestoreを見に行って、データがなければcreateするようにすれば良さそう
Nuxt.js と Firebase(Firestore)を使って認証と DB 保存を実装する - Qiita
cloud functionについて
stagingがある場合の設定
Cloud Functions for Firebase で deploy 先を切り替える - Qiita
code:bash
$ firebaes use staging
$ firebase deploy --only functions
firebasercはオープンソースにしないなら、gitに含めていいらしい
google cloud platform - What is the practice on committing firebase files in a NodeJS app? - Stack Overflow
firebaseエミュレータでテスト
関数をインタラクティブにテストする  |  Firebase
firebase functions:shell
code:bash
generateOgpImageUrl({ photoURL: 'https://pbs.twimg.com/profile_images/1093018580134768640/NLIQW8JV_400x400.png' }, { params: { uid: 'BRPIDgejSiZHrNfOylbNE0qyhNm1' } })
code:bash
generateOgpImageUrl({ photoURL: 'https://pbs.twimg.com/profile_images/1166006105836642304/dNSHFih7_400x400.jpg' }, { params: { uid: 'BRPIDgejSiZHrNfOylbNE0qyhNm1' } })
RESPONSE RECEIVED FROM FUNCTION: 500, Error: Could not load the default credentials.
Firebase Cloud Functionsで消耗したくない人のために、開発環境のベストプラクティスをまとめていったらDockerに行き着いた話(随時更新) - Qiita
https://gyazo.com/14fe6d18b2c217dc9afb34154f5fe7b1
https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional
認証keyのjsonをDLしてホームディレクトリ配下にfirebase-adminsdk.jsonとして保存して、zshrcに以下を追加した
export GOOGLE_APPLICATION_CREDENTIALS=~/firebase-adminsdk.json
https://gyazo.com/124d16a9bc651fa81dca2d745a07cea0
https://gyazo.com/ce56a05d9b3a60284773a2a336fa5904
そもそもCloud Stratgeの無料枠が大きい