removing legacy code on path_rewrite_middleware
This commit is contained in:
@@ -64,28 +64,9 @@ Injects: request.state.vendor = <Vendor object>
|
||||
|
||||
**See**: [Multi-Tenant System](multi-tenant.md) for routing modes
|
||||
|
||||
### 3. Path Rewrite Middleware
|
||||
**Note on Path-Based Routing:** Previous implementations used a `PathRewriteMiddleware` to rewrite paths at runtime. This has been replaced with **double router mounting** in `main.py`, where shop routes are registered twice with different prefixes (`/shop` and `/vendors/{vendor_code}/shop`). This approach is simpler and uses FastAPI's native routing capabilities.
|
||||
|
||||
**Purpose**: Rewrite request paths for proper FastAPI routing
|
||||
|
||||
**What it does**:
|
||||
- Uses the `clean_path` extracted by VendorContextMiddleware
|
||||
- Rewrites `request.scope['path']` to remove vendor prefix
|
||||
- Allows FastAPI routes to match correctly
|
||||
|
||||
**Example** (Path-Based Development Mode):
|
||||
```
|
||||
Original path: /vendors/WIZAMART/shop/products
|
||||
Clean path: /shop/products (set by VendorContextMiddleware)
|
||||
↓
|
||||
Path Rewrite Middleware changes request path to: /shop/products
|
||||
↓
|
||||
FastAPI router can now match: @app.get("/shop/products")
|
||||
```
|
||||
|
||||
**Why it's needed**: FastAPI routes don't include vendor prefix, so we strip it
|
||||
|
||||
### 4. Context Detection Middleware
|
||||
### 3. Context Detection Middleware
|
||||
|
||||
**Purpose**: Determine the type/context of the request
|
||||
|
||||
@@ -115,7 +96,7 @@ else:
|
||||
|
||||
**Why it's useful**: Error handlers and templates adapt based on context
|
||||
|
||||
### 5. Theme Context Middleware
|
||||
### 4. Theme Context Middleware
|
||||
|
||||
**Purpose**: Load vendor-specific theme settings
|
||||
|
||||
@@ -146,13 +127,12 @@ else:
|
||||
graph TD
|
||||
A[Client Request] --> B[1. LoggingMiddleware]
|
||||
B --> C[2. VendorContextMiddleware]
|
||||
C --> D[3. PathRewriteMiddleware]
|
||||
D --> E[4. ContextDetectionMiddleware]
|
||||
E --> F[5. ThemeContextMiddleware]
|
||||
F --> G[6. FastAPI Router]
|
||||
G --> H[Route Handler]
|
||||
H --> I[Response]
|
||||
I --> J[Client]
|
||||
C --> D[3. ContextDetectionMiddleware]
|
||||
D --> E[4. ThemeContextMiddleware]
|
||||
E --> F[5. FastAPI Router]
|
||||
F --> G[Route Handler]
|
||||
G --> H[Response]
|
||||
H --> I[Client]
|
||||
```
|
||||
|
||||
### Why This Order Matters
|
||||
@@ -164,25 +144,21 @@ graph TD
|
||||
- Must log errors from all other middleware
|
||||
|
||||
2. **VendorContextMiddleware second**
|
||||
- Must run before PathRewriteMiddleware (provides clean_path)
|
||||
- Must run before ContextDetectionMiddleware (provides vendor)
|
||||
- Must run before ContextDetectionMiddleware (provides vendor and clean_path)
|
||||
- Must run before ThemeContextMiddleware (provides vendor_id)
|
||||
|
||||
3. **PathRewriteMiddleware third**
|
||||
- Depends on clean_path from VendorContextMiddleware
|
||||
- Must run before ContextDetectionMiddleware (rewrites path)
|
||||
|
||||
4. **ContextDetectionMiddleware fourth**
|
||||
3. **ContextDetectionMiddleware third**
|
||||
- Uses clean_path from VendorContextMiddleware
|
||||
- Uses rewritten path from PathRewriteMiddleware
|
||||
- Provides context_type for ThemeContextMiddleware
|
||||
|
||||
5. **ThemeContextMiddleware last**
|
||||
4. **ThemeContextMiddleware last**
|
||||
- Depends on vendor from VendorContextMiddleware
|
||||
- Depends on context_type from ContextDetectionMiddleware
|
||||
|
||||
**Breaking this order will break the application!**
|
||||
|
||||
**Note:** Path-based routing (e.g., `/vendors/{code}/shop/*`) is handled by double router mounting in `main.py`, not by middleware.
|
||||
|
||||
## Request State Variables
|
||||
|
||||
Middleware components inject these variables into `request.state`:
|
||||
@@ -191,7 +167,7 @@ Middleware components inject these variables into `request.state`:
|
||||
|----------|--------|------|---------|-------------|
|
||||
| `vendor` | VendorContextMiddleware | Vendor | Theme, Templates | Current vendor object |
|
||||
| `vendor_id` | VendorContextMiddleware | int | Queries, Theme | Current vendor ID |
|
||||
| `clean_path` | VendorContextMiddleware | str | PathRewrite, Context | Path without vendor prefix |
|
||||
| `clean_path` | VendorContextMiddleware | str | Context | Path without vendor prefix (for context detection) |
|
||||
| `context_type` | ContextDetectionMiddleware | RequestContext | Theme, Error handlers | Request context enum |
|
||||
| `theme` | ThemeContextMiddleware | dict | Templates | Vendor theme config |
|
||||
|
||||
@@ -260,25 +236,21 @@ async def get_products(request: Request):
|
||||
↓ Sets: request.state.vendor_id = 1
|
||||
↓ Sets: request.state.clean_path = "/shop/products"
|
||||
|
||||
3. PathRewriteMiddleware
|
||||
↓ Path already clean (no rewrite needed for subdomain mode)
|
||||
↓ request.scope['path'] = "/shop/products"
|
||||
|
||||
4. ContextDetectionMiddleware
|
||||
3. ContextDetectionMiddleware
|
||||
↓ Analyzes path: "/shop/products"
|
||||
↓ Has vendor: Yes
|
||||
↓ Not admin/api/vendor dashboard
|
||||
↓ Sets: request.state.context_type = RequestContext.SHOP
|
||||
|
||||
5. ThemeContextMiddleware
|
||||
4. ThemeContextMiddleware
|
||||
↓ Loads theme for vendor_id = 1
|
||||
↓ Sets: request.state.theme = {...theme config...}
|
||||
|
||||
6. FastAPI Router
|
||||
5. FastAPI Router
|
||||
↓ Matches route: @app.get("/shop/products")
|
||||
↓ Calls handler function
|
||||
|
||||
7. Route Handler
|
||||
6. Route Handler
|
||||
↓ Accesses: request.state.vendor_id
|
||||
↓ Queries: products WHERE vendor_id = 1
|
||||
↓ Renders template with vendor data
|
||||
|
||||
Reference in New Issue
Block a user