""" Linux BenchTools - Main Application """ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager from app.core.config import settings from app.db.init_db import init_db from app.api import benchmark, devices, links, docs @asynccontextmanager async def lifespan(app: FastAPI): """Lifespan events""" # Startup print("🚀 Starting Linux BenchTools...") init_db() print("✅ Linux BenchTools started successfully") yield # Shutdown print("🛑 Shutting down Linux BenchTools...") # Create FastAPI app app = FastAPI( title=settings.APP_NAME, description=settings.APP_DESCRIPTION, version=settings.APP_VERSION, lifespan=lifespan ) # Configure CORS app.add_middleware( CORSMiddleware, allow_origins=settings.CORS_ORIGINS, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Include routers app.include_router(benchmark.router, prefix=settings.API_PREFIX, tags=["Benchmarks"]) app.include_router(devices.router, prefix=settings.API_PREFIX, tags=["Devices"]) app.include_router(links.router, prefix=settings.API_PREFIX, tags=["Links"]) app.include_router(docs.router, prefix=settings.API_PREFIX, tags=["Documents"]) # Root endpoint @app.get("/") async def root(): """Root endpoint""" return { "app": settings.APP_NAME, "version": settings.APP_VERSION, "description": settings.APP_DESCRIPTION, "api_docs": f"{settings.API_PREFIX}/docs" } # Health check @app.get(f"{settings.API_PREFIX}/health") async def health_check(): """Health check endpoint""" return {"status": "ok"} # Stats endpoint (for dashboard) @app.get(f"{settings.API_PREFIX}/stats") async def get_stats(): """Get global statistics""" from sqlalchemy.orm import Session from app.db.session import get_db from app.models.device import Device from app.models.benchmark import Benchmark db: Session = next(get_db()) try: total_devices = db.query(Device).count() total_benchmarks = db.query(Benchmark).count() # Get average score avg_score = db.query(Benchmark).with_entities( db.func.avg(Benchmark.global_score) ).scalar() # Get last benchmark date last_bench = db.query(Benchmark).order_by(Benchmark.run_at.desc()).first() last_bench_date = last_bench.run_at.isoformat() if last_bench else None return { "total_devices": total_devices, "total_benchmarks": total_benchmarks, "avg_global_score": round(avg_score, 2) if avg_score else 0, "last_benchmark_at": last_bench_date } finally: db.close() if __name__ == "__main__": import uvicorn uvicorn.run("app.main:app", host="0.0.0.0", port=8007, reload=True)