routes.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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 SkillApplicationService
  6. from app.db.session import get_db
  7. from app.domain.repositories import (
  8. SkillDefinitionRepository,
  9. SkillInstallationRepository,
  10. SkillRunRepository,
  11. SkillVersionRepository,
  12. )
  13. from app.schemas.skill import (
  14. SkillCreateRequest,
  15. SkillInstallationResponse,
  16. SkillInstallationStatusUpdateRequest,
  17. SkillInstallRequest,
  18. SkillResponse,
  19. SkillRunCreateRequest,
  20. SkillRunExecuteRequest,
  21. SkillRunResponse,
  22. SkillStatusUpdateRequest,
  23. SkillVersionCreateRequest,
  24. SkillVersionResponse,
  25. )
  26. router = APIRouter()
  27. def get_skill_application_service(db: Session = Depends(get_db)) -> SkillApplicationService:
  28. return SkillApplicationService(
  29. skill_repository=SkillDefinitionRepository(db),
  30. skill_version_repository=SkillVersionRepository(db),
  31. installation_repository=SkillInstallationRepository(db),
  32. skill_run_repository=SkillRunRepository(db))
  33. @router.get("/health", response_model=ServiceHealth)
  34. def health_check(db: Session = Depends(get_db)) -> ServiceHealth:
  35. db.execute(text("SELECT 1"))
  36. return ServiceHealth(service="skill-service", status="ok", database="ok")
  37. @router.post("", response_model=SkillResponse)
  38. def create_skill(
  39. payload: SkillCreateRequest,
  40. service: SkillApplicationService = Depends(get_skill_application_service)) -> SkillResponse:
  41. return SkillResponse.from_entity(service.create_skill(payload))
  42. @router.get("", response_model=list[SkillResponse])
  43. def list_skills(
  44. service: SkillApplicationService = Depends(get_skill_application_service)) -> list[SkillResponse]:
  45. return [SkillResponse.from_entity(item) for item in service.list_skills()]
  46. @router.patch("/{skill_id}/status", response_model=SkillResponse)
  47. def update_skill_status(
  48. skill_id: str,
  49. payload: SkillStatusUpdateRequest,
  50. service: SkillApplicationService = Depends(get_skill_application_service)) -> SkillResponse:
  51. entity = service.update_skill_status(skill_id=skill_id, payload=payload)
  52. if entity is None:
  53. raise HTTPException(status_code=404, detail=f"skill not found: {skill_id}")
  54. return SkillResponse.from_entity(entity)
  55. @router.post("/versions", response_model=SkillVersionResponse)
  56. def create_skill_version(
  57. payload: SkillVersionCreateRequest,
  58. service: SkillApplicationService = Depends(get_skill_application_service)) -> SkillVersionResponse:
  59. try:
  60. return SkillVersionResponse.from_entity(service.create_skill_version(payload))
  61. except ValueError as exc:
  62. raise HTTPException(status_code=422, detail=str(exc)) from exc
  63. @router.get("/versions", response_model=list[SkillVersionResponse])
  64. def list_skill_versions(
  65. skill_id: str = Query(...),
  66. service: SkillApplicationService = Depends(get_skill_application_service)) -> list[SkillVersionResponse]:
  67. return [
  68. SkillVersionResponse.from_entity(item)
  69. for item in service.list_skill_versions(skill_id=skill_id)
  70. ]
  71. @router.post("/installations", response_model=SkillInstallationResponse)
  72. def install_skill(
  73. payload: SkillInstallRequest,
  74. service: SkillApplicationService = Depends(get_skill_application_service)) -> SkillInstallationResponse:
  75. try:
  76. return SkillInstallationResponse.from_entity(service.install_skill(payload))
  77. except ValueError as exc:
  78. raise HTTPException(status_code=422, detail=str(exc)) from exc
  79. @router.get("/installations", response_model=list[SkillInstallationResponse])
  80. def list_installations(
  81. install_scope: str | None = Query(default=None),
  82. scope_id: str | None = Query(default=None),
  83. service: SkillApplicationService = Depends(get_skill_application_service)) -> list[SkillInstallationResponse]:
  84. return [
  85. SkillInstallationResponse.from_entity(item)
  86. for item in service.list_installations(
  87. install_scope=install_scope,
  88. scope_id=scope_id)
  89. ]
  90. @router.patch("/installations/{installation_id}/status", response_model=SkillInstallationResponse)
  91. def update_installation_status(
  92. installation_id: str,
  93. payload: SkillInstallationStatusUpdateRequest,
  94. service: SkillApplicationService = Depends(get_skill_application_service)) -> SkillInstallationResponse:
  95. entity = service.update_installation_status(installation_id=installation_id, payload=payload)
  96. if entity is None:
  97. raise HTTPException(status_code=404, detail=f"skill installation not found: {installation_id}")
  98. return SkillInstallationResponse.from_entity(entity)
  99. @router.post("/runs", response_model=SkillRunResponse)
  100. def create_skill_run(
  101. payload: SkillRunCreateRequest,
  102. service: SkillApplicationService = Depends(get_skill_application_service)) -> SkillRunResponse:
  103. try:
  104. return SkillRunResponse.from_entity(service.create_skill_run(payload))
  105. except ValueError as exc:
  106. raise HTTPException(status_code=422, detail=str(exc)) from exc
  107. @router.post("/runs/{skill_run_id}/execute", response_model=SkillRunResponse)
  108. def execute_skill_run(
  109. skill_run_id: str,
  110. payload: SkillRunExecuteRequest,
  111. service: SkillApplicationService = Depends(get_skill_application_service)) -> SkillRunResponse:
  112. entity = service.execute_skill_run(skill_run_id=skill_run_id, payload=payload)
  113. if entity is None:
  114. raise HTTPException(status_code=404, detail=f"skill_run not found: {skill_run_id}")
  115. return SkillRunResponse.from_entity(entity)