|
|
from contextlib import asynccontextmanager |
|
|
from fastapi import FastAPI |
|
|
from fastapi.middleware.cors import CORSMiddleware |
|
|
from fastapi.staticfiles import StaticFiles |
|
|
from fastapi.responses import FileResponse |
|
|
from pathlib import Path |
|
|
import os |
|
|
|
|
|
from backend.core.database import init_db |
|
|
from backend.api.api import api_router |
|
|
|
|
|
@asynccontextmanager |
|
|
async def lifespan(app: FastAPI): |
|
|
|
|
|
try: |
|
|
await init_db() |
|
|
except Exception as e: |
|
|
print(f"WARNING: Database initialization failed. Running in MOCK mode. Error: {e}") |
|
|
yield |
|
|
|
|
|
|
|
|
app = FastAPI( |
|
|
title="GeoQuery API", |
|
|
description="Geospatial Analysis Agent API", |
|
|
version="0.1.0", |
|
|
lifespan=lifespan |
|
|
) |
|
|
|
|
|
app.add_middleware( |
|
|
CORSMiddleware, |
|
|
allow_origins=["*"], |
|
|
allow_credentials=True, |
|
|
allow_methods=["*"], |
|
|
allow_headers=["*"], |
|
|
) |
|
|
|
|
|
app.include_router(api_router, prefix="/api/v1") |
|
|
|
|
|
|
|
|
static_dir = Path(__file__).parent / "static" |
|
|
|
|
|
if static_dir.exists(): |
|
|
app.mount("/_next", StaticFiles(directory=static_dir / "_next"), name="next") |
|
|
|
|
|
|
|
|
@app.get("/{full_path:path}") |
|
|
async def serve_frontend(full_path: str): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
file_path = static_dir / full_path |
|
|
if file_path.exists() and file_path.is_file(): |
|
|
return FileResponse(file_path) |
|
|
|
|
|
|
|
|
index_path = static_dir / "index.html" |
|
|
if index_path.exists(): |
|
|
return FileResponse(index_path) |
|
|
return {"error": "Frontend not found"} |
|
|
else: |
|
|
@app.get("/") |
|
|
def read_root(): |
|
|
return {"message": "GeoQuery API is running (Frontend not built)"} |
|
|
|