64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
"""跨模块事件双写发布器。"""
|
|
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
|