fix: auto-fix code issues (cron)

- 修复重复导入/字段
- 修复异常处理
- 修复PEP8格式问题
- 添加类型注解
This commit is contained in:
OpenClaw Bot
2026-02-27 18:09:24 +08:00
parent 646b64daf7
commit 17bda3dbce
38 changed files with 1993 additions and 1972 deletions

View File

@@ -4,14 +4,13 @@ InsightFlow API Key Manager - Phase 6
API Key 管理模块:生成、验证、撤销
"""
import os
import json
import hashlib
import json
import os
import secrets
import sqlite3
from datetime import datetime, timedelta
from typing import Optional, List, Dict
from dataclasses import dataclass
from datetime import datetime, timedelta
from enum import Enum
DB_PATH = os.getenv("DB_PATH", "/app/data/insightflow.db")
@@ -29,15 +28,15 @@ class ApiKey:
key_hash: str # 存储哈希值,不存储原始 key
key_preview: str # 前8位预览如 "ak_live_abc..."
name: str # 密钥名称/描述
owner_id: Optional[str] # 所有者ID预留多用户支持
permissions: List[str] # 权限列表,如 ["read", "write"]
owner_id: str | None # 所有者ID预留多用户支持
permissions: list[str] # 权限列表,如 ["read", "write"]
rate_limit: int # 每分钟请求限制
status: str # active, revoked, expired
created_at: str
expires_at: Optional[str]
last_used_at: Optional[str]
revoked_at: Optional[str]
revoked_reason: Optional[str]
expires_at: str | None
last_used_at: str | None
revoked_at: str | None
revoked_reason: str | None
total_calls: int = 0
@@ -131,10 +130,10 @@ class ApiKeyManager:
def create_key(
self,
name: str,
owner_id: Optional[str] = None,
permissions: List[str] = None,
owner_id: str | None = None,
permissions: list[str] = None,
rate_limit: int = 60,
expires_days: Optional[int] = None,
expires_days: int | None = None,
) -> tuple[str, ApiKey]:
"""
创建新的 API Key
@@ -196,7 +195,7 @@ class ApiKeyManager:
return raw_key, api_key
def validate_key(self, key: str) -> Optional[ApiKey]:
def validate_key(self, key: str) -> ApiKey | None:
"""
验证 API Key
@@ -231,7 +230,7 @@ class ApiKeyManager:
return api_key
def revoke_key(self, key_id: str, reason: str = "", owner_id: Optional[str] = None) -> bool:
def revoke_key(self, key_id: str, reason: str = "", owner_id: str | None = None) -> bool:
"""撤销 API Key"""
with sqlite3.connect(self.db_path) as conn:
# 验证所有权(如果提供了 owner_id
@@ -251,7 +250,7 @@ class ApiKeyManager:
conn.commit()
return cursor.rowcount > 0
def get_key_by_id(self, key_id: str, owner_id: Optional[str] = None) -> Optional[ApiKey]:
def get_key_by_id(self, key_id: str, owner_id: str | None = None) -> ApiKey | None:
"""通过 ID 获取 API Key不包含敏感信息"""
with sqlite3.connect(self.db_path) as conn:
conn.row_factory = sqlite3.Row
@@ -268,8 +267,8 @@ class ApiKeyManager:
return None
def list_keys(
self, owner_id: Optional[str] = None, status: Optional[str] = None, limit: int = 100, offset: int = 0
) -> List[ApiKey]:
self, owner_id: str | None = None, status: str | None = None, limit: int = 100, offset: int = 0
) -> list[ApiKey]:
"""列出 API Keys"""
with sqlite3.connect(self.db_path) as conn:
conn.row_factory = sqlite3.Row
@@ -294,10 +293,10 @@ class ApiKeyManager:
def update_key(
self,
key_id: str,
name: Optional[str] = None,
permissions: Optional[List[str]] = None,
rate_limit: Optional[int] = None,
owner_id: Optional[str] = None,
name: str | None = None,
permissions: list[str] | None = None,
rate_limit: int | None = None,
owner_id: str | None = None,
) -> bool:
"""更新 API Key 信息"""
updates = []
@@ -371,12 +370,12 @@ class ApiKeyManager:
def get_call_logs(
self,
api_key_id: Optional[str] = None,
start_date: Optional[str] = None,
end_date: Optional[str] = None,
api_key_id: str | None = None,
start_date: str | None = None,
end_date: str | None = None,
limit: int = 100,
offset: int = 0,
) -> List[Dict]:
) -> list[dict]:
"""获取 API 调用日志"""
with sqlite3.connect(self.db_path) as conn:
conn.row_factory = sqlite3.Row
@@ -402,13 +401,13 @@ class ApiKeyManager:
rows = conn.execute(query, params).fetchall()
return [dict(row) for row in rows]
def get_call_stats(self, api_key_id: Optional[str] = None, days: int = 30) -> Dict:
def get_call_stats(self, api_key_id: str | None = None, days: int = 30) -> dict:
"""获取 API 调用统计"""
with sqlite3.connect(self.db_path) as conn:
conn.row_factory = sqlite3.Row
# 总体统计
query = """
query = f"""
SELECT
COUNT(*) as total_calls,
COUNT(CASE WHEN status_code < 400 THEN 1 END) as success_calls,
@@ -417,8 +416,8 @@ class ApiKeyManager:
MAX(response_time_ms) as max_response_time,
MIN(response_time_ms) as min_response_time
FROM api_call_logs
WHERE created_at >= date('now', '-{} days')
""".format(days)
WHERE created_at >= date('now', '-{days} days')
"""
params = []
if api_key_id:
@@ -428,15 +427,15 @@ class ApiKeyManager:
row = conn.execute(query, params).fetchone()
# 按端点统计
endpoint_query = """
endpoint_query = f"""
SELECT
endpoint,
method,
COUNT(*) as calls,
AVG(response_time_ms) as avg_time
FROM api_call_logs
WHERE created_at >= date('now', '-{} days')
""".format(days)
WHERE created_at >= date('now', '-{days} days')
"""
endpoint_params = []
if api_key_id:
@@ -448,14 +447,14 @@ class ApiKeyManager:
endpoint_rows = conn.execute(endpoint_query, endpoint_params).fetchall()
# 按天统计
daily_query = """
daily_query = f"""
SELECT
date(created_at) as date,
COUNT(*) as calls,
COUNT(CASE WHEN status_code < 400 THEN 1 END) as success
FROM api_call_logs
WHERE created_at >= date('now', '-{} days')
""".format(days)
WHERE created_at >= date('now', '-{days} days')
"""
daily_params = []
if api_key_id:
@@ -500,7 +499,7 @@ class ApiKeyManager:
# 全局实例
_api_key_manager: Optional[ApiKeyManager] = None
_api_key_manager: ApiKeyManager | None = None
def get_api_key_manager() -> ApiKeyManager: