BoostryJP / ibet-Wallet-API

A powerful API suite for seamlessly building ibet blockchain wallet systems 🛠
https://ibet.jp/ibet-for-fin
Apache License 2.0
9 stars 0 forks source link

feat: change framework to FastAPI #1195

Closed purplesmoke05 closed 2 years ago

purplesmoke05 commented 2 years ago

Close #877

Changes

1. Requests

  • リクエスト処理内で使用されていたvalidation関数を、Pydanticモデルに置き換えました。
  • GETリクエストの際のクエリパラメータについても、可能な限りPydanticスキーマでValidationを行っています。
    • ただし、モデル内のリストをパースすることが出来ないため、リストの引数についてはQueryを使用しています。

2. Business Logic

  • Validation以外のロジックは、従来のものをそのまま流用するようにしています。
  • 継承クラスを使用して実装されていたビジネスロジック(dex_order_list.py/position.py)については、若干回りくどい方法ですがDepends()を用いて流用するよう実装しています。

3. Responses

  • 正常系のレスポンスについては、全て既存と同様のスキーマで返却するよう実装しています。
  • 異常系のレスポンスについては、エラーオブジェクトのリファクタリングを行いました。
    • エラーオブジェクトは、「ステータスコード・エラーコード・メッセージ」を必ず含みます。
    • 追加の説明がある場合は「説明」に値が格納されます。
    • これらオブジェクトを元にレスポンスモデルを生成するよう実装しています。
  • 異常系の内、スキーマ内でのバリデーションエラーについては、従来と同様ステータスコードを400としました。
(FastAPI本来のステータスコードは422です。)
    • ロジック内でのパラメータエラーと明示的に分けています。

4. Middlewares

  • 不要となった以下の既存ミドルウェアを廃止しました。
    • session_manager.py
      • FastAPIのDependency InjectionによりミドルウェアでのDB sessionの提供が不要となったため。
    • translator.py
      • Content-Type=application/jsonの際のリクエストボディからのデータパースがFastAPIで提供され不要となったため。
  • 以下のミドルウェアを改修しました。
    • response_logger.py
      • 従来のミドルウェアをFastAPI向けに改修しました。出力イメージは以下です。
[2022-08-30 01:09:44 +0000] [212] [INFO] [ACCESS-LOG] GET /Notifications?notification_type=CancelTransfer&offset=0&limit=100 200 (0.00406sec)
[2022-08-30 01:09:54 +0000] [212] [INFO] [ACCESS-LOG] GET /Token/StraightBond/Addresses 200 (0.009836sec)
[2022-08-30 01:09:54 +0000] [212] [INFO] [ACCESS-LOG] GET /Token/Share/Addresses 200 (0.004725sec)
  • 以下のミドルウェアを追加しました。
    • strip_trailing_slash.py
      • FastAPIではURL末尾にスラッシュを付けた場合リダイレクトが行われます。リダイレクト時にはステータスコードが307となり、これを避けるためのものです。

TODO