from typing import Optional from fastapi import APIRouter, Header from app.schemas.common import ApiResponse from app.services.cluster_runtime_service import get_cluster_snapshot from app.services.runtime_control_service import runtime_action from app.services.runtime_status_service import get_runtime_preflight, get_runtime_status from app.services.sync_push_service import ( ack_detect_task_projection, export_detect_task_projection, ingest_runtime_projection, ) from app.services.sync_record_service import get_sync_summary, list_sync_records router = APIRouter(tags=["runtime"]) @router.get("/runtime/status", response_model=ApiResponse) def runtime_status() -> ApiResponse: return ApiResponse(data=get_runtime_status()) @router.get("/runtime/readiness", response_model=ApiResponse) def runtime_readiness() -> ApiResponse: return ApiResponse(data=(get_runtime_status().get("readiness") or {})) @router.get("/runtime/preflight", response_model=ApiResponse) def runtime_preflight() -> ApiResponse: return ApiResponse(data=get_runtime_preflight()) @router.get("/runtime/cluster", response_model=ApiResponse) def runtime_cluster() -> ApiResponse: return ApiResponse(data=get_cluster_snapshot()) @router.get("/runtime/sync-summary", response_model=ApiResponse) def runtime_sync_summary() -> ApiResponse: return ApiResponse(data=get_sync_summary()) @router.get("/runtime/sync-records", response_model=ApiResponse) def runtime_sync_records(limit: int = 20) -> ApiResponse: return ApiResponse(data={"records": list_sync_records(limit=limit)}) @router.post("/runtime/sync-ingest", response_model=ApiResponse) def runtime_sync_ingest(payload: dict, x_domaincheck_sync_token: Optional[str] = Header(default=None)) -> ApiResponse: ok, message, data = ingest_runtime_projection(payload, shared_token=x_domaincheck_sync_token) return ApiResponse(code=0 if ok else 1, message=message, data=data) @router.get("/runtime/task-export", response_model=ApiResponse) def runtime_task_export(limit: int = 200, x_domaincheck_sync_token: Optional[str] = Header(default=None)) -> ApiResponse: ok, message, data = export_detect_task_projection(limit=limit, shared_token=x_domaincheck_sync_token) return ApiResponse(code=0 if ok else 1, message=message, data=data) @router.post("/runtime/task-ack", response_model=ApiResponse) def runtime_task_ack(payload: dict, x_domaincheck_sync_token: Optional[str] = Header(default=None)) -> ApiResponse: ok, message, data = ack_detect_task_projection(payload, shared_token=x_domaincheck_sync_token) return ApiResponse(code=0 if ok else 1, message=message, data=data) @router.post("/runtime/actions/{action}", response_model=ApiResponse) def runtime_action_trigger(action: str) -> ApiResponse: ok, message, data = runtime_action(action) return ApiResponse(code=0 if ok else 1, message=message, data=data)