Files
xiaoxia-saas/apps/api/app/middleware/versioning.py
T
CI Test abfc598d3f
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 156h9m36s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Failing after 156h9m43s
refactor: 代码精简优化 - 移除无用代码和重复定义
1. 删除无用文件:
   - apps/api/app/core/database.py (未被引用的死代码)
   - requirements-quality.txt (与 requirements-dev.txt 完全重复)
   - fix_script.py, fix_tracker_encoding.py (一次性修复脚本)
   - init_tracker_phase4.py, init_tracker_simple.py, update_tracker.py (SQLite迁移脚本)

2. 清理死代码:
   - apps/api/app/db.py: 移除未使用的 get_db() 函数和 sqlalchemy.orm 导入
   - 11个路由/中间件文件: 移除未使用的 import (os, datetime, BaseModel, Session, List 等)

3. 消除重复定义:
   - apps/worker/video_processing/video_compose_service.py: 移除重复的 EditingMode 枚举
   - 改为从 packages.domain.editing_mode 导入统一的 EditingMode

影响: 无功能变更,仅移除未使用的代码
2026-07-03 00:44:29 +08:00

94 lines
2.8 KiB
Python

"""
API 版本管理中间件
"""
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
class APIVersionMiddleware(BaseHTTPMiddleware):
"""API 版本管理中间件"""
# 版本配置
VERSIONS = {
"v1": {
"status": "stable",
"deprecated": False,
"sunset_date": None,
"release_date": "2026-06-17",
},
"v2": {
"status": "development",
"deprecated": False,
"sunset_date": None,
"release_date": None,
},
}
async def dispatch(self, request: Request, call_next):
# 提取版本号
version = self._extract_version(request.url.path)
# 处理请求
response = await call_next(request)
# 添加版本信息头
if version:
response.headers["X-API-Version"] = version
# 添加弃用警告
version_info = self.VERSIONS.get(version, {})
if version_info.get("deprecated"):
response.headers["X-API-Deprecated"] = "true"
sunset_date = version_info.get("sunset_date")
if sunset_date:
response.headers["X-API-Sunset-Date"] = sunset_date
response.headers["X-API-Deprecation-Info"] = f"https://docs.xiaoxia-saas.com/api/deprecation/{version}"
return response
def _extract_version(self, path: str) -> str:
"""从路径中提取版本号"""
parts = path.split("/")
for part in parts:
if part.startswith("v") and part[1:].isdigit():
return part
return None
class VersionNotFoundMiddleware(BaseHTTPMiddleware):
"""处理已下线的 API 版本"""
SUNSET_VERSIONS = [] # 已下线的版本列表
async def dispatch(self, request: Request, call_next):
version = self._extract_version(request.url.path)
if version in self.SUNSET_VERSIONS:
from fastapi.responses import JSONResponse
return JSONResponse(
status_code=410,
content={
"error": {
"code": "API_VERSION_SUNSET",
"message": f"API {version} has been sunset and is no longer available",
"sunset_date": "2028-07-01",
"migration_guide": f"https://docs.xiaoxia-saas.com/api/migration/{version}",
}
},
)
return await call_next(request)
def _extract_version(self, path: str) -> str:
"""从路径中提取版本号"""
parts = path.split("/")
for part in parts:
if part.startswith("v") and part[1:].isdigit():
return part
return None