app.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. """FastAPI application — category tree API on port 8080."""
  2. from __future__ import annotations
  3. from pathlib import Path
  4. from fastapi import FastAPI, HTTPException, Query
  5. from fastapi.middleware.cors import CORSMiddleware
  6. from fastapi.staticfiles import StaticFiles
  7. from api.services.category_tree import build_category_tree
  8. from api.services.demand_belong_category import list_demand_belong_categories
  9. from api.services.demand_grade import list_demand_grades
  10. from api.services.demand_grade_videos import list_videos_for_demand_grade
  11. from api.services.demand_videos import list_videos_for_demand_belong
  12. from api.services.oss_logs import list_demand_belong_oss_logs
  13. app = FastAPI(title="SupplyAgent API", version="0.1.0")
  14. app.add_middleware(
  15. CORSMiddleware,
  16. allow_origins=[
  17. "http://localhost:5173",
  18. "http://127.0.0.1:5173",
  19. "http://localhost:4173",
  20. "http://127.0.0.1:4173",
  21. ],
  22. allow_credentials=True,
  23. allow_methods=["*"],
  24. allow_headers=["*"],
  25. )
  26. @app.get("/health")
  27. def health() -> dict[str, str]:
  28. return {"status": "ok"}
  29. @app.get("/api/category-tree")
  30. def category_tree(
  31. biz_dt: str | None = Query(
  32. default=None,
  33. description="业务日 YYYYMMDD;省略则取 category_tree_weight 最新一日",
  34. ),
  35. ) -> dict:
  36. """Return nested global_tree_category with per-dim avg score."""
  37. return build_category_tree(biz_dt=biz_dt)
  38. @app.get("/api/demand-belong-category")
  39. def demand_belong_category() -> dict:
  40. """Return all active demand_belong_category rows in one response."""
  41. items = list_demand_belong_categories()
  42. return {"items": items}
  43. @app.get("/api/demand-belong-category/{belong_id}/videos")
  44. def demand_belong_videos(belong_id: int) -> dict:
  45. """Return videos linked to a demand_belong_category row (vid + title + points JSON)."""
  46. result = list_videos_for_demand_belong(belong_id)
  47. if result is None:
  48. raise HTTPException(status_code=404, detail="demand_belong_category not found")
  49. return result
  50. @app.get("/api/demand-grade")
  51. def demand_grade(
  52. biz_dt: str | None = Query(
  53. default=None,
  54. description="业务日 YYYYMMDD;省略则取 demand_grade 最新一日",
  55. ),
  56. ) -> dict:
  57. """Return demand_grade rows (one per category_id) for the given/latest biz_dt."""
  58. items = list_demand_grades(biz_dt=biz_dt)
  59. return {"items": items}
  60. @app.get("/api/demand-grade/{demand_grade_id}/videos")
  61. def demand_grade_videos(demand_grade_id: int) -> dict:
  62. """Return videos linked to a demand_grade row (vid + title + points JSON)."""
  63. result = list_videos_for_demand_grade(demand_grade_id)
  64. if result is None:
  65. raise HTTPException(status_code=404, detail="demand_grade not found")
  66. return result
  67. @app.get("/api/demand-belong-oss-logs")
  68. def demand_belong_oss_logs() -> dict:
  69. """Return demand_belong_category_agent oss_logs ordered by create_time desc."""
  70. items = list_demand_belong_oss_logs()
  71. return {"items": items}
  72. _web_dist = Path(__file__).resolve().parent.parent / "web" / "dist"
  73. if _web_dist.is_dir():
  74. app.mount("/", StaticFiles(directory=_web_dist, html=True), name="web")