perf: paginate admin audit lists

This commit is contained in:
2026-07-13 13:09:15 +08:00
parent 0864f9305b
commit 00d53c2569
14 changed files with 300 additions and 80 deletions

View File

@@ -0,0 +1,65 @@
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlalchemy.pool import StaticPool
from app.api.admin_agent_records import attention_list, retrieval_logs
from app.api.admin_records import ai_logs
from app.api.admin_users import list_users
from app.models import Base
from app.models.knowledge import HumanAttentionRecord, KnowledgeRetrievalLog
from app.models.logs import AiRequestLog
from app.models.user import User
def _database() -> Session:
engine = create_engine("sqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool)
Base.metadata.create_all(engine)
return Session(engine)
def test_user_list_uses_database_pagination():
with _database() as db:
db.add_all([
User(id=i + 1, phone=f"1380000{i:04d}", name=f"学员{i}", daily_chat_limit=10)
for i in range(25)
])
db.commit()
response = list_users(keyword="", page=2, pageSize=10, db=db, current_admin=object())
assert response["data"]["total"] == 25
assert response["data"]["page"] == 2
assert len(response["data"]["items"]) == 10
def test_ai_log_page_does_not_load_large_detail_fields():
with _database() as db:
db.add_all([
AiRequestLog(status="success", prompt="p" * 5000, retrieved_chunks='[{"content":"large"}]')
for _ in range(23)
])
db.commit()
response = ai_logs(sessionId=None, userId=None, status="", page=2, pageSize=10, db=db, current_admin=object())
assert response["data"]["total"] == 23
assert len(response["data"]["items"]) == 10
assert all(item["retrievedChunks"] == [] for item in response["data"]["items"])
def test_retrieval_and_attention_lists_are_paginated():
with _database() as db:
for index in range(21):
db.add(KnowledgeRetrievalLog(
question=f"q{index}", catalog_snapshot="[]", catalog_hash=str(index),
safety_rule_version="v1", status="success",
))
db.add(HumanAttentionRecord(
session_id=index + 1, message_id=index + 1, user_id=index + 1,
trigger_message="test", problem_summary="test", trigger_reason="test",
priority="normal", status="pending",
))
db.commit()
retrieval = retrieval_logs(
sessionId=None, knowledgeId=None, knowledgeCalled=None, statusValue="", attentionCreated=None,
page=3, pageSize=10, db=db, current_admin=object(),
)["data"]
attention = attention_list(priority="", statusValue="", page=3, pageSize=10, db=db, current_admin=object())["data"]
assert retrieval["total"] == attention["total"] == 21
assert len(retrieval["items"]) == len(attention["items"]) == 1