- auth_routes: 新增内存级登录速率限制(5min/10次),防止暴力破解 - auth_routes: 统一 DEV_MODE 判断收归 config.py 集中管理 - auth_routes: update_user 增加用户存在性校验 - gateway: require_role 装饰器恢复实际角色校验(原为占位实现) - session_routes: get_user_sessions 统一传入 limit=20 参数 - session: get_history SQL 增加 id DESC 排序,修复同秒消息顺序错乱 🤖 Generated with [Qoder][https://qoder.com]
125 lines
4.1 KiB
Python
125 lines
4.1 KiB
Python
"""
|
|
会话管理 API
|
|
|
|
路由:
|
|
- GET /sessions - 用户会话列表
|
|
- GET /history/<session_id> - 获取会话历史
|
|
- DELETE /session/<session_id> - 删除会话
|
|
- POST /clear/<session_id> - 清空会话历史
|
|
"""
|
|
|
|
from flask import Blueprint, request, jsonify, current_app
|
|
from auth.gateway import require_gateway_auth
|
|
from core.status_codes import SUCCESS, BAD_REQUEST, FORBIDDEN, NOT_FOUND, INTERNAL_ERROR, SERVICE_UNAVAILABLE, DELETE_SUCCESS
|
|
from api.response_utils import success_response, error_response
|
|
|
|
session_bp = Blueprint('session', __name__)
|
|
|
|
|
|
@session_bp.route('/sessions', methods=['GET'])
|
|
@require_gateway_auth
|
|
def get_sessions():
|
|
"""
|
|
获取用户的会话列表
|
|
|
|
返回:
|
|
{
|
|
"sessions": [
|
|
{
|
|
"session_id": "...",
|
|
"created_at": "...",
|
|
"last_active": "...",
|
|
"preview": "最后一条消息预览..."
|
|
}
|
|
]
|
|
}
|
|
"""
|
|
session_manager = current_app.config['SESSION_MANAGER']
|
|
if session_manager is None:
|
|
return error_response("SERVICE_UNAVAILABLE", SERVICE_UNAVAILABLE, "会话服务不可用", http_status=503)
|
|
user_id = request.current_user["user_id"]
|
|
|
|
sessions = session_manager.get_user_sessions(user_id, limit=20)
|
|
|
|
# 添加最后一条消息预览
|
|
for s in sessions:
|
|
history = session_manager.get_history(s["session_id"], limit=1)
|
|
if history:
|
|
s["preview"] = history[0]["content"][:50] + "..."
|
|
else:
|
|
s["preview"] = "空会话"
|
|
|
|
return success_response(data={"sessions": sessions})
|
|
|
|
|
|
@session_bp.route('/history/<session_id>', methods=['GET'])
|
|
@require_gateway_auth
|
|
def get_history(session_id):
|
|
"""
|
|
获取会话历史
|
|
|
|
返回:
|
|
{
|
|
"history": [
|
|
{"role": "user/assistant", "content": "...", "created_at": "..."}
|
|
]
|
|
}
|
|
"""
|
|
session_manager = current_app.config['SESSION_MANAGER']
|
|
if session_manager is None:
|
|
return error_response("SERVICE_UNAVAILABLE", SERVICE_UNAVAILABLE, "会话服务不可用", http_status=503)
|
|
user_id = request.current_user["user_id"]
|
|
|
|
# 验证会话归属
|
|
sessions = session_manager.get_user_sessions(user_id, limit=20)
|
|
session_ids = [s["session_id"] for s in sessions]
|
|
|
|
if session_id not in session_ids:
|
|
return error_response("FORBIDDEN", FORBIDDEN, "无权访问此会话", http_status=403)
|
|
|
|
history = session_manager.get_history(session_id, limit=100)
|
|
|
|
return success_response(data={"history": history})
|
|
|
|
|
|
@session_bp.route('/session/<session_id>', methods=['DELETE'])
|
|
@require_gateway_auth
|
|
def delete_session(session_id):
|
|
"""删除会话"""
|
|
session_manager = current_app.config['SESSION_MANAGER']
|
|
if session_manager is None:
|
|
return error_response("SERVICE_UNAVAILABLE", SERVICE_UNAVAILABLE, "会话服务不可用", http_status=503)
|
|
user_id = request.current_user["user_id"]
|
|
|
|
# 验证会话归属
|
|
sessions = session_manager.get_user_sessions(user_id, limit=20)
|
|
session_ids = [s["session_id"] for s in sessions]
|
|
|
|
if session_id not in session_ids:
|
|
return error_response("FORBIDDEN", FORBIDDEN, "无权访问此会话", http_status=403)
|
|
|
|
session_manager.delete_session(session_id)
|
|
|
|
return success_response(status_code=DELETE_SUCCESS, message="会话已删除")
|
|
|
|
|
|
@session_bp.route('/clear/<session_id>', methods=['POST'])
|
|
@require_gateway_auth
|
|
def clear_history(session_id):
|
|
"""清空会话历史(保留会话)"""
|
|
session_manager = current_app.config['SESSION_MANAGER']
|
|
if session_manager is None:
|
|
return error_response("SERVICE_UNAVAILABLE", SERVICE_UNAVAILABLE, "会话服务不可用", http_status=503)
|
|
user_id = request.current_user["user_id"]
|
|
|
|
# 验证会话归属
|
|
sessions = session_manager.get_user_sessions(user_id, limit=20)
|
|
session_ids = [s["session_id"] for s in sessions]
|
|
|
|
if session_id not in session_ids:
|
|
return error_response("FORBIDDEN", FORBIDDEN, "无权访问此会话", http_status=403)
|
|
|
|
session_manager.clear_history(session_id)
|
|
|
|
return success_response(message="历史已清空")
|