78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
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,
|
|
}
|