routes.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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.schemas.message import MessageCreateRequest, MessageListRequest, MessageResponse
  10. from app.schemas.run_request import (
  11. RunRequestCreateRequest,
  12. RunRequestDetailRequest,
  13. RunRequestListRequest,
  14. RunRequestResponse,
  15. RunRequestUpdateRequest,
  16. )
  17. from app.schemas.session import SessionCreateRequest, SessionDetailRequest, SessionListRequest, 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. @router.get("/health", response_model=ServiceHealth)
  29. def health_check(db: Session = Depends(get_db)) -> ServiceHealth:
  30. db.execute(text("SELECT 1"))
  31. return ServiceHealth(service="session-service", status="ok", database="ok")
  32. @router.post("", response_model=SessionResponse)
  33. def create_session(
  34. payload: SessionCreateRequest,
  35. service: SessionApplicationService = Depends(get_session_application_service)) -> SessionResponse:
  36. entity = service.create_session(payload)
  37. return SessionResponse.from_entity(entity)
  38. @router.get("", response_model=list[SessionResponse])
  39. def list_sessions(
  40. app_id: str | None = Query(default=None),
  41. service: SessionApplicationService = Depends(get_session_application_service)) -> list[SessionResponse]:
  42. return [SessionResponse.from_entity(item) for item in service.list_sessions(app_id)]
  43. @router.post("/list", response_model=list[SessionResponse])
  44. def list_sessions_post(
  45. payload: SessionListRequest,
  46. service: SessionApplicationService = Depends(get_session_application_service)) -> list[SessionResponse]:
  47. return [SessionResponse.from_entity(item) for item in service.list_sessions(payload.app_id)]
  48. @router.post("/detail", response_model=SessionResponse)
  49. def detail_session(
  50. payload: SessionDetailRequest,
  51. service: SessionApplicationService = Depends(get_session_application_service)) -> SessionResponse:
  52. entity = service.get_session(session_id=payload.session_id)
  53. if entity is None:
  54. raise HTTPException(status_code=404, detail=f"session not found: {payload.session_id}")
  55. return SessionResponse.from_entity(entity)
  56. @router.post("/messages", response_model=MessageResponse)
  57. def create_message(
  58. payload: MessageCreateRequest,
  59. service: SessionApplicationService = Depends(get_session_application_service)) -> MessageResponse:
  60. entity = service.create_message(payload)
  61. return MessageResponse.from_entity(entity)
  62. @router.get("/messages", response_model=list[MessageResponse])
  63. def list_messages(
  64. session_id: str = Query(...),
  65. service: SessionApplicationService = Depends(get_session_application_service)) -> list[MessageResponse]:
  66. return [
  67. MessageResponse.from_entity(item)
  68. for item in service.list_messages(session_id=session_id)
  69. ]
  70. @router.post("/messages/list", response_model=list[MessageResponse])
  71. def list_messages_post(
  72. payload: MessageListRequest,
  73. service: SessionApplicationService = Depends(get_session_application_service)) -> list[MessageResponse]:
  74. return [
  75. MessageResponse.from_entity(item)
  76. for item in service.list_messages(session_id=payload.session_id)
  77. ]
  78. @router.post("/run-requests", response_model=RunRequestResponse)
  79. def create_run_request(
  80. payload: RunRequestCreateRequest,
  81. service: SessionApplicationService = Depends(get_session_application_service)) -> RunRequestResponse:
  82. entity = service.create_run_request(payload)
  83. return RunRequestResponse.from_entity(entity)
  84. @router.get("/run-requests", response_model=list[RunRequestResponse])
  85. def list_run_requests(
  86. session_id: str = Query(...),
  87. service: SessionApplicationService = Depends(get_session_application_service)) -> list[RunRequestResponse]:
  88. return [
  89. RunRequestResponse.from_entity(item)
  90. for item in service.list_run_requests(session_id=session_id)
  91. ]
  92. @router.post("/run-requests/list", response_model=list[RunRequestResponse])
  93. def list_run_requests_post(
  94. payload: RunRequestListRequest,
  95. service: SessionApplicationService = Depends(get_session_application_service)) -> list[RunRequestResponse]:
  96. return [
  97. RunRequestResponse.from_entity(item)
  98. for item in service.list_run_requests(session_id=payload.session_id)
  99. ]
  100. @router.post("/run-requests/detail", response_model=RunRequestResponse)
  101. def get_run_request(
  102. payload: RunRequestDetailRequest,
  103. service: SessionApplicationService = Depends(get_session_application_service)) -> RunRequestResponse:
  104. entity = service.run_request_repository.get_by_id(run_request_id=payload.run_request_id)
  105. if entity is None:
  106. raise HTTPException(status_code=404, detail=f"run_request not found: {payload.run_request_id}")
  107. return RunRequestResponse.from_entity(entity)
  108. @router.post("/run-requests/update", response_model=RunRequestResponse)
  109. def update_run_request(
  110. payload: RunRequestUpdateRequest,
  111. service: SessionApplicationService = Depends(get_session_application_service)) -> RunRequestResponse:
  112. entity = service.update_run_request(payload)
  113. if entity is None:
  114. raise HTTPException(status_code=404, detail=f"run_request not found: {payload.run_request_id}")
  115. return RunRequestResponse.from_entity(entity)