Add the experience service with sites through analytics/AI hooks, migrations through 0011, and phase docs/manifests marking the track complete. Co-authored-by: Cursor <cursoragent@cursor.com>
25 lines
824 B
Python
25 lines
824 B
Python
"""Tenant header resolution middleware."""
|
|
from __future__ import annotations
|
|
|
|
from uuid import UUID
|
|
|
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
from starlette.requests import Request
|
|
from starlette.responses import Response
|
|
|
|
from shared.tenant import HEADER_TENANT_ID, STATE_TENANT_ID
|
|
|
|
|
|
class TenantHeaderMiddleware(BaseHTTPMiddleware):
|
|
"""Resolve tenant from X-Tenant-ID header only (microservice pattern)."""
|
|
|
|
async def dispatch(self, request: Request, call_next) -> Response:
|
|
setattr(request.state, STATE_TENANT_ID, None)
|
|
raw = request.headers.get(HEADER_TENANT_ID)
|
|
if raw:
|
|
try:
|
|
setattr(request.state, STATE_TENANT_ID, UUID(raw))
|
|
except ValueError:
|
|
pass
|
|
return await call_next(request)
|