routes.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. from fastapi import APIRouter, Depends, HTTPException, Query
  2. from sqlalchemy import text
  3. from sqlalchemy.orm import Session
  4. from core_domain import ServiceHealth
  5. from app.application.services import TeamApplicationService
  6. from app.db.session import get_db
  7. from app.domain.repositories import (
  8. TeamDefinitionRepository,
  9. TeamRunRepository,
  10. TeamVersionRepository,
  11. )
  12. from app.schemas.team import (
  13. TeamCreateRequest,
  14. TeamResponse,
  15. TeamRunCreateRequest,
  16. TeamRunResponse,
  17. TeamRunStatusUpdateRequest,
  18. TeamStatusUpdateRequest,
  19. TeamVersionCreateRequest,
  20. TeamVersionResponse,
  21. )
  22. router = APIRouter()
  23. def get_team_application_service(db: Session = Depends(get_db)) -> TeamApplicationService:
  24. return TeamApplicationService(
  25. team_repository=TeamDefinitionRepository(db),
  26. team_version_repository=TeamVersionRepository(db),
  27. team_run_repository=TeamRunRepository(db),
  28. )
  29. @router.get("/health", response_model=ServiceHealth)
  30. def health_check(db: Session = Depends(get_db)) -> ServiceHealth:
  31. db.execute(text("SELECT 1"))
  32. return ServiceHealth(service="team-service", status="ok", database="ok")
  33. @router.post("", response_model=TeamResponse)
  34. def create_team(
  35. payload: TeamCreateRequest,
  36. service: TeamApplicationService = Depends(get_team_application_service),
  37. ) -> TeamResponse:
  38. entity = service.create_team(payload)
  39. return TeamResponse.from_entity(entity)
  40. @router.get("", response_model=list[TeamResponse])
  41. def list_teams(
  42. tenant_id: str = Query(...),
  43. service: TeamApplicationService = Depends(get_team_application_service),
  44. ) -> list[TeamResponse]:
  45. return [TeamResponse.from_entity(item) for item in service.list_teams(tenant_id=tenant_id)]
  46. @router.patch("/{team_id}/status", response_model=TeamResponse)
  47. def update_team_status(
  48. team_id: str,
  49. payload: TeamStatusUpdateRequest,
  50. service: TeamApplicationService = Depends(get_team_application_service),
  51. ) -> TeamResponse:
  52. entity = service.update_team_status(team_id=team_id, payload=payload)
  53. if entity is None:
  54. raise HTTPException(status_code=404, detail=f"team not found: {team_id}")
  55. return TeamResponse.from_entity(entity)
  56. @router.post("/versions", response_model=TeamVersionResponse)
  57. def create_team_version(
  58. payload: TeamVersionCreateRequest,
  59. service: TeamApplicationService = Depends(get_team_application_service),
  60. ) -> TeamVersionResponse:
  61. try:
  62. entity = service.create_team_version(payload)
  63. except ValueError as exc:
  64. raise HTTPException(status_code=422, detail=str(exc)) from exc
  65. return TeamVersionResponse.from_entity(entity)
  66. @router.get("/versions", response_model=list[TeamVersionResponse])
  67. def list_team_versions(
  68. tenant_id: str = Query(...),
  69. team_id: str = Query(...),
  70. service: TeamApplicationService = Depends(get_team_application_service),
  71. ) -> list[TeamVersionResponse]:
  72. return [
  73. TeamVersionResponse.from_entity(item)
  74. for item in service.list_team_versions(tenant_id=tenant_id, team_id=team_id)
  75. ]
  76. @router.post("/runs", response_model=TeamRunResponse)
  77. def create_team_run(
  78. payload: TeamRunCreateRequest,
  79. service: TeamApplicationService = Depends(get_team_application_service),
  80. ) -> TeamRunResponse:
  81. try:
  82. entity = service.create_team_run(payload)
  83. except ValueError as exc:
  84. raise HTTPException(status_code=422, detail=str(exc)) from exc
  85. return TeamRunResponse.from_entity(entity)
  86. @router.get("/runs", response_model=list[TeamRunResponse])
  87. def list_team_runs(
  88. tenant_id: str = Query(...),
  89. team_id: str | None = Query(default=None),
  90. session_id: str | None = Query(default=None),
  91. service: TeamApplicationService = Depends(get_team_application_service),
  92. ) -> list[TeamRunResponse]:
  93. return [
  94. TeamRunResponse.from_entity(item)
  95. for item in service.list_team_runs(
  96. tenant_id=tenant_id,
  97. team_id=team_id,
  98. session_id=session_id,
  99. )
  100. ]
  101. @router.post("/runs/{team_run_id}/status", response_model=TeamRunResponse)
  102. def update_team_run_status(
  103. team_run_id: str,
  104. payload: TeamRunStatusUpdateRequest,
  105. service: TeamApplicationService = Depends(get_team_application_service),
  106. ) -> TeamRunResponse:
  107. entity = service.update_team_run_status(team_run_id=team_run_id, payload=payload)
  108. if entity is None:
  109. raise HTTPException(status_code=404, detail=f"team_run not found: {team_run_id}")
  110. return TeamRunResponse.from_entity(entity)