the beginning of the idiots
This commit is contained in:
40
qwen/python/merchants_of_hope/middleware/tenant.py
Normal file
40
qwen/python/merchants_of_hope/middleware/tenant.py
Normal file
@@ -0,0 +1,40 @@
|
||||
"""
|
||||
Tenant middleware for handling multi-tenant requests
|
||||
"""
|
||||
import uuid
|
||||
from typing import Optional
|
||||
from fastapi import Request, HTTPException, status
|
||||
from starlette.middleware.base import BaseHTTPMiddleware
|
||||
from .config.settings import settings
|
||||
from .models import Tenant
|
||||
|
||||
class TenantMiddleware(BaseHTTPMiddleware):
|
||||
async def dispatch(self, request: Request, call_next):
|
||||
# Get tenant ID from header or subdomain
|
||||
tenant_id = request.headers.get(settings.TENANT_ID_HEADER)
|
||||
|
||||
if not tenant_id:
|
||||
# Try to extract tenant from subdomain
|
||||
host = request.headers.get("host", "")
|
||||
tenant_id = self.extract_tenant_from_host(host)
|
||||
|
||||
if not tenant_id and settings.MULTI_TENANT_ENABLED:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="Tenant ID is required"
|
||||
)
|
||||
|
||||
# Attach tenant info to request
|
||||
request.state.tenant_id = tenant_id
|
||||
|
||||
response = await call_next(request)
|
||||
return response
|
||||
|
||||
def extract_tenant_from_host(self, host: str) -> Optional[str]:
|
||||
"""
|
||||
Extract tenant from host (subdomain.tenant.com)
|
||||
"""
|
||||
# For now, return a default tenant or None
|
||||
# In a real implementation, you would parse the subdomain
|
||||
# and look up the corresponding tenant in the database
|
||||
return "default"
|
||||
Reference in New Issue
Block a user