Dynamic_Earthquake_Dashboard / proxy_server.py
davidepanza's picture
Update proxy_server.py
e0f6914 verified
Raw History Blame Contribute Delete
2.27 kB
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)