Cloud functionでOGPを生成してFirestoreにアップロードする
やりたい流れ
firestoreでドキュメントが新しくできたときにcloud functionを発火する
onCreateイベントで発火させる
画像を生成してCloud Strageに保存してFirestoreにURLをセットする
cloud functionではimage magickが使える
ファイルのダウンロード
code:js
await bucket.file(filePath).download({destination: tempFilePath});
firestoreにURLを保存
code:js
// Add the URLs to the Database
await admin.database().ref('images').push({path: fileUrl, thumbnail: thumbFileUrl});
署名つきURLははまるのでやめたほうがいいらしい
けど結局署名付きURLをFirestoreに入れるのが面倒くさそうだったので、署名つきURL使った
CDN通す
料金をおさえるためと速度向上のため
いらなさそうな気がする
imageMagic
画像を合成して、円を書く
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
透過画像を作って、
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
はまったポイントはこれで回避
ユーザー新規作成時とphotoURLが変更された時に発火させたい
create : 引数のdataで新規作成(すでに存在していればエラー)
update : すでにあるデータの更新(存在しなければエラー、キー配下のものは置き換わる)
set : すでに存在しているかは関係無く全置き換え
先ほどのコードでは set を使いつつ { merge: true } というオプションを指定してキーの被らない既存データはそのまま残すようにしています。
初回サインインかどうかfirestoreを見に行って、データがなければcreateするようにすれば良さそう
cloud functionについて
stagingがある場合の設定
code:bash
$ firebaes use staging
$ firebase deploy --only functions
firebasercはオープンソースにしないなら、gitに含めていいらしい
firebaseエミュレータでテスト
firebase functions:shell
code:bash
code:bash
RESPONSE RECEIVED FROM FUNCTION: 500, Error: Could not load the default credentials.
https://gyazo.com/14fe6d18b2c217dc9afb34154f5fe7b1
認証keyのjsonをDLしてホームディレクトリ配下にfirebase-adminsdk.jsonとして保存して、zshrcに以下を追加した
export GOOGLE_APPLICATION_CREDENTIALS=~/firebase-adminsdk.json
https://gyazo.com/124d16a9bc651fa81dca2d745a07cea0
https://gyazo.com/ce56a05d9b3a60284773a2a336fa5904
そもそもCloud Stratgeの無料枠が大きい