refactor(api_key): change rate limit handling to auto-cap at tenant limit
- Replace exception throwing with automatic capping when rate limit exceeds tenant plan limit, improving user experience.
This commit is contained in:
@@ -19,7 +19,6 @@ from app.core.exceptions import (
|
|||||||
)
|
)
|
||||||
from app.core.error_codes import BizCode
|
from app.core.error_codes import BizCode
|
||||||
from app.core.logging_config import get_business_logger
|
from app.core.logging_config import get_business_logger
|
||||||
from app.i18n.exceptions import I18nException
|
|
||||||
|
|
||||||
logger = get_business_logger()
|
logger = get_business_logger()
|
||||||
|
|
||||||
@@ -52,7 +51,7 @@ class ApiKeyService:
|
|||||||
if existing:
|
if existing:
|
||||||
raise BusinessException(f"API Key 名称 {data.name} 已存在", BizCode.API_KEY_DUPLICATE_NAME)
|
raise BusinessException(f"API Key 名称 {data.name} 已存在", BizCode.API_KEY_DUPLICATE_NAME)
|
||||||
|
|
||||||
# 校验 rate_limit 不能超过租户套餐的 api_ops_rate_limit
|
# 若 rate_limit 超过租户套餐的 api_ops_rate_limit,自动截断到套餐上限
|
||||||
from app.models.workspace_model import Workspace
|
from app.models.workspace_model import Workspace
|
||||||
from app.core.quota_manager import get_api_ops_rate_limit
|
from app.core.quota_manager import get_api_ops_rate_limit
|
||||||
|
|
||||||
@@ -60,13 +59,7 @@ class ApiKeyService:
|
|||||||
if workspace:
|
if workspace:
|
||||||
tenant_api_ops_limit = get_api_ops_rate_limit(db, workspace.tenant_id)
|
tenant_api_ops_limit = get_api_ops_rate_limit(db, workspace.tenant_id)
|
||||||
if tenant_api_ops_limit and data.rate_limit > tenant_api_ops_limit:
|
if tenant_api_ops_limit and data.rate_limit > tenant_api_ops_limit:
|
||||||
raise I18nException(
|
data.rate_limit = tenant_api_ops_limit
|
||||||
error_key="errors.api.api_key_rate_limit_exceeded",
|
|
||||||
status_code=400,
|
|
||||||
error_code="API_KEY_RATE_LIMIT_EXCEEDED",
|
|
||||||
rate_limit=data.rate_limit,
|
|
||||||
limit=tenant_api_ops_limit,
|
|
||||||
)
|
|
||||||
|
|
||||||
# 生成 API Key
|
# 生成 API Key
|
||||||
api_key = generate_api_key(data.type)
|
api_key = generate_api_key(data.type)
|
||||||
@@ -169,7 +162,7 @@ class ApiKeyService:
|
|||||||
if existing:
|
if existing:
|
||||||
raise BusinessException(f"API Key 名称 {data.name} 已存在", BizCode.API_KEY_DUPLICATE_NAME)
|
raise BusinessException(f"API Key 名称 {data.name} 已存在", BizCode.API_KEY_DUPLICATE_NAME)
|
||||||
|
|
||||||
# 校验 rate_limit 不能超过租户套餐的 api_ops_rate_limit
|
# 若 rate_limit 超过租户套餐的 api_ops_rate_limit,自动截断到套餐上限
|
||||||
if data.rate_limit is not None:
|
if data.rate_limit is not None:
|
||||||
from app.models.workspace_model import Workspace
|
from app.models.workspace_model import Workspace
|
||||||
from app.core.quota_manager import get_api_ops_rate_limit
|
from app.core.quota_manager import get_api_ops_rate_limit
|
||||||
@@ -178,13 +171,7 @@ class ApiKeyService:
|
|||||||
if workspace:
|
if workspace:
|
||||||
tenant_api_ops_limit = get_api_ops_rate_limit(db, workspace.tenant_id)
|
tenant_api_ops_limit = get_api_ops_rate_limit(db, workspace.tenant_id)
|
||||||
if tenant_api_ops_limit and data.rate_limit > tenant_api_ops_limit:
|
if tenant_api_ops_limit and data.rate_limit > tenant_api_ops_limit:
|
||||||
raise I18nException(
|
data.rate_limit = tenant_api_ops_limit
|
||||||
error_key="errors.api.api_key_rate_limit_exceeded",
|
|
||||||
status_code=400,
|
|
||||||
error_code="API_KEY_RATE_LIMIT_EXCEEDED",
|
|
||||||
rate_limit=data.rate_limit,
|
|
||||||
limit=tenant_api_ops_limit,
|
|
||||||
)
|
|
||||||
|
|
||||||
update_data = data.model_dump(exclude_unset=True)
|
update_data = data.model_dump(exclude_unset=True)
|
||||||
ApiKeyRepository.update(db, api_key_id, update_data)
|
ApiKeyRepository.update(db, api_key_id, update_data)
|
||||||
|
|||||||
Reference in New Issue
Block a user