mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2026-01-27 04:54:25 +00:00
feature: mqtt support
This commit is contained in:
104
pkg/mqttspec/mqttspec.go
Normal file
104
pkg/mqttspec/mqttspec.go
Normal file
@@ -0,0 +1,104 @@
|
||||
package mqttspec
|
||||
|
||||
import (
|
||||
"github.com/bitechdev/ResolveSpec/pkg/common"
|
||||
"github.com/bitechdev/ResolveSpec/pkg/common/adapters/database"
|
||||
"github.com/bitechdev/ResolveSpec/pkg/modelregistry"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
"github.com/uptrace/bun"
|
||||
)
|
||||
|
||||
// NewHandlerWithGORM creates an MQTT handler with GORM database adapter
|
||||
func NewHandlerWithGORM(db *gorm.DB, opts ...Option) (*Handler, error) {
|
||||
adapter := database.NewGormAdapter(db)
|
||||
registry := modelregistry.NewModelRegistry()
|
||||
return NewHandlerWithDatabase(adapter, registry, opts...)
|
||||
}
|
||||
|
||||
// NewHandlerWithBun creates an MQTT handler with Bun database adapter
|
||||
func NewHandlerWithBun(db *bun.DB, opts ...Option) (*Handler, error) {
|
||||
adapter := database.NewBunAdapter(db)
|
||||
registry := modelregistry.NewModelRegistry()
|
||||
return NewHandlerWithDatabase(adapter, registry, opts...)
|
||||
}
|
||||
|
||||
// NewHandlerWithDatabase creates an MQTT handler with a custom database adapter
|
||||
func NewHandlerWithDatabase(db common.Database, registry common.ModelRegistry, opts ...Option) (*Handler, error) {
|
||||
// Start with default configuration
|
||||
config := DefaultConfig()
|
||||
|
||||
// Create handler with basic initialization
|
||||
// Note: broker and clientManager will be initialized after options are applied
|
||||
handler, err := NewHandler(db, registry, config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Apply functional options
|
||||
for _, opt := range opts {
|
||||
if err := opt(handler); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// Reinitialize broker based on final config (after options)
|
||||
if handler.config.BrokerMode == BrokerModeEmbedded {
|
||||
handler.broker = NewEmbeddedBroker(handler.config.Broker, handler.clientManager)
|
||||
} else {
|
||||
handler.broker = NewExternalBrokerClient(handler.config.ExternalBroker, handler.clientManager)
|
||||
}
|
||||
|
||||
// Set handler reference in broker
|
||||
handler.broker.SetHandler(handler)
|
||||
|
||||
return handler, nil
|
||||
}
|
||||
|
||||
// Option is a functional option for configuring the handler
|
||||
type Option func(*Handler) error
|
||||
|
||||
// WithEmbeddedBroker configures the handler to use an embedded MQTT broker
|
||||
func WithEmbeddedBroker(config BrokerConfig) Option {
|
||||
return func(h *Handler) error {
|
||||
h.config.BrokerMode = BrokerModeEmbedded
|
||||
h.config.Broker = config
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// WithExternalBroker configures the handler to connect to an external MQTT broker
|
||||
func WithExternalBroker(config ExternalBrokerConfig) Option {
|
||||
return func(h *Handler) error {
|
||||
h.config.BrokerMode = BrokerModeExternal
|
||||
h.config.ExternalBroker = config
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// WithHooks sets a pre-configured hook registry
|
||||
func WithHooks(hooks *HookRegistry) Option {
|
||||
return func(h *Handler) error {
|
||||
h.hooks = hooks
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// WithTopicPrefix sets a custom topic prefix (default: "spec")
|
||||
func WithTopicPrefix(prefix string) Option {
|
||||
return func(h *Handler) error {
|
||||
h.config.Topics.Prefix = prefix
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// WithQoS sets custom QoS levels for different message types
|
||||
func WithQoS(request, response, notification byte) Option {
|
||||
return func(h *Handler) error {
|
||||
h.config.QoS.Request = request
|
||||
h.config.QoS.Response = response
|
||||
h.config.QoS.Notification = notification
|
||||
return nil
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user