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",
},
})
}
// RocketMQRocketLaunchScheduler publishes exact-time rocket wakeup messages.
type RocketMQRocketLaunchScheduler struct {
producer *rocketmqx.Producer
topic string
}
// NewRocketMQRocketLaunchScheduler creates the delayed launch scheduler.
func NewRocketMQRocketLaunchScheduler(producer *rocketmqx.Producer, topic string) *RocketMQRocketLaunchScheduler {
return &RocketMQRocketLaunchScheduler{producer: producer, topic: topic}
}
// ScheduleRoomRocketLaunch implements RoomRocketLaunchScheduler.
func (s *RocketMQRocketLaunchScheduler) ScheduleRoomRocketLaunch(ctx context.Context, schedule RoomRocketLaunchSchedule) error {
body, err := roommq.EncodeRoomRocketLaunchDueMessage(roommq.RoomRocketLaunchDueMessage{
AppCode: schedule.AppCode,
RoomID: schedule.RoomID,
RocketID: schedule.RocketID,
Level: schedule.Level,
LaunchAtMS: schedule.LaunchAtMS,
ResetAtMS: schedule.ResetAtMS,
CommandID: schedule.CommandID,
})
if err != nil {
return err
}
return s.producer.SendSync(ctx, rocketmqx.Message{
Topic: s.topic,
Tag: roommq.TagRoomRocketLaunchDue,
Keys: []string{schedule.RocketID, schedule.RoomID},
Body: body,
DeliveryAtMS: schedule.LaunchAtMS,
Properties: map[string]string{
"message_type": roommq.MessageTypeRoomRocketLaunchDue,
"app_code": schedule.AppCode,
"room_id": schedule.RoomID,
"rocket_id": schedule.RocketID,
"level": strconv.FormatInt(int64(schedule.Level), 10),
"launch_at_ms": strconv.FormatInt(schedule.LaunchAtMS, 10),
"reset_at_ms": strconv.FormatInt(schedule.ResetAtMS, 10),
},
})
}