refactor: 全局适配 ApiFamily/EndpointKind 结构化标识体系

将新的 (ApiFamily, EndpointKind) / `family:kind` 签名体系应用到整个代码库:
- API Handlers: 所有 adapter/handler 使用新的签名格式
- Services: provider, model, usage, cache, auth 等服务层适配
- Database: ProviderEndpoint 新增 api_family/endpoint_kind 字段
- Frontend: Provider 管理、Usage 表格等组件适配
- Tests: 更新所有相关测试用例
This commit is contained in:
fawney19
2026-02-01 17:28:00 +08:00
parent c246ccfc91
commit 7b66505634
219 changed files with 4732 additions and 2545 deletions

View File

@@ -12,4 +12,3 @@ router.include_router(user_router)
router.include_router(admin_router)
__all__ = ["router"]

View File

@@ -1,6 +1,5 @@
"""OAuth 管理端点(管理员)。"""
from __future__ import annotations
from typing import Any
@@ -97,25 +96,33 @@ async def list_provider_configs(request: Request, db: Session = Depends(get_db))
@router.get("/providers/{provider_type}", response_model=OAuthProviderAdminResponse)
async def get_provider_config(provider_type: str, request: Request, db: Session = Depends(get_db)) -> Any:
async def get_provider_config(
provider_type: str, request: Request, db: Session = Depends(get_db)
) -> Any:
adapter = GetOAuthProviderConfigAdapter(provider_type=provider_type)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@router.put("/providers/{provider_type}", response_model=OAuthProviderAdminResponse)
async def upsert_provider_config(provider_type: str, request: Request, db: Session = Depends(get_db)) -> Any:
async def upsert_provider_config(
provider_type: str, request: Request, db: Session = Depends(get_db)
) -> Any:
adapter = UpsertOAuthProviderConfigAdapter(provider_type=provider_type)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@router.delete("/providers/{provider_type}")
async def delete_provider_config(provider_type: str, request: Request, db: Session = Depends(get_db)) -> Any:
async def delete_provider_config(
provider_type: str, request: Request, db: Session = Depends(get_db)
) -> Any:
adapter = DeleteOAuthProviderConfigAdapter(provider_type=provider_type)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@router.post("/providers/{provider_type}/test", response_model=OAuthProviderTestResponse)
async def test_provider_config(provider_type: str, request: Request, db: Session = Depends(get_db)) -> Any:
async def test_provider_config(
provider_type: str, request: Request, db: Session = Depends(get_db)
) -> Any:
adapter = TestOAuthProviderConfigAdapter(provider_type=provider_type)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -165,7 +172,11 @@ class GetOAuthProviderConfigAdapter(AdminApiAdapter):
self.provider_type = provider_type
async def handle(self, context: ApiRequestContext) -> Any: # type: ignore[override]
row = context.db.query(OAuthProvider).filter(OAuthProvider.provider_type == self.provider_type).first()
row = (
context.db.query(OAuthProvider)
.filter(OAuthProvider.provider_type == self.provider_type)
.first()
)
if not row:
raise InvalidRequestException("Provider 配置不存在")
return OAuthProviderAdminResponse(
@@ -248,9 +259,11 @@ class TestOAuthProviderConfigAdapter(AdminApiAdapter):
# 如果没有提供 client_secret尝试从数据库获取已保存的
client_secret = req.client_secret
if not client_secret:
existing = context.db.query(OAuthProvider).filter(
OAuthProvider.provider_type == self.provider_type
).first()
existing = (
context.db.query(OAuthProvider)
.filter(OAuthProvider.provider_type == self.provider_type)
.first()
)
if existing and existing.client_secret_encrypted:
client_secret = existing.get_client_secret()

View File

@@ -1,6 +1,5 @@
"""OAuth 公开端点(无需登录)。"""
from typing import Any
from fastapi import APIRouter, Depends, Query, status

View File

@@ -1,6 +1,5 @@
"""OAuth 用户端点(需登录)。"""
from typing import Any, cast
from fastapi import APIRouter, Depends, HTTPException, Request, status