routes.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 ToolApplicationService
  6. from app.db.session import get_db
  7. from app.domain.repositories import ToolBindingRepository, ToolDefinitionRepository, ToolVersionRepository
  8. from app.schemas.tool import (
  9. ToolBindingCreateRequest,
  10. ToolBindingDetailResponse,
  11. ToolBindingResponse,
  12. ToolCreateRequest,
  13. ToolResponse,
  14. ToolVersionCreateRequest,
  15. ToolVersionResponse,
  16. )
  17. router = APIRouter()
  18. def get_tool_application_service(db: Session = Depends(get_db)) -> ToolApplicationService:
  19. return ToolApplicationService(
  20. tool_definition_repository=ToolDefinitionRepository(db),
  21. tool_version_repository=ToolVersionRepository(db),
  22. tool_binding_repository=ToolBindingRepository(db),
  23. )
  24. @router.get("/health", response_model=ServiceHealth)
  25. def health_check(db: Session = Depends(get_db)) -> ServiceHealth:
  26. db.execute(text("SELECT 1"))
  27. return ServiceHealth(service="tool-service", status="ok", database="ok")
  28. @router.post("", response_model=ToolResponse)
  29. def create_tool_definition(
  30. payload: ToolCreateRequest,
  31. service: ToolApplicationService = Depends(get_tool_application_service),
  32. ) -> ToolResponse:
  33. entity = service.create_tool_definition(payload)
  34. return ToolResponse.from_entity(entity)
  35. @router.get("", response_model=list[ToolResponse])
  36. def list_tool_definitions(
  37. tenant_id: str = Query(...),
  38. service: ToolApplicationService = Depends(get_tool_application_service),
  39. ) -> list[ToolResponse]:
  40. return [ToolResponse.from_entity(item) for item in service.list_tool_definitions(tenant_id)]
  41. @router.post("/versions", response_model=ToolVersionResponse)
  42. def create_tool_version(
  43. payload: ToolVersionCreateRequest,
  44. service: ToolApplicationService = Depends(get_tool_application_service),
  45. ) -> ToolVersionResponse:
  46. entity = service.create_tool_version(payload)
  47. return ToolVersionResponse.from_entity(entity)
  48. @router.get("/versions", response_model=list[ToolVersionResponse])
  49. def list_tool_versions(
  50. tenant_id: str = Query(...),
  51. tool_id: str = Query(...),
  52. service: ToolApplicationService = Depends(get_tool_application_service),
  53. ) -> list[ToolVersionResponse]:
  54. return [
  55. ToolVersionResponse.from_entity(item)
  56. for item in service.list_tool_versions(tenant_id=tenant_id, tool_id=tool_id)
  57. ]
  58. @router.post("/bindings", response_model=ToolBindingResponse)
  59. def create_tool_binding(
  60. payload: ToolBindingCreateRequest,
  61. service: ToolApplicationService = Depends(get_tool_application_service),
  62. ) -> ToolBindingResponse:
  63. entity = service.create_tool_binding(payload)
  64. return ToolBindingResponse.from_entity(entity)
  65. @router.get("/bindings", response_model=list[ToolBindingResponse])
  66. def list_tool_bindings(
  67. tenant_id: str = Query(...),
  68. app_id: str | None = Query(default=None),
  69. service: ToolApplicationService = Depends(get_tool_application_service),
  70. ) -> list[ToolBindingResponse]:
  71. return [
  72. ToolBindingResponse.from_entity(item)
  73. for item in service.list_tool_bindings(tenant_id=tenant_id, app_id=app_id)
  74. ]
  75. @router.get("/bindings/{binding_id}", response_model=ToolBindingDetailResponse)
  76. def get_tool_binding_detail(
  77. binding_id: str,
  78. tenant_id: str = Query(...),
  79. service: ToolApplicationService = Depends(get_tool_application_service),
  80. ) -> ToolBindingDetailResponse:
  81. result = service.get_tool_binding_detail(tenant_id=tenant_id, binding_id=binding_id)
  82. if result is None:
  83. raise HTTPException(status_code=404, detail=f"tool_binding not found: {binding_id}")
  84. binding, tool_version, tool_definition = result
  85. return ToolBindingDetailResponse(
  86. binding=ToolBindingResponse.from_entity(binding),
  87. tool_version=ToolVersionResponse.from_entity(tool_version),
  88. tool_definition=ToolResponse.from_entity(tool_definition),
  89. )