| """Token 服务外观(Facade)""" |
|
|
| from typing import List, Optional, Dict |
|
|
| from app.services.token.models import TokenInfo, EffortType |
|
|
|
|
| class TokenService: |
| """ |
| Token 服务外观 |
| |
| 提供简化的 API,隐藏内部实现细节 |
| """ |
|
|
| @staticmethod |
| async def _get_manager(): |
| from app.services.token.manager import get_token_manager |
|
|
| return await get_token_manager() |
|
|
| @staticmethod |
| async def get_token(pool_name: str = "ssoBasic") -> Optional[str]: |
| """ |
| 获取可用 Token |
| |
| Args: |
| pool_name: Token 池名称 |
| |
| Returns: |
| Token 字符串(不含 sso= 前缀)或 None |
| """ |
| manager = await TokenService._get_manager() |
| return manager.get_token(pool_name) |
|
|
| @staticmethod |
| async def consume(token: str, effort: EffortType = EffortType.LOW) -> bool: |
| """ |
| 消耗 Token 配额(本地预估) |
| |
| Args: |
| token: Token 字符串 |
| effort: 消耗力度 |
| |
| Returns: |
| 是否成功 |
| """ |
| manager = await TokenService._get_manager() |
| return await manager.consume(token, effort) |
|
|
| @staticmethod |
| async def sync_usage(token: str, effort: EffortType = EffortType.LOW) -> bool: |
| """ |
| 同步 Token 使用量(优先 API,降级本地) |
| |
| Args: |
| token: Token 字符串 |
| effort: 降级时的消耗力度 |
| |
| Returns: |
| 是否成功 |
| """ |
| manager = await TokenService._get_manager() |
| return await manager.sync_usage(token, effort) |
|
|
| @staticmethod |
| async def record_fail(token: str, status_code: int = 401, reason: str = "") -> bool: |
| """ |
| 记录 Token 失败 |
| |
| Args: |
| token: Token 字符串 |
| status_code: HTTP 状态码 |
| reason: 失败原因 |
| |
| Returns: |
| 是否成功 |
| """ |
| manager = await TokenService._get_manager() |
| return await manager.record_fail(token, status_code, reason) |
|
|
| @staticmethod |
| async def add_token(token: str, pool_name: str = "ssoBasic") -> bool: |
| """ |
| 添加 Token |
| |
| Args: |
| token: Token 字符串 |
| pool: Token 池名称 |
| |
| Returns: |
| 是否成功 |
| """ |
| manager = await TokenService._get_manager() |
| return await manager.add(token, pool_name) |
|
|
| @staticmethod |
| async def remove_token(token: str) -> bool: |
| """ |
| 删除 Token |
| |
| Args: |
| token: Token 字符串 |
| |
| Returns: |
| 是否成功 |
| """ |
| manager = await TokenService._get_manager() |
| return await manager.remove(token) |
|
|
| @staticmethod |
| async def reset_token(token: str) -> bool: |
| """ |
| 重置单个 Token |
| |
| Args: |
| token: Token 字符串 |
| |
| Returns: |
| 是否成功 |
| """ |
| manager = await TokenService._get_manager() |
| return await manager.reset_token(token) |
|
|
| @staticmethod |
| async def reset_all(): |
| """重置所有 Token""" |
| manager = await TokenService._get_manager() |
| await manager.reset_all() |
|
|
| @staticmethod |
| async def get_stats() -> Dict[str, dict]: |
| """ |
| 获取统计信息 |
| |
| Returns: |
| 各池的统计信息 |
| """ |
| manager = await TokenService._get_manager() |
| return manager.get_stats() |
|
|
| @staticmethod |
| async def list_tokens(pool_name: str = "ssoBasic") -> List[TokenInfo]: |
| """ |
| 获取指定池的所有 Token |
| |
| Args: |
| pool_name: Token 池名称 |
| |
| Returns: |
| Token 列表 |
| """ |
| manager = await TokenService._get_manager() |
| return manager.get_pool_tokens(pool_name) |
|
|
|
|
| __all__ = ["TokenService"] |
|
|