46 lines
1.2 KiB
Go
46 lines
1.2 KiB
Go
package mqtt
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
pahomqtt "github.com/eclipse/paho.mqtt.golang"
|
|
"stream.api/internal/database/model"
|
|
"stream.api/internal/service"
|
|
"stream.api/pkg/logger"
|
|
)
|
|
|
|
type notificationPublisher struct {
|
|
client pahomqtt.Client
|
|
logger logger.Logger
|
|
prefix string
|
|
}
|
|
|
|
func NewNotificationPublisher(client pahomqtt.Client, appLogger logger.Logger) service.NotificationEventPublisher {
|
|
if client == nil {
|
|
return service.NotificationEventPublisher(serviceNotificationNoop{})
|
|
}
|
|
return ¬ificationPublisher{client: client, logger: appLogger, prefix: defaultMQTTPrefix}
|
|
}
|
|
|
|
type serviceNotificationNoop struct{}
|
|
|
|
func (serviceNotificationNoop) PublishNotificationCreated(context.Context, *model.Notification) error {
|
|
return nil
|
|
}
|
|
|
|
func (p *notificationPublisher) PublishNotificationCreated(_ context.Context, notification *model.Notification) error {
|
|
if p == nil || notification == nil {
|
|
return nil
|
|
}
|
|
message := mqttEvent{
|
|
Type: "notification.created",
|
|
Payload: service.BuildNotificationCreatedPayload(notification),
|
|
}
|
|
return publishMQTTJSON(p.client, p.notificationTopic(notification.UserID), message)
|
|
}
|
|
|
|
func (p *notificationPublisher) notificationTopic(userID string) string {
|
|
return fmt.Sprintf("%s/notifications/%s", p.prefix, userID)
|
|
}
|