91 lines
3.1 KiB
Go
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),
|
|
},
|
|
})
|
|
}
|