from __future__ import annotations from typing import Any, Dict from fastapi import APIRouter, Depends, HTTPException, Request from app.config import DATA_DIR from app.engine import DuckDBEngine from app.git_sync import GitSyncManager from app.models import StatusResponse router = APIRouter(tags=["System"]) def get_engine(request: Request) -> DuckDBEngine: return request.app.state.engine def get_git_sync(request: Request) -> Optional[GitSyncManager]: return getattr(request.app.state, "git_sync", None) @router.get("/healthz") async def healthz( request: Request, engine: DuckDBEngine = Depends(get_engine), ) -> Dict[str, Any]: git_sync: Optional[GitSyncManager] = get_git_sync(request) conflict = git_sync.is_conflict if git_sync else False status_str = "conflict" if conflict else "ok" return { "status": status_str, "conflict": conflict, "engine_ready": True, } @router.get("/status", response_model=StatusResponse) async def status( request: Request, engine: DuckDBEngine = Depends(get_engine), ) -> StatusResponse: git_sync: Optional[GitSyncManager] = get_git_sync(request) counts = engine.get_table_counts() return StatusResponse( status=git_sync.status if git_sync else "ok", git_conflict=git_sync.is_conflict if git_sync else False, last_sync_time=git_sync.last_sync_time if git_sync else None, last_commit_hash=git_sync.last_commit_hash if git_sync else None, last_error=git_sync.last_error if git_sync else None, data_dir=str(engine.data_dir), table_counts=counts, ) @router.post("/git/sync") async def trigger_sync( request: Request, engine: DuckDBEngine = Depends(get_engine), ) -> Dict[str, Any]: git_sync: Optional[GitSyncManager] = get_git_sync(request) if not git_sync: raise HTTPException(status_code=400, detail="Git sync is not configured") success = git_sync.pull_rebase() if success: engine.reload_all() return { "status": "ok", "message": "Git pull --rebase completed and DuckDB reloaded.", "commit": git_sync.last_commit_hash, } else: return { "status": git_sync.status, "conflict": git_sync.is_conflict, "error": git_sync.last_error, }