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), }, }) }