97 lines
3.0 KiB
Python
97 lines
3.0 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 sqlalchemy.orm import selectinload
|
|
|
|
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)
|
|
.options(selectinload(MessageLog.author_user), selectinload(MessageLog.target_user))
|
|
.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)
|
|
.options(selectinload(MessageLog.author_user), selectinload(MessageLog.target_user))
|
|
.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
|