Files
remnawave-minishop/db/dal/message_log_dal.py
T

89 lines
2.7 KiB
Python

import logging
from typing import List, Optional
from sqlalchemy import func, or_
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from ..models import MessageLog
async def create_message_log(session: AsyncSession, log_data: dict) -> Optional[MessageLog]:
try:
log_entry = await create_message_log_no_commit(session, log_data)
await session.commit()
await session.refresh(log_entry)
return log_entry
except Exception as e:
await session.rollback()
logging.error(f"Failed to create and commit message log: {e}", exc_info=True)
return None
async def get_all_message_logs(session: AsyncSession, limit: int, offset: int) -> List[MessageLog]:
stmt = select(MessageLog).order_by(MessageLog.timestamp.desc()).limit(limit).offset(offset)
result = await session.execute(stmt)
return result.scalars().all()
async def count_all_message_logs(session: AsyncSession) -> int:
stmt = select(func.count()).select_from(MessageLog)
result = await session.execute(stmt)
return result.scalar_one()
async def get_user_message_logs(
session: AsyncSession, user_id_to_search: int, limit: int, offset: int
) -> List[MessageLog]:
stmt = (
select(MessageLog)
.where(
or_(
MessageLog.user_id == user_id_to_search,
MessageLog.target_user_id == user_id_to_search,
)
)
.order_by(MessageLog.timestamp.desc())
.limit(limit)
.offset(offset)
)
result = await session.execute(stmt)
return result.scalars().all()
async def count_user_message_logs(session: AsyncSession, user_id_to_search: int) -> int:
stmt = (
select(func.count())
.select_from(MessageLog)
.where(
or_(
MessageLog.user_id == user_id_to_search,
MessageLog.target_user_id == user_id_to_search,
)
)
)
result = await session.execute(stmt)
return result.scalar_one()
async def create_message_log_no_commit(session: AsyncSession, log_data: dict) -> MessageLog:
if log_data.get("target_user_id"):
from .user_dal import get_user_by_id
target_user = await get_user_by_id(session, log_data["target_user_id"])
if not target_user:
logging.warning(
f"Target user {log_data['target_user_id']} not found for message log. Setting to NULL." # noqa: E501
)
log_data["target_user_id"] = None
new_log = MessageLog(**log_data)
session.add(new_log)
logging.debug(
f"Message log added to session: user {log_data.get('user_id')}, event {log_data.get('event_type')}" # noqa: E501
)
return new_log