feat(family): deploy Single-Writer DuckDB backend, Mila parent cockpit & feeding analytics, and Moritz macro tracker
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
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,
|
||||
}
|
||||
Reference in New Issue
Block a user