58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
import logging
|
|
from datetime import datetime, timezone
|
|
from typing import Optional
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from db.dal import message_log_dal
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def _clean_piece(value: Optional[object]) -> str:
|
|
return str(value or "").strip()
|
|
|
|
|
|
async def log_user_message_delivery(
|
|
session: AsyncSession,
|
|
*,
|
|
target_user_id: Optional[int],
|
|
event_type: str,
|
|
channel: str,
|
|
content: str,
|
|
recipient: Optional[str] = None,
|
|
timestamp: Optional[datetime] = None,
|
|
) -> None:
|
|
"""Add a best-effort user log entry for important outbound messages."""
|
|
clean_event = _clean_piece(event_type)
|
|
clean_channel = _clean_piece(channel)
|
|
if not clean_event or not clean_channel:
|
|
return
|
|
|
|
parts = [f"channel={clean_channel}"]
|
|
clean_recipient = _clean_piece(recipient)
|
|
if clean_recipient:
|
|
parts.append(f"recipient={clean_recipient}")
|
|
clean_content = _clean_piece(content)
|
|
if clean_content:
|
|
parts.append(clean_content)
|
|
|
|
try:
|
|
await message_log_dal.create_message_log_no_commit(
|
|
session,
|
|
{
|
|
"user_id": None,
|
|
"event_type": clean_event,
|
|
"content": " | ".join(parts)[:4000],
|
|
"is_admin_event": False,
|
|
"target_user_id": int(target_user_id) if target_user_id is not None else None,
|
|
"timestamp": timestamp or datetime.now(timezone.utc),
|
|
},
|
|
)
|
|
except Exception:
|
|
logger.exception(
|
|
"Failed to add outbound message audit log for user %s event %s",
|
|
target_user_id,
|
|
clean_event,
|
|
)
|