"""删除30天未登录用户"""
import logging
from datetime import UTC, datetime, timedelta
import asyncer
from apps.schemas.collection import Audit
from apps.services.audit_log import AuditLogManager
from apps.services.user import UserManager
from apps.services.session import SessionManager
from apps.common.mongo import MongoDB
from apps.services.knowledge_base import KnowledgeBaseService
logger = logging.getLogger(__name__)
async def _delete_user(timestamp: float) -> None:
"""异步删除用户"""
user_ids = await UserManager.query_userinfo_by_login_time(timestamp)
for user_id in user_ids:
await UserManager.delete_userinfo_by_user_sub(user_id)
doc_collection = MongoDB().get_collection("document")
docs = [doc["_id"] async for doc in doc_collection.find({"user_sub": user_id})]
try:
await doc_collection.delete_many({"_id": {"$in": docs}})
session_id = await SessionManager.get_session_by_user_sub(user_id)
await KnowledgeBaseService.delete_doc_from_rag(session_id, docs)
except Exception:
logger.exception("[DeleteUserCron] 自动删除用户 %s 文档失败", user_id)
audit_log = Audit(
user_sub=user_id,
http_method="DELETE",
module="user",
message=f"Automatic deleted user: {user_id}, for inactive more than 30 days",
)
await AuditLogManager.add_audit_log(audit_log)
if __name__ == "__main__":
"""删除用户"""
try:
timepoint = datetime.now(UTC) - timedelta(days=30)
timestamp = timepoint.timestamp()
asyncer.syncify(_delete_user)(timestamp)
except Exception:
logger.exception("[DeleteUserCron] 自动删除用户失败")