routes.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 SessionApplicationService
  6. from app.bootstrap.settings import SessionServiceSettings
  7. from app.db.session import get_db
  8. from app.domain.repositories import MessageRepository, RunRequestRepository, SessionRepository
  9. from app.infrastructure.runtime_client import RuntimeServiceClient, RuntimeServiceClientError
  10. from app.schemas.message import MessageCreateRequest, MessageResponse
  11. from app.schemas.run_request import DispatchRunRequest, DispatchRunResponse, RunRequestCreateRequest, RunRequestResponse
  12. from app.schemas.session import SessionCreateRequest, SessionResponse
  13. router = APIRouter()
  14. def get_session_settings() -> SessionServiceSettings:
  15. return SessionServiceSettings()
  16. def get_session_application_service(
  17. db: Session = Depends(get_db),
  18. settings: SessionServiceSettings = Depends(get_session_settings),
  19. ) -> SessionApplicationService:
  20. return SessionApplicationService(
  21. session_repository=SessionRepository(db),
  22. message_repository=MessageRepository(db),
  23. run_request_repository=RunRequestRepository(db),
  24. runtime_client=RuntimeServiceClient(base_url=settings.runtime_service_url),
  25. )
  26. @router.get("/health", response_model=ServiceHealth)
  27. def health_check(db: Session = Depends(get_db)) -> ServiceHealth:
  28. db.execute(text("SELECT 1"))
  29. return ServiceHealth(service="session-service", status="ok", database="ok")
  30. @router.post("", response_model=SessionResponse)
  31. def create_session(
  32. payload: SessionCreateRequest,
  33. service: SessionApplicationService = Depends(get_session_application_service),
  34. ) -> SessionResponse:
  35. entity = service.create_session(payload)
  36. return SessionResponse.from_entity(entity)
  37. @router.get("", response_model=list[SessionResponse])
  38. def list_sessions(
  39. tenant_id: str = Query(...),
  40. app_id: str | None = Query(default=None),
  41. service: SessionApplicationService = Depends(get_session_application_service),
  42. ) -> list[SessionResponse]:
  43. return [SessionResponse.from_entity(item) for item in service.list_sessions(tenant_id, app_id)]
  44. @router.post("/messages", response_model=MessageResponse)
  45. def create_message(
  46. payload: MessageCreateRequest,
  47. service: SessionApplicationService = Depends(get_session_application_service),
  48. ) -> MessageResponse:
  49. entity = service.create_message(payload)
  50. return MessageResponse.from_entity(entity)
  51. @router.get("/messages", response_model=list[MessageResponse])
  52. def list_messages(
  53. tenant_id: str = Query(...),
  54. session_id: str = Query(...),
  55. service: SessionApplicationService = Depends(get_session_application_service),
  56. ) -> list[MessageResponse]:
  57. return [
  58. MessageResponse.from_entity(item)
  59. for item in service.list_messages(tenant_id=tenant_id, session_id=session_id)
  60. ]
  61. @router.post("/run-requests", response_model=RunRequestResponse)
  62. def create_run_request(
  63. payload: RunRequestCreateRequest,
  64. service: SessionApplicationService = Depends(get_session_application_service),
  65. ) -> RunRequestResponse:
  66. entity = service.create_run_request(payload)
  67. return RunRequestResponse.from_entity(entity)
  68. @router.get("/run-requests", response_model=list[RunRequestResponse])
  69. def list_run_requests(
  70. tenant_id: str = Query(...),
  71. session_id: str = Query(...),
  72. service: SessionApplicationService = Depends(get_session_application_service),
  73. ) -> list[RunRequestResponse]:
  74. return [
  75. RunRequestResponse.from_entity(item)
  76. for item in service.list_run_requests(tenant_id=tenant_id, session_id=session_id)
  77. ]
  78. @router.post("/run-requests/dispatch", response_model=DispatchRunResponse)
  79. def dispatch_run_request(
  80. payload: DispatchRunRequest,
  81. service: SessionApplicationService = Depends(get_session_application_service),
  82. ) -> DispatchRunResponse:
  83. try:
  84. return service.dispatch_run_request(payload)
  85. except RuntimeServiceClientError as exc:
  86. raise HTTPException(status_code=502, detail=str(exc)) from exc