feat: Semaine 8

This commit is contained in:
gauvainboiche
2026-05-11 09:25:19 +02:00
parent 606e43e53f
commit 3315cb2336
123 changed files with 5748 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
import httpx
from fastapi import FastAPI, Request, Response
app = FastAPI()
SERVICES = {
"users": "http://user-service:8000",
"products": "http://catalog-service:8000",
"orders": "http://order-service:8000",
"notifications": "http://notif-service:8000",
}
TIMEOUT = 5.0
@app.get("/health")
def health():
return {"status": "ok", "service": "api-gateway"}
@app.api_route("/{full_path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH"])
async def gateway(full_path: str, request: Request):
# Extraire le nom du service depuis le début du chemin
# ex: "users/1" → service="users", "orders" → service="orders"
parts = full_path.split("/", 1)
service_key = parts[0]
base_url = SERVICES.get(service_key)
if not base_url:
return Response(
content=f'{{"detail": "Service \'{service_key}\' inconnu"}}',
status_code=404,
media_type="application/json",
)
target_url = f"{base_url}/{full_path}"
if request.url.query:
target_url += f"?{request.url.query}"
body = await request.body()
async with httpx.AsyncClient() as client:
try:
response = await client.request(
method=request.method,
url=target_url,
content=body,
headers={"Content-Type": request.headers.get("Content-Type", "application/json")},
timeout=TIMEOUT,
)
except httpx.TimeoutException:
return Response(
content='{"detail": "Service timeout"}',
status_code=504,
media_type="application/json",
)
except Exception as e:
return Response(
content=f'{{"detail": "Gateway error: {str(e)}"}}',
status_code=502,
media_type="application/json",
)
return Response(
content=response.content,
status_code=response.status_code,
media_type=response.headers.get("content-type"),
)