fix: auto-fix code issues (cron)
- 修复重复导入/字段 - 修复异常处理 - 修复PEP8格式问题 - 添加类型注解
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user