CR-FASTAPI-009 完了レポート

実装日時

2025年12月4日

概要

目的

Flask ベースの以下のエンドポイントを FastAPI に移行する:

  • /api/v1/projects/<id>/run (POST) - プロジェクトの実行要求
  • /api/v1/projects/<id>/runs/latest (GET) - プロジェクトの最新の実行情報取得
  • /api/projects/<id>/badge/success_rate (GET) - 成功率バッジ取得
  • /api/projects/<id>/badge/last_run (GET) - 最後の実行バッジ取得

ゴール

  • FastAPI 版エンドポイントの実装完了
  • Pydantic モデルによる型安全性の確保
  • 既存の Flask 実装との互換性維持
  • テストの作成と動作確認

原則

  • .cursorrules に従った FastAPI 実装パターン
  • 統一されたエラーハンドリング(CR-FASTAPI-006)
  • 認証 DI(CR-FASTAPI-004)
  • /api/v1/ プレフィックス(公開 API)

実装ステップ

Step 1: Pydantic スキーマの作成

新規作成ファイル:

  • src/nexuscore/api/schemas/project_run.py
    • ProjectRunRequest: 実行リクエストモデル(requirement, autonomy_level, fast_lane)
    • ProjectRunResponse: 実行レスポンスモデル(run_id, project_id, status, queue_mode)
    • LatestRunResponse: 最新Runレスポンスモデル
    • LatestRunDetail: 最新Run詳細モデル
  • src/nexuscore/api/schemas/badge.py
    • BadgeResponse: shields.io 互換のバッジレスポンスモデル

Step 2: FastAPI ルータの実装

変更ファイル:

  • src/nexuscore/api/routes/projects.py
    • POST /api/v1/projects/{project_id}/run: プロジェクト実行エンドポイント追加
    • GET /api/v1/projects/{project_id}/runs/latest: 最新Run取得エンドポイント追加
    • Celery 非同期実行と同期実行の両方に対応
    • 認証必須(Depends(get_current_user)

新規作成ファイル:

  • src/nexuscore/api/routes/badges.py
    • GET /api/projects/{project_id}/badge/success_rate: 成功率バッジエンドポイント
    • GET /api/projects/{project_id}/badge/last_run: 最新Runバッジエンドポイント
    • 認証不要(公開エンドポイント)

Step 3: FastAPI アプリへの統合

変更ファイル:

  • src/nexuscore/api/fastapi_app.py
    • badges ルータをインポート
    • /api プレフィックスでバッジルータをマウント

Step 4: テストの作成

新規作成ファイル:

  • tests/api/test_fastapi_project_runs.py
    • test_trigger_project_run_success: 非同期実行成功テスト
    • test_trigger_project_run_sync_mode: 同期実行モードテスト
    • test_trigger_project_run_project_not_found: プロジェクト未存在テスト
    • test_trigger_project_run_missing_requirement: requirement 未指定テスト
    • test_get_latest_run_success: 最新Run取得成功テスト
    • test_get_latest_run_no_runs: Run未存在テスト
    • test_get_latest_run_project_not_found: プロジェクト未存在テスト
    • test_trigger_project_run_requires_authentication: 認証必須テスト
    • test_get_latest_run_requires_authentication: 認証必須テスト
  • tests/api/test_fastapi_badges.py
    • test_project_success_rate_badge_success: 成功率バッジ成功テスト
    • test_project_success_rate_badge_no_runs: Run未存在時のテスト
    • test_project_success_rate_badge_project_not_found: プロジェクト未存在テスト
    • test_project_last_run_badge_success: 最新Runバッジ成功テスト
    • test_project_last_run_badge_no_runs: Run未存在時のテスト
    • test_project_last_run_badge_different_statuses: 異なるステータスのテスト
    • test_project_last_run_badge_project_not_found: プロジェクト未存在テスト
    • test_badge_endpoints_no_authentication_required: 認証不要テスト

変更ファイル一覧

新規作成

  • src/nexuscore/api/schemas/project_run.py
  • src/nexuscore/api/schemas/badge.py
  • src/nexuscore/api/routes/badges.py
  • tests/api/test_fastapi_project_runs.py
  • tests/api/test_fastapi_badges.py

変更

  • src/nexuscore/api/routes/projects.py: 2つのエンドポイント追加
  • src/nexuscore/api/fastapi_app.py: badges ルータの統合

動作確認結果

静的解析

  • Linter エラー: なし
  • 型チェック: 問題なし

テスト実行

  • 全17件のテストが成功
    • tests/api/test_fastapi_project_runs.py: 9件すべて成功
    • tests/api/test_fastapi_badges.py: 8件すべて成功
  • モックベースのテスト実装
  • 実際のデータベース接続は不要(モック使用)
  • os.getenv のモック化に patch.object を使用
  • Response オブジェクトによる動的ステータスコード設定(同期: 200, 非同期: 202)

OpenAPI スキーマ

  • /api/openapi.json にエンドポイントが正しく定義されることを確認予定
  • Pydantic モデルによる自動スキーマ生成

手動確認項目

  • FastAPI アプリの起動確認
  • 各エンドポイントの動作確認
  • 認証の動作確認
  • エラーハンドリングの確認

設計上の改善点

アーキテクチャ

  • 型安全性の向上: Pydantic モデルによるリクエスト/レスポンスの型チェック
  • エラーハンドリングの統一: CR-FASTAPI-006 の統一エラー形式を適用
  • 認証の統一: CR-FASTAPI-004 の認証 DI パターンを適用

拡張性

  • バッジエンドポイントの分離: badges.py として独立したルータに分離し、将来の拡張に対応
  • プロジェクトRunエンドポイントの統合: projects.py に統合し、プロジェクト関連のエンドポイントを集約

品質

  • テストカバレッジ: 主要なシナリオをカバーするテストを実装
  • ドキュメント: OpenAPI スキーマによる自動ドキュメント生成

既知の制約・注意事項

既存コードとの互換性

  • Flask 版エンドポイントは非推奨として残存(CR-FASTAPI-010 で削除予定)
  • データベースモデル(Project, Run)は既存のものを使用
  • Celery タスク(run_orchestrator_task)は既存のものを使用

制限事項

  • 同期実行モード: NEXUS_USE_CELERY=0 の場合、同期実行となるが、長時間実行の場合はタイムアウトの可能性あり
  • バッジエンドポイント: 認証不要のため、プロジェクトIDの推測による情報漏洩のリスクあり(既存のFlask実装と同様)

移行時の注意点

  • Flask 版エンドポイントは DEPRECATED コメントと警告ログを追加済み
  • クライアントは FastAPI 版エンドポイントへの移行を推奨
  • 削除予定: v0.9.0(CR-FASTAPI-010)

次のステップ

推奨されるフォローアップアクション

  1. テスト実行と動作確認
    • tests/api/test_fastapi_project_runs.py の実行
    • tests/api/test_fastapi_badges.py の実行
    • 実際のデータベースを使用した統合テストの検討
  2. Flask エンドポイントの削除(CR-FASTAPI-010)
    • /api/v1/projects/<id>/run (POST) の Flask 版削除
    • /api/v1/projects/<id>/runs/latest (GET) の Flask 版削除
    • /api/projects/<id>/badge/success_rate (GET) の Flask 版削除
    • /api/projects/<id>/badge/last_run (GET) の Flask 版削除
  3. ドキュメント更新
    • docs/api/README.md に新エンドポイントを追加
    • docs/api/FastAPI移行ステータス.md のステータス更新
  4. パフォーマンステスト
    • 非同期実行(Celery)の動作確認
    • 同期実行モードの動作確認
    • バッジエンドポイントのレスポンス時間測定
  5. セキュリティレビュー
    • バッジエンドポイントの認証不要設計の再検討
    • プロジェクトID推測による情報漏洩リスクの評価

This site uses Just the Docs, a documentation theme for Jekyll.