routes.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. from core_domain import ServiceHealth
  2. from core_shared import error_detail
  3. from fastapi import APIRouter, Depends, HTTPException, Query
  4. from sqlalchemy import text
  5. from sqlalchemy.orm import Session
  6. from app.application.services import SessionApplicationService
  7. from app.bootstrap.settings import SessionServiceSettings
  8. from app.db.session import get_db
  9. from app.domain.repositories import MessageRepository, RunRequestRepository, SessionRepository
  10. from app.schemas.message import MessageCreateRequest, MessageListRequest, MessageResponse
  11. from app.schemas.run_request import (
  12. RunRequestCreateRequest,
  13. RunRequestDetailRequest,
  14. RunRequestListRequest,
  15. RunRequestResponse,
  16. RunRequestUpdateRequest,
  17. )
  18. from app.schemas.session import SessionCreateRequest, SessionDetailRequest, SessionListRequest, SessionResponse
  19. router = APIRouter()
  20. def get_session_settings() -> SessionServiceSettings:
  21. return SessionServiceSettings()
  22. def get_session_application_service(
  23. db: Session = Depends(get_db),
  24. settings: SessionServiceSettings = Depends(get_session_settings)) -> SessionApplicationService:
  25. return SessionApplicationService(
  26. session_repository=SessionRepository(db),
  27. message_repository=MessageRepository(db),
  28. run_request_repository=RunRequestRepository(db))
  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("/list", response_model=list[SessionResponse])
  45. def list_sessions_post(
  46. payload: SessionListRequest,
  47. service: SessionApplicationService = Depends(get_session_application_service)) -> list[SessionResponse]:
  48. return [SessionResponse.from_entity(item) for item in service.list_sessions(payload.app_id)]
  49. @router.post("/detail", response_model=SessionResponse)
  50. def detail_session(
  51. payload: SessionDetailRequest,
  52. service: SessionApplicationService = Depends(get_session_application_service)) -> SessionResponse:
  53. entity = service.get_session(session_id=payload.session_id)
  54. if entity is None:
  55. raise HTTPException(status_code=404, detail=error_detail("error.session.not_found", id=payload.session_id))
  56. return SessionResponse.from_entity(entity)
  57. @router.post("/messages", response_model=MessageResponse)
  58. def create_message(
  59. payload: MessageCreateRequest,
  60. service: SessionApplicationService = Depends(get_session_application_service)) -> MessageResponse:
  61. entity = service.create_message(payload)
  62. return MessageResponse.from_entity(entity)
  63. @router.get("/messages", response_model=list[MessageResponse])
  64. def list_messages(
  65. session_id: str = Query(...),
  66. service: SessionApplicationService = Depends(get_session_application_service)) -> list[MessageResponse]:
  67. return [
  68. MessageResponse.from_entity(item)
  69. for item in service.list_messages(session_id=session_id)
  70. ]
  71. @router.post("/messages/list", response_model=list[MessageResponse])
  72. def list_messages_post(
  73. payload: MessageListRequest,
  74. service: SessionApplicationService = Depends(get_session_application_service)) -> list[MessageResponse]:
  75. return [
  76. MessageResponse.from_entity(item)
  77. for item in service.list_messages(session_id=payload.session_id)
  78. ]
  79. @router.post("/run-requests", response_model=RunRequestResponse)
  80. def create_run_request(
  81. payload: RunRequestCreateRequest,
  82. service: SessionApplicationService = Depends(get_session_application_service)) -> RunRequestResponse:
  83. entity = service.create_run_request(payload)
  84. return RunRequestResponse.from_entity(entity)
  85. @router.get("/run-requests", response_model=list[RunRequestResponse])
  86. def list_run_requests(
  87. session_id: str = Query(...),
  88. service: SessionApplicationService = Depends(get_session_application_service)) -> list[RunRequestResponse]:
  89. return [
  90. RunRequestResponse.from_entity(item)
  91. for item in service.list_run_requests(session_id=session_id)
  92. ]
  93. @router.post("/run-requests/list", response_model=list[RunRequestResponse])
  94. def list_run_requests_post(
  95. payload: RunRequestListRequest,
  96. service: SessionApplicationService = Depends(get_session_application_service)) -> list[RunRequestResponse]:
  97. return [
  98. RunRequestResponse.from_entity(item)
  99. for item in service.list_run_requests(session_id=payload.session_id)
  100. ]
  101. @router.post("/run-requests/detail", response_model=RunRequestResponse)
  102. def get_run_request(
  103. payload: RunRequestDetailRequest,
  104. service: SessionApplicationService = Depends(get_session_application_service)) -> RunRequestResponse:
  105. entity = service.run_request_repository.get_by_id(run_request_id=payload.run_request_id)
  106. if entity is None:
  107. raise HTTPException(status_code=404, detail=error_detail("error.run_request.not_found", id=payload.run_request_id))
  108. return RunRequestResponse.from_entity(entity)
  109. @router.post("/run-requests/update", response_model=RunRequestResponse)
  110. def update_run_request(
  111. payload: RunRequestUpdateRequest,
  112. service: SessionApplicationService = Depends(get_session_application_service)) -> RunRequestResponse:
  113. entity = service.update_run_request(payload)
  114. if entity is None:
  115. raise HTTPException(status_code=404, detail=error_detail("error.run_request.not_found", id=payload.run_request_id))
  116. return RunRequestResponse.from_entity(entity)