121 lines
4.4 KiB
Python
121 lines
4.4 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
from typing import Callable
|
|
|
|
from fastapi import FastAPI, HTTPException
|
|
from fastapi.responses import FileResponse, Response
|
|
|
|
from .admin_db_status import fetch_db_status_snapshot, fetch_db_table_preview
|
|
|
|
|
|
def register_system_routes(
|
|
app: FastAPI,
|
|
*,
|
|
upload_dir: Path,
|
|
legacy_dir: Path,
|
|
incoming_files_dir: Path,
|
|
incoming_served_dir: Path,
|
|
db_status_served_dir: Path,
|
|
business_ledger_index_path: Path,
|
|
get_member_count: Callable[[], int],
|
|
get_conn,
|
|
build_business_ledger_default_response: Callable[[object], Response],
|
|
build_ledger_index_response: Callable[[Path], FileResponse],
|
|
) -> None:
|
|
@app.get("/api/health")
|
|
def health() -> dict[str, object]:
|
|
checks = {
|
|
"upload_dir": upload_dir.exists(),
|
|
}
|
|
|
|
try:
|
|
member_count = get_member_count()
|
|
checks["database"] = True
|
|
except Exception:
|
|
member_count = None
|
|
checks["database"] = False
|
|
|
|
status = "ok" if all(checks.values()) else "degraded"
|
|
return {
|
|
"status": status,
|
|
"checks": checks,
|
|
"member_count": member_count,
|
|
"timestamp": datetime.utcnow().isoformat() + "Z",
|
|
}
|
|
|
|
@app.get("/api/admin/db-status")
|
|
def admin_db_status() -> dict[str, object]:
|
|
return fetch_db_status_snapshot()
|
|
|
|
@app.get("/api/admin/db-status/table")
|
|
def admin_db_status_table(schema: str, table: str, limit: int = 50) -> dict[str, object]:
|
|
return fetch_db_table_preview(schema, table, limit)
|
|
|
|
@app.get("/admin/db-status")
|
|
def admin_db_status_view() -> FileResponse:
|
|
target = db_status_served_dir / "index.html"
|
|
if not target.exists():
|
|
raise HTTPException(status_code=404, detail="DB status dashboard file not found.")
|
|
response = FileResponse(target)
|
|
response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0"
|
|
response.headers["Pragma"] = "no-cache"
|
|
return response
|
|
|
|
@app.get("/api/integration/business-ledger-default")
|
|
def integration_business_ledger_default() -> Response:
|
|
with get_conn() as conn:
|
|
with conn.cursor() as cur:
|
|
return build_business_ledger_default_response(cur)
|
|
|
|
@app.get("/api/integration/mh-workbook")
|
|
def integration_mh_workbook() -> FileResponse:
|
|
target = incoming_files_dir / "MH.xlsx"
|
|
if not target.exists():
|
|
raise HTTPException(status_code=404, detail="MH workbook not found.")
|
|
return FileResponse(
|
|
target,
|
|
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
filename="MH.xlsx",
|
|
)
|
|
|
|
@app.get("/legacy/organization")
|
|
def legacy_organization() -> FileResponse:
|
|
target = legacy_dir / "DashBoard-organization.html"
|
|
if not target.exists():
|
|
raise HTTPException(status_code=404, detail="Legacy dashboard file not found.")
|
|
return FileResponse(target)
|
|
|
|
@app.get("/legacy/organization-backup")
|
|
def legacy_organization_backup() -> FileResponse:
|
|
target = legacy_dir / "DashBoard-organization-backup.html"
|
|
if not target.exists():
|
|
raise HTTPException(status_code=404, detail="Legacy dashboard backup not found.")
|
|
return FileResponse(target)
|
|
|
|
@app.get("/integrations/payment")
|
|
def integration_payment() -> FileResponse:
|
|
target = incoming_served_dir / "payment.html"
|
|
if not target.exists():
|
|
raise HTTPException(status_code=404, detail="Payment integration file not found.")
|
|
return FileResponse(target)
|
|
|
|
@app.get("/integrations/ledger")
|
|
def integration_ledger() -> FileResponse:
|
|
return build_ledger_index_response(business_ledger_index_path)
|
|
|
|
@app.get("/integrations/mh")
|
|
def integration_mh() -> FileResponse:
|
|
target = incoming_served_dir / "mh.html"
|
|
if not target.exists():
|
|
raise HTTPException(status_code=404, detail="MH integration file not found.")
|
|
return FileResponse(target)
|
|
|
|
@app.get("/uploads/{filename}")
|
|
def get_upload(filename: str) -> FileResponse:
|
|
target = upload_dir / filename
|
|
if not target.exists():
|
|
raise HTTPException(status_code=404, detail="Upload not found.")
|
|
return FileResponse(target)
|