2026-05-20 14:34:10 +08:00

91 lines
3.1 KiB
Go

package integration
import (
"context"
"strconv"
roomeventsv1 "hyapp.local/api/proto/events/room/v1"
"hyapp/pkg/rocketmqx"
"hyapp/pkg/roommq"
)
// RocketMQOutboxPublisher publishes durable room_outbox facts to a RocketMQ topic.
type RocketMQOutboxPublisher struct {
producer *rocketmqx.Producer
topic string
}
// NewRocketMQOutboxPublisher creates a room_outbox fanout publisher.
func NewRocketMQOutboxPublisher(producer *rocketmqx.Producer, topic string) *RocketMQOutboxPublisher {
return &RocketMQOutboxPublisher{producer: producer, topic: topic}
}
// PublishOutboxEvent implements OutboxPublisher.
func (p *RocketMQOutboxPublisher) PublishOutboxEvent(ctx context.Context, envelope *roomeventsv1.EventEnvelope) error {
body, err := roommq.EncodeRoomOutboxMessage(envelope)
if err != nil {
return err
}
return p.producer.SendSync(ctx, rocketmqx.Message{
Topic: p.topic,
Tag: roommq.TagRoomOutboxEvent,
Keys: []string{envelope.GetEventId(), envelope.GetRoomId()},
Body: body,
Properties: map[string]string{
"message_type": roommq.MessageTypeRoomOutboxEvent,
"app_code": envelope.GetAppCode(),
"room_id": envelope.GetRoomId(),
"event_id": envelope.GetEventId(),
"event_type": envelope.GetEventType(),
"room_version": strconv.FormatInt(envelope.GetRoomVersion(), 10),
"occurred_at_ms": strconv.FormatInt(envelope.GetOccurredAtMs(), 10),
"source_database": "hyapp_room",
"source_table": "room_outbox",
"delivery_version": "1",
},
})
}
// RocketMQTreasureOpenScheduler publishes exact-time treasure wakeup messages.
type RocketMQTreasureOpenScheduler struct {
producer *rocketmqx.Producer
topic string
}
// NewRocketMQTreasureOpenScheduler creates the delayed open scheduler.
func NewRocketMQTreasureOpenScheduler(producer *rocketmqx.Producer, topic string) *RocketMQTreasureOpenScheduler {
return &RocketMQTreasureOpenScheduler{producer: producer, topic: topic}
}
// ScheduleRoomTreasureOpen implements RoomTreasureOpenScheduler.
func (s *RocketMQTreasureOpenScheduler) ScheduleRoomTreasureOpen(ctx context.Context, schedule RoomTreasureOpenSchedule) error {
body, err := roommq.EncodeRoomTreasureOpenDueMessage(roommq.RoomTreasureOpenDueMessage{
AppCode: schedule.AppCode,
RoomID: schedule.RoomID,
BoxID: schedule.BoxID,
Level: schedule.Level,
OpenAtMS: schedule.OpenAtMS,
ResetAtMS: schedule.ResetAtMS,
CommandID: schedule.CommandID,
})
if err != nil {
return err
}
return s.producer.SendSync(ctx, rocketmqx.Message{
Topic: s.topic,
Tag: roommq.TagRoomTreasureOpenDue,
Keys: []string{schedule.BoxID, schedule.RoomID},
Body: body,
DeliveryAtMS: schedule.OpenAtMS,
Properties: map[string]string{
"message_type": roommq.MessageTypeRoomTreasureOpenDue,
"app_code": schedule.AppCode,
"room_id": schedule.RoomID,
"box_id": schedule.BoxID,
"level": strconv.FormatInt(int64(schedule.Level), 10),
"open_at_ms": strconv.FormatInt(schedule.OpenAtMS, 10),
"reset_at_ms": strconv.FormatInt(schedule.ResetAtMS, 10),
},
})
}