package msg import ( "context" "fmt" "gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model" "github.com/ThreeDotsLabs/watermill" "github.com/ThreeDotsLabs/watermill/message" ) //counterfeiter:generate -o internal/mock/ennoblement_service.gen.go . EnnoblementService type EnnoblementService interface { Refresh(ctx context.Context, key, url string) error } type EnnoblementConsumer struct { marshaler CommandEventMarshaler publisher message.Publisher subscriber message.Subscriber logger watermill.LoggerAdapter svc EnnoblementService } func NewEnnoblementConsumer( marshaler CommandEventMarshaler, publisher message.Publisher, subscriber message.Subscriber, logger watermill.LoggerAdapter, svc EnnoblementService, ) *EnnoblementConsumer { return &EnnoblementConsumer{ marshaler: marshaler, publisher: publisher, subscriber: subscriber, logger: logger, svc: svc, } } func (e *EnnoblementConsumer) Register(router *message.Router) { router.AddHandler( "EnnoblementConsumer.refresh", ennoblementsCmdRefresh, e.subscriber, ennoblementsEventRefreshed, e.publisher, e.refresh, ) } func (e *EnnoblementConsumer) refresh(msg *message.Message) ([]*message.Message, error) { var payload model.RefreshEnnoblementsCmdPayload if err := e.marshaler.Unmarshal(msg, &payload); err != nil { e.logger.Error("invalid payload, dropping message", err, watermill.LogFields{ "handler_name": message.HandlerNameFromCtx(msg.Context()), }) return nil, nil } if err := e.svc.Refresh(msg.Context(), payload.Key, payload.URL); err != nil { return nil, fmt.Errorf("EnnoblementService.Refresh: %w", err) } ev, err := e.marshaler.Marshal(model.EnnoblementsRefreshedEvPayload(payload)) if err != nil { return nil, fmt.Errorf("marshaler.Marshal: %w", err) } return []*message.Message{ev}, nil }