Dynamic_Earthquake_Dashboard / proxy_server.py
davidepanza's picture
Update proxy_server.py
e0f6914 verified
from fastapi import FastAPI, HTTPException
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
import httpx
import os
from pydantic import BaseModel
import uvicorn
app = FastAPI()
class EarthquakeRequest(BaseModel):
start_date: str
end_date: str
@app.post("/api/proxy")
async def proxy_to_lambda(earthquake_request: EarthquakeRequest):
"""Proxy requests to your API Gateway Lambda"""
try:
api_key = os.environ.get('API_GATEWAY_KEY')
api_url = os.environ.get('API_GATEWAY_URL')
if not api_key:
raise HTTPException(status_code=500, detail="API key not configured")
if not api_url:
raise HTTPException(status_code=500, detail="API Gateway URL not configured")
headers = {
'Content-Type': 'application/json',
'X-API-Key': api_key
}
request_body = {
'start_date': earthquake_request.start_date,
'end_date': earthquake_request.end_date
}
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.post(api_url, json=request_body, headers=headers)
if response.status_code == 200:
return response.json()
else:
raise HTTPException(
status_code=response.status_code,
detail=f"API Gateway error: {response.text}"
)
except httpx.TimeoutException:
raise HTTPException(status_code=504, detail="Request timeout")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Proxy error: {str(e)}")
@app.get("/api/health")
async def health_check():
return {"status": "healthy"}
# Mount static assets
if os.path.exists("dist/assets"):
app.mount("/assets", StaticFiles(directory="dist/assets"), name="assets")
# Serve React app
@app.get("/{full_path:path}")
async def serve_react_app(full_path: str = ""):
if full_path.startswith("api/"):
raise HTTPException(status_code=404, detail="API endpoint not found")
return FileResponse("dist/index.html")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)