"""跨模块事件双写发布器。""" from __future__ import annotations import json import uuid from sqlalchemy import text from common_const import EVENT_STATUS_PENDING async def publish_event( redis, db, *, event_id: str | None = None, event_name: str, trace_id: str, trigger_user_id: int | None, customer_id: int | None, payload: dict, ) -> str: requested_event_id = event_id event_id = event_id or uuid.uuid4().hex envelope = { "event_id": event_id, "event_name": event_name, "trace_id": trace_id, "trigger_user_id": trigger_user_id, "customer_id": customer_id, "payload": payload, } if requested_event_id: existing = await db.scalar( text("SELECT event_id FROM event_log WHERE event_id = :event_id"), {"event_id": event_id}, ) if existing: await redis.publish(event_name, json.dumps(envelope, ensure_ascii=False)) return event_id statement = text( """ INSERT INTO event_log (event_id, event_name, trace_id, trigger_user_id, customer_id, payload, status) VALUES (:event_id, :event_name, :trace_id, :trigger_user_id, :customer_id, :payload, :status) """ ) await db.execute( statement, { "event_id": event_id, "event_name": event_name, "trace_id": trace_id, "trigger_user_id": trigger_user_id, "customer_id": customer_id, "payload": json.dumps(payload, ensure_ascii=False), "status": EVENT_STATUS_PENDING, }, ) await db.commit() await redis.publish(event_name, json.dumps(envelope, ensure_ascii=False)) return event_id