|
|
from fastapi import APIRouter |
|
|
from fastapi.responses import RedirectResponse, JSONResponse |
|
|
from pathlib import Path |
|
|
from pydantic import BaseModel |
|
|
import toml |
|
|
from loguru import logger |
|
|
from environs import Env |
|
|
import json |
|
|
|
|
|
|
|
|
env = Env() |
|
|
env.read_env() |
|
|
REDIRECT_TO_GRADIO_UI = env.bool("REDIRECT_TO_GRADIO_UI", True) |
|
|
|
|
|
router = APIRouter(tags=["management"]) |
|
|
|
|
|
|
|
|
|
|
|
class HealthResponse(BaseModel): |
|
|
status: str = "ok" |
|
|
|
|
|
|
|
|
@router.get("/management/health", response_model=HealthResponse) |
|
|
async def health_check(): |
|
|
""" |
|
|
Health check endpoint, returns 200 if the system is running |
|
|
""" |
|
|
return HealthResponse() |
|
|
|
|
|
|
|
|
|
|
|
__version__ = None |
|
|
|
|
|
|
|
|
def _load_version(): |
|
|
global __version__ |
|
|
if __version__ is not None: |
|
|
return __version__ |
|
|
|
|
|
current_dir = Path(__file__).resolve().parent.parent.parent |
|
|
for i in range(3): |
|
|
pyproject_path = current_dir / "pyproject.toml" |
|
|
if pyproject_path.exists(): |
|
|
with open(pyproject_path, "r") as f: |
|
|
config = toml.load(f) |
|
|
__version__ = config["project"]["version"] |
|
|
logger.info(f"API Version: {__version__}") |
|
|
return __version__ |
|
|
|
|
|
__version__ = "unknown" |
|
|
logger.warning(f"App Version is not found in pyproject.toml path: {pyproject_path}") |
|
|
return __version__ |
|
|
|
|
|
|
|
|
@router.get("/version") |
|
|
@router.get("/management/version") |
|
|
async def version_api(): |
|
|
""" |
|
|
Version endpoint, returns the version of the system |
|
|
""" |
|
|
return {"version": _load_version()} |
|
|
|
|
|
|
|
|
def _get_manifest() -> JSONResponse: |
|
|
print("get manifest") |
|
|
current_dir = Path(__file__).resolve().parent.parent.parent |
|
|
manifest_path = current_dir / "static" / "manifest.json" |
|
|
with open(manifest_path, "r") as f: |
|
|
return JSONResponse(json.load(f)) |
|
|
|
|
|
|
|
|
|
|
|
@router.get("/") |
|
|
async def root(): |
|
|
""" |
|
|
Redirect root to Gradio UI |
|
|
""" |
|
|
if REDIRECT_TO_GRADIO_UI: |
|
|
return RedirectResponse(url="/ui") |
|
|
else: |
|
|
return _get_manifest() |
|
|
|
|
|
|
|
|
|
|
|
@router.get("/manifest.json") |
|
|
async def get_manifest(): |
|
|
"""Return the web app manifest""" |
|
|
return _get_manifest() |
|
|
|