36 lines
1.7 KiB
Python
36 lines
1.7 KiB
Python
from sqlalchemy import delete, select
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
from datetime import datetime, timedelta, timezone
|
||
from app.db import models
|
||
|
||
async def delete_old_sessions(db: AsyncSession):
|
||
"""
|
||
Удаляет сессии, которые не были активны более 30 дней.
|
||
"""
|
||
thirty_days_ago = datetime.now(timezone.utc) - timedelta(days=30)
|
||
|
||
# Собираем информацию о сессиях, которые будут удалены
|
||
# Это полезно для отладки и для отправки уведомлений, если потребуется
|
||
expired_sessions_query = select(models.Session).where(models.Session.last_active < thirty_days_ago)
|
||
expired_sessions_result = await db.execute(expired_sessions_query)
|
||
expired_sessions = expired_sessions_result.scalars().all()
|
||
|
||
# Если есть что удалять
|
||
if expired_sessions:
|
||
# Здесь можно было бы добавить логику для уведомления пользователей через WebSocket,
|
||
# но для автоматической очистки это может быть избыточно.
|
||
# Просто удаляем.
|
||
|
||
delete_query = (
|
||
delete(models.Session)
|
||
.where(models.Session.last_active < thirty_days_ago)
|
||
)
|
||
|
||
result = await db.execute(delete_query)
|
||
await db.commit()
|
||
|
||
print(f"[{datetime.now()}] CRON: Успешно удалено {result.rowcount} истекших сессий.")
|
||
else:
|
||
print(f"[{datetime.now()}] CRON: Истекшие сессии для удаления не найдены.")
|
||
|