from fastapi import FastAPI, Request from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from fastapi.middleware.cors import CORSMiddleware from pathlib import Path from app.core.config import settings from app.api.v1.analyze import router as api_router BASE_DIR = Path(__file__).resolve().parent app = FastAPI( title=settings.APP_NAME, version=settings.APP_VERSION, description="On-demand crypto market intelligence and decision terminal powered by TypeSafe Jev System One." ) # CORS Configuration allowed_origins_raw = [o.strip() for o in settings.ALLOWED_ORIGINS.split(",") if o.strip()] allow_credentials = "*" not in allowed_origins_raw app.add_middleware( CORSMiddleware, allow_origins=allowed_origins_raw, allow_credentials=allow_credentials, allow_methods=["*"], allow_headers=["*"], ) # Mount Static Files and Templates static_dir = BASE_DIR / "static" templates_dir = BASE_DIR / "templates" static_dir.mkdir(parents=True, exist_ok=True) templates_dir.mkdir(parents=True, exist_ok=True) app.mount("/static", StaticFiles(directory=str(static_dir)), name="static") templates = Jinja2Templates(directory=str(templates_dir)) # Include API Router app.include_router(api_router, prefix="/api") @app.get("/", summary="Main Terminal UI") async def root(request: Request): return templates.TemplateResponse( request=request, name="index.html", context={ "app_name": settings.APP_NAME, "has_typesafe_key": bool(settings.TYPESAFE_API_KEY), "has_twitter_key": bool(settings.TWITTER_API_KEY) } ) @app.get("/health", summary="Health check") async def health(): return { "status": "healthy", "app": settings.APP_NAME, "version": settings.APP_VERSION, "typesafe_configured": bool(settings.TYPESAFE_API_KEY), "twitter_configured": bool(settings.TWITTER_API_KEY) }