Open4

【Firebase】Firestore x Functions構成に関する所感

heyhey1028heyhey1028

メモ

  • triggerかcallableか

Callable functionsのメリット

FirebaseにはCallable functionsと呼ばれる専用のAPIが準備されています。このAPIにはAuth情報も含まれているのでREST APIを作るよりも安全に実装することが可能です。

Cloud Functionsに処理を任せることの最大のメリットはセキュリティルールをバイパスする事です。運用が開始され、セキュリティルールを強固にしていった時必ず権限の持たせ方に困ることがあります。

参考

https://zenn.dev/1amageek/articles/7fdb9b3c8e511d1e36c3

heyhey1028heyhey1028

Callable functionの構成

  1. リクエストモデルの定義
  2. リクエストモデルのバリデーション
  3. 処理
  4. 処理ごとのバリデーション
  5. レスポンスモデルの定義
  6. それぞれのバリデーションに弾かれた際のExceptionモデルの定義

その他

  • Firestoreのデータ変更であればTransactionを貼る

基本型

export const yourFunction = functions
  .region('asia-northeast1')
  .runWith({ memory: '2GB' })
  .https.onCall(
    async (data: Params, context): Promise<Response> => {
    ...
  }
)
heyhey1028heyhey1028

エラーハンドリング

クライアントへのエラー渡し

  • functions.https.HttpsError:Cloud Functionsで発生したHTTPエラーを表すクラス
  • 次のようなプロパティを持つ
    • code: HTTPステータスコード。例えば、400 Bad Requestや401 Unauthorizedなど。
    • message: エラーメッセージ。
    • details: エラーの詳細情報。
  • functions.https.HttpsErrorを使用することで、Cloud Functionsで発生したHTTPエラーを明確に表現することが可能

Functions標準のhttpsエラー

'ok'
'cancelled'
'unknown'
'invalid-argument'
'deadline-exceeded'
'not-found'
'already-exists'
'permission-denied'
'resource-exhausted'
'failed-precondition'
'aborted'
'out-of-range'
'unimplemented'
'internal'
'unavailable'
'data-loss'
'unauthenticated'

参考

https://ja.javascript.info/custom-errors
https://dev.classmethod.jp/articles/error-handling-practice-of-typescript/
https://qiita.com/frozenbonito/items/e708dfb3ab7c1fd3824d

heyhey1028heyhey1028

Case1. Stripeのエラーハンドリング

Stripeのエラーコード:https://stripe.com/docs/error-codes#payment-intent-action-required

  try {
    await stripe.customers.retrieve('cus_dummy')
  } catch (e) {
    if (e instanceof Stripe.errors.StripeError) {
      console.log(`[Error: ${e.code}] ${e.message}`)
    } else {
      console.log(e)
    }
  }

Stripeから取得したErrorをカスタムエラーに変換


Charges APIとPaymentIntent APIについて

The Payment Intents API is the unifying API for all Stripe products and payment methods. While we are not deprecating Charges, new features are only available with the Payment Intents API.

参考

https://qiita.com/hideokamoto/items/f9d21e1472744e8bc0d6