This repository has been archived on 2024-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
core-old/internal/msg/consumer_tribe.go
Dawid Wysokiński 0f0e0cd3ee
All checks were successful
continuous-integration/drone/push Build is passing
feat(msg): add logger to consumers (#40)
Reviewed-on: twhelp/core#40
2022-08-21 07:11:28 +00:00

112 lines
2.8 KiB
Go

package msg
import (
"context"
"fmt"
"github.com/ThreeDotsLabs/watermill"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill/message"
)
//counterfeiter:generate -o internal/mock/tribe_service.gen.go . TribeService
type TribeService interface {
Refresh(ctx context.Context, key, url string) (int64, error)
UpdateDominance(ctx context.Context, serverKey string, numPlayerVillages int64) error
}
type TribeConsumer struct {
marshaler CommandEventMarshaler
publisher message.Publisher
subscriber message.Subscriber
logger watermill.LoggerAdapter
svc TribeService
}
func NewTribeConsumer(
marshaler CommandEventMarshaler,
publisher message.Publisher,
subscriber message.Subscriber,
logger watermill.LoggerAdapter,
svc TribeService,
) *TribeConsumer {
return &TribeConsumer{
marshaler: marshaler,
publisher: publisher,
subscriber: subscriber,
logger: logger,
svc: svc,
}
}
func (t *TribeConsumer) Register(router *message.Router) {
router.AddHandler(
"TribeConsumer.refresh",
serversEventRefreshed,
t.subscriber,
tribesEventRefreshed,
t.publisher,
t.refresh,
)
router.AddNoPublisherHandler(
"TribeConsumer.updateDominance",
villagesEventRefreshed,
t.subscriber,
t.updateDominance,
)
}
func (t *TribeConsumer) refresh(msg *message.Message) ([]*message.Message, error) {
var payload model.ServerRefreshedEvPayload
if err := t.marshaler.Unmarshal(msg, &payload); err != nil {
t.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil, nil
}
if !payload.Open {
t.logger.Debug("server is closed, dropping message", watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(msg.Context()),
"server_key": payload.Key,
"version_code": payload.VersionCode,
})
return nil, nil
}
numTribes, err := t.svc.Refresh(msg.Context(), payload.Key, payload.URL)
if err != nil {
return nil, fmt.Errorf("TribeService.Refresh: %w", err)
}
ev, err := t.marshaler.Marshal(model.TribesRefreshedEvPayload{
Key: payload.Key,
URL: payload.URL,
VersionCode: payload.VersionCode,
NumTribes: numTribes,
})
if err != nil {
return nil, fmt.Errorf("marshaler.Marshal: %w", err)
}
return []*message.Message{ev}, nil
}
func (t *TribeConsumer) updateDominance(msg *message.Message) error {
var payload model.VillagesRefreshedEvPayload
if err := t.marshaler.Unmarshal(msg, &payload); err != nil {
t.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil
}
if err := t.svc.UpdateDominance(msg.Context(), payload.Key, payload.NumPlayerVillages); err != nil {
return fmt.Errorf("TribeService.UpdateDominance: %w", err)
}
return nil
}