66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
from fastapi import FastAPI, BackgroundTasks, HTTPException
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.responses import FileResponse
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
import os
|
|
import json
|
|
import asyncio
|
|
import sys
|
|
|
|
if sys.platform == 'win32':
|
|
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
|
|
|
from backend.scheduler import start_scheduler
|
|
from backend.core.scanner import (
|
|
load_json, scan_schema_for_db, scan_images_for_db_table, load_config, get_scan_status,
|
|
SCHEMA_RESULTS_PATH, IMAGE_RESULTS_PATH
|
|
)
|
|
|
|
app = FastAPI(title="DB Health & Image Sync Monitor")
|
|
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
@app.on_event("startup")
|
|
async def startup_event():
|
|
start_scheduler()
|
|
|
|
@app.get("/api/status")
|
|
async def get_status():
|
|
return get_scan_status()
|
|
|
|
@app.get("/api/schema/latest")
|
|
async def get_schema_latest():
|
|
return load_json(SCHEMA_RESULTS_PATH)
|
|
|
|
@app.get("/api/image/latest")
|
|
async def get_image_latest():
|
|
return load_json(IMAGE_RESULTS_PATH)
|
|
|
|
@app.post("/api/scan/schema/{db_name}")
|
|
async def trigger_schema_scan(db_name: str):
|
|
config = load_config()
|
|
result = await scan_schema_for_db(db_name, config)
|
|
return result
|
|
|
|
@app.post("/api/scan/image/{db_name}/{table_name}")
|
|
async def trigger_image_scan(db_name: str, table_name: str):
|
|
config = load_config()
|
|
result = await scan_images_for_db_table(db_name, table_name, config)
|
|
return result
|
|
|
|
frontend_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'frontend')
|
|
app.mount("/static", StaticFiles(directory=frontend_dir), name="static")
|
|
|
|
@app.get("/")
|
|
async def serve_index():
|
|
return FileResponse(
|
|
os.path.join(frontend_dir, 'index.html'),
|
|
headers={"Cache-Control": "no-cache, no-store, must-revalidate"}
|
|
)
|