CR-NEXUS-011: WebApp HTML UI の API 移行整合 & クリーンアップ
SRS Traceability
- Related SRS: docs/srs/NEXUSCORE_SRS.md
- This CR satisfies: FR-3
- CR-ID: CR-NEXUS-011
- Status: Completed
- Author: AI Codex
- Date: 2024-12-04
- Related CR: CR-FASTAPI-001, CR-FASTAPI-010, CR-FASTAPI-010A
1. Overview & Context
目的 (Why)
Flask 時代の内部 HTML UI(nexuscore.webapp 配下)が、旧 Flask REST API(/api/...)前提のままになっている箇所、もしくは「どの API を叩く想定か不明瞭な箇所」を整理し、すべて FastAPI /api/v1/* を前提とした UI に揃える。
併せて、「HTML UI = 人間向け画面」「FastAPI = 外部/機械向け API」という責務分離を明文化する。
背景 (Background)
CR-FASTAPI-001〜010A までで、REST API は FastAPI /api/v1/* に統一済み。Flask 側の REST エンドポイントは CR-FASTAPI-008/010 で削除済みだが、WebApp 側の HTML テンプレートや view 関数の一部は、旧 /api/... を前提としたまま、あるいは今どの API を想定しているか曖昧という状態の可能性がある。
現状の問題点:
- URL の不整合リスク: HTML UI 内にハードコードされた
/api/...形式の URL が残っている可能性 - 責務の不明瞭さ: Flask WebApp が HTML レンダリングと JSON API の両方を担当している状態
- 将来の保守性: どの API が正か毎回コードから逆算する必要がある
- サイレント破壊リスク: API の URL 変更時に UI が壊れやすい
現状の確認結果:
views_api_test.py:/api/v1/projects/{id}/runをコメントで言及しているが、実際の API 呼び出しは行っていない(シミュレーションのみ)views_projects.py: 直接データベースからデータを取得して HTML を生成。API を呼び出していないviews_dashboard.py: 同様に直接データベースからデータを取得views_logs.py: 直接データベースからデータを取得
重要な発見:
現在の WebApp HTML UI は、FastAPI を経由せず、直接データベースからデータを取得している。これは「HTML UI = 人間向け画面」という責務分離の観点では問題ないが、以下の点を明確化する必要がある:
- 各画面が「どの FastAPI エンドポイントに対応するか」を docstring/コメントで明示
- 将来 UI を FastAPI 経由に変更する場合の設計方針を明文化
- バッジ表示など、外部公開される URL が
/api/v1/*に統一されているか確認
参照 (References)
docs/api/FastAPI移行ステータス.md- FastAPI 移行状況docs/api/CR-FASTAPI-010_完了報告.md- Flask REST API 削除完了レポートdocs/api/CR-FASTAPI-010A_完了報告.md- Badges パス統一完了レポートsrc/nexuscore/webapp/views_*.py- 対象となる WebApp ビューファイル.cursorrules- API Architecture Rules(FastAPI 必須、/api/v1/*プレフィックス)
2. Scope
✅ In-Scope (やること)
A. URL 整理と統一
- HTML テンプレート・View 関数にハードコードされている
/api/...形式の URL を洗い出し、/api/v1/...に統一 - バッジ表示(shields.io 形式)の URL が
/api/v1/projects/{id}/badge/...になっているか確認・修正 - 「いまはどの API も叩いていないダミー UI」があれば、コメントで「将来の FastAPI エンドポイント候補」を明示
B. 役割コメントの追加
- 各 View 関数上部に「この画面はどの FastAPI エンドポイントを前提にしているか」を docstring/コメントで明記
- 例:
# Uses FastAPI GET /api/v1/projectsのような形 - 直接 DB アクセスの場合は「Direct DB access (no API call)」と明記
- 例:
- 「Flask = HTML、FastAPI = JSON API」という責務分離ルールを docstring に追加
C. 不要 UI / 死んでいるリンクの整理
- 旧 Flask API 専用だった UI 部品で、現 FastAPI 構成では使わないものがあれば削除 or 明示的に非表示にする
views_api_test.pyのシミュレーション部分を、実際の FastAPI エンドポイントへのリンク・説明に更新
D. ドキュメント作成
- 「WebApp HTML UI が前提とする FastAPI
/api/v1/*エンドポイント一覧」ドキュメントを作成- 各画面(Projects / Runs / Logs / Badges / API Test UI)の:
- 画面ごとの目的
- 使用する API(または「Direct DB access」)
- 主要なボタン/リンクと遷移先 URL
- 各画面(Projects / Runs / Logs / Badges / API Test UI)の:
- 「Flask = HTML、FastAPI = JSON API」という責務分離ルールの明文化
- 今後 UI を増やすときのルール(新画面を作る場合、必ず
/api/v1/*を前提にする、など)
E. テスト調整
tests/webapp/配下のテストを、現状の HTML UI の責務に合わせて調整- 少なくとも「主要ページが 200 で表示される」「リンクのパスが
/api/v1/...になっている」程度はカバー
❌ Out-of-Scope (やらないこと)
- CSS・デザインの大幅リニューアル
- SPA 化(React / Vue などへの置き換え)
- Gradio UI や Streamlit UI の大規模改修
- 新規 API エンドポイントの追加(それは別 CR:FastAPI 側でやる)
- WebApp HTML UI の動作ロジック変更(直接 DB アクセスから FastAPI 経由への変更は将来の検討事項)
3. Implementation Plan
Step 1: 現状調査と洗い出し
- URL パターンの検索
src/nexuscore/webapp/配下で/api/を含む文字列を検索- ハードコードされた URL の一覧を作成
- 各 View 関数の分析
views_projects.py,views_logs.py,views_dashboard.py,views_api_test.pyを確認- 各画面が「どの API を使うか / 使わないか」を整理
- バッジ URL の確認
- HTML 内に埋め込まれるバッジ画像 URL(
/api/v1/projects/{id}/badge/...)が正しいか確認
- HTML 内に埋め込まれるバッジ画像 URL(
Step 2: コメント・docstring の追加
- 各 View 関数に docstring 追加
- 画面の目的
- 使用する FastAPI エンドポイント(または「Direct DB access」)
- 主要なリンク・ボタンの遷移先
- 責務分離ルールの明文化
src/nexuscore/webapp/__init__.pyまたは各 View ファイルの先頭にコメント追加
Step 3: URL の統一と修正
- ハードコード URL の修正
/api/...→/api/v1/...への置換- バッジ URL の確認・修正
views_api_test.pyの更新- シミュレーション部分を実際の FastAPI エンドポイントへの説明に更新
- curl コマンド例を
/api/v1/*に統一
Step 4: ドキュメント作成
- エンドポイント一覧ドキュメント作成
docs/api/WebApp_UI_API_マッピング.mdを作成- 各画面と FastAPI エンドポイントの対応関係を記載
- 責務分離ルールドキュメント更新
docs/api/README.mdまたは新規ドキュメントに追加
Step 5: テスト調整
- 既存テストの確認
tests/webapp/配下のテストを実行- URL パスのアサーションを
/api/v1/*に更新
- 新規テスト追加(必要に応じて)
- 主要ページの 200 レスポンス確認
- リンクのパス確認
Step 6: 完了レポート作成
- 変更ファイル一覧の整理
- テスト結果の記録
- 既知の制約・注意事項の記載
4. Testing Strategy
テスト方針
- ユニットテスト: View 関数の docstring が正しく追加されているか確認
- 結合テスト: 主要ページが 200 で表示されることを確認
- 回帰テスト: 既存の HTML UI の動作が壊れていないことを確認
主な検証観点
- 正常系: 各画面が正常に表示される
- URL 整合性: ハードコードされた URL が
/api/v1/*になっている - リンク動作: バッジ表示などの外部リンクが正しい URL を指している
- 既存機能への影響: 直接 DB アクセスの画面が引き続き動作する
テストコマンド
# WebApp のテスト実行
cd /home/yn441611/NexusCore
source myenv_linux/bin/activate
python -m pytest tests/webapp/ -v
# 特定の View のテスト
python -m pytest tests/webapp/test_views_projects.py -v
# URL パターンの検証(手動確認)
grep -r "/api/" src/nexuscore/webapp/ --include="*.py"
非機能要件の確認
- パフォーマンス: 直接 DB アクセスの画面は既存のパフォーマンスを維持
- セキュリティ: 認証チェック(
@require_auth)が正しく機能していることを確認 - 保守性: docstring が充実し、将来の開発者が理解しやすい状態になっている