routes.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. from fastapi import APIRouter, Depends, HTTPException, Query
  2. from sqlalchemy import text
  3. from sqlalchemy.orm import Session
  4. from core_dsl import EdgeDefinition, NodeDefinition, WorkflowDefinition
  5. from core_domain import ServiceHealth
  6. from app.application.services import WorkflowApplicationService
  7. from app.domain.repositories import (
  8. AppDefinitionRepository,
  9. AppVersionRepository,
  10. WorkflowDefinitionRepository,
  11. WorkflowVersionRepository,
  12. )
  13. from app.db.session import get_db
  14. from app.schemas.app import AppCreateRequest, AppResponse, AppVersionCreateRequest, AppVersionResponse
  15. from app.schemas.workflow import (
  16. WorkflowCreateRequest,
  17. WorkflowDefinitionResponse,
  18. WorkflowVersionCreateRequest,
  19. WorkflowVersionResponse,
  20. )
  21. router = APIRouter()
  22. def get_workflow_application_service(db: Session = Depends(get_db)) -> WorkflowApplicationService:
  23. return WorkflowApplicationService(
  24. app_repository=AppDefinitionRepository(db),
  25. workflow_repository=WorkflowDefinitionRepository(db),
  26. app_version_repository=AppVersionRepository(db),
  27. workflow_version_repository=WorkflowVersionRepository(db),
  28. )
  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="workflow-service", status="ok", database="ok")
  33. @router.get("/sample", response_model=WorkflowDefinition)
  34. def get_sample_workflow() -> WorkflowDefinition:
  35. return WorkflowDefinition(
  36. code="sample_workflow",
  37. name="Sample Workflow",
  38. nodes=[
  39. NodeDefinition(id="start", type="llm"),
  40. NodeDefinition(id="end", type="answer"),
  41. ],
  42. edges=[EdgeDefinition(source="start", target="end")],
  43. )
  44. @router.post("/apps", response_model=AppResponse)
  45. def create_app(
  46. payload: AppCreateRequest,
  47. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  48. ) -> AppResponse:
  49. entity = service.create_app(payload)
  50. return AppResponse.from_entity(entity)
  51. @router.get("/apps", response_model=list[AppResponse])
  52. def list_apps(
  53. tenant_id: str = Query(...),
  54. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  55. ) -> list[AppResponse]:
  56. return [AppResponse.from_entity(item) for item in service.list_apps(tenant_id)]
  57. @router.post("/apps/versions", response_model=AppVersionResponse)
  58. def create_app_version(
  59. payload: AppVersionCreateRequest,
  60. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  61. ) -> AppVersionResponse:
  62. entity = service.create_app_version(payload)
  63. return AppVersionResponse.from_entity(entity)
  64. @router.get("/apps/versions", response_model=list[AppVersionResponse])
  65. def list_app_versions(
  66. tenant_id: str = Query(...),
  67. app_id: str = Query(...),
  68. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  69. ) -> list[AppVersionResponse]:
  70. return [AppVersionResponse.from_entity(item) for item in service.list_app_versions(tenant_id, app_id)]
  71. @router.post("", response_model=WorkflowDefinitionResponse)
  72. def create_workflow(
  73. payload: WorkflowCreateRequest,
  74. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  75. ) -> WorkflowDefinitionResponse:
  76. entity = service.create_workflow(payload)
  77. return WorkflowDefinitionResponse.from_entity(entity)
  78. @router.get("", response_model=list[WorkflowDefinitionResponse])
  79. def list_workflows(
  80. tenant_id: str = Query(...),
  81. app_id: str | None = Query(default=None),
  82. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  83. ) -> list[WorkflowDefinitionResponse]:
  84. items = service.list_workflows(tenant_id=tenant_id, app_id=app_id)
  85. return [WorkflowDefinitionResponse.from_entity(item) for item in items]
  86. @router.post("/versions", response_model=WorkflowVersionResponse)
  87. def create_workflow_version(
  88. payload: WorkflowVersionCreateRequest,
  89. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  90. ) -> WorkflowVersionResponse:
  91. entity = service.create_workflow_version(payload)
  92. return WorkflowVersionResponse.from_entity(entity)
  93. @router.get("/versions", response_model=list[WorkflowVersionResponse])
  94. def list_workflow_versions(
  95. tenant_id: str = Query(...),
  96. workflow_id: str = Query(...),
  97. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  98. ) -> list[WorkflowVersionResponse]:
  99. items = service.list_workflow_versions(tenant_id=tenant_id, workflow_id=workflow_id)
  100. return [WorkflowVersionResponse.from_entity(item) for item in items]
  101. @router.get("/versions/{workflow_version_id}", response_model=WorkflowVersionResponse)
  102. def get_workflow_version(
  103. workflow_version_id: str,
  104. tenant_id: str = Query(...),
  105. service: WorkflowApplicationService = Depends(get_workflow_application_service),
  106. ) -> WorkflowVersionResponse:
  107. entity = service.get_workflow_version(tenant_id=tenant_id, workflow_version_id=workflow_version_id)
  108. if entity is None:
  109. raise HTTPException(status_code=404, detail=f"workflow_version not found: {workflow_version_id}")
  110. return WorkflowVersionResponse.from_entity(entity)