routes.py 3.9 KB

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