Fix gateway issues

This commit is contained in:
Urtzi Alfaro
2025-07-18 12:57:13 +02:00
parent e989e3b362
commit a38e5e7c22
2 changed files with 19 additions and 15 deletions

View File

@@ -71,7 +71,7 @@ async def startup_event():
metrics_collector.start_metrics_server(8080) metrics_collector.start_metrics_server(8080)
# Initialize service discovery # Initialize service discovery
await service_discovery.initialize() # await service_discovery.initialize()
logger.info("API Gateway started successfully") logger.info("API Gateway started successfully")
@@ -81,7 +81,7 @@ async def shutdown_event():
logger.info("Shutting down API Gateway") logger.info("Shutting down API Gateway")
# Clean up service discovery # Clean up service discovery
await service_discovery.cleanup() # await service_discovery.cleanup()
logger.info("API Gateway shutdown complete") logger.info("API Gateway shutdown complete")

View File

@@ -1,43 +1,47 @@
# ================================================================ """Data service routes for API Gateway - Authentication handled by gateway middleware"""
# gateway/app/routes/data.py
# ================================================================
"""Data service routes for API Gateway"""
from fastapi import APIRouter, Request, Depends, HTTPException from fastapi import APIRouter, Request, HTTPException
from fastapi.responses import StreamingResponse from fastapi.responses import StreamingResponse
import httpx import httpx
import structlog import logging
from app.core.config import settings from app.core.config import settings
from app.core.auth import verify_token
logger = structlog.get_logger() logger = logging.getLogger(__name__)
router = APIRouter() router = APIRouter()
@router.api_route("/sales/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) @router.api_route("/sales/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
async def proxy_sales(request: Request, path: str, current_user: dict = Depends(verify_token)): async def proxy_sales(request: Request, path: str):
"""Proxy sales data requests to data service""" """Proxy sales data requests to data service"""
return await _proxy_request(request, f"/api/v1/sales/{path}") return await _proxy_request(request, f"/api/v1/sales/{path}")
@router.api_route("/weather/{path:path}", methods=["GET", "POST"]) @router.api_route("/weather/{path:path}", methods=["GET", "POST"])
async def proxy_weather(request: Request, path: str, current_user: dict = Depends(verify_token)): async def proxy_weather(request: Request, path: str):
"""Proxy weather requests to data service""" """Proxy weather requests to data service"""
return await _proxy_request(request, f"/api/v1/weather/{path}") return await _proxy_request(request, f"/api/v1/weather/{path}")
@router.api_route("/traffic/{path:path}", methods=["GET", "POST"]) @router.api_route("/traffic/{path:path}", methods=["GET", "POST"])
async def proxy_traffic(request: Request, path: str, current_user: dict = Depends(verify_token)): async def proxy_traffic(request: Request, path: str):
"""Proxy traffic requests to data service""" """Proxy traffic requests to data service"""
return await _proxy_request(request, f"/api/v1/traffic/{path}") return await _proxy_request(request, f"/api/v1/traffic/{path}")
async def _proxy_request(request: Request, target_path: str): async def _proxy_request(request: Request, target_path: str):
"""Proxy request to data service""" """Proxy request to data service with user context"""
try: try:
url = f"{settings.DATA_SERVICE_URL}{target_path}" url = f"{settings.DATA_SERVICE_URL}{target_path}"
# Forward headers (including auth) # Forward headers BUT add user context from gateway auth
headers = dict(request.headers) headers = dict(request.headers)
headers.pop("host", None) # Remove host header headers.pop("host", None) # Remove host header
# ✅ ADD USER CONTEXT FROM GATEWAY AUTHENTICATION
# Gateway middleware already verified the token and added user to request.state
if hasattr(request.state, 'user'):
headers["X-User-ID"] = str(request.state.user.get("user_id"))
headers["X-User-Email"] = request.state.user.get("email", "")
headers["X-Tenant-ID"] = str(request.state.user.get("tenant_id"))
headers["X-User-Roles"] = ",".join(request.state.user.get("roles", []))
# Get request body if present # Get request body if present
body = None body = None
if request.method in ["POST", "PUT", "PATCH"]: if request.method in ["POST", "PUT", "PATCH"]: