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_village.go
Dawid Wysokiński d244dc69bf
All checks were successful
continuous-integration/drone/push Build is passing
refactor: remove otel (#140)
Reviewed-on: twhelp/core#140
2022-12-20 07:27:13 +00:00

93 lines
2.4 KiB
Go

package msg
import (
"context"
"fmt"
"gitea.dwysokinski.me/twhelp/core/internal/msg/internal/model"
"github.com/ThreeDotsLabs/watermill"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"github.com/ThreeDotsLabs/watermill/message"
)
//counterfeiter:generate -o internal/mock/village_service.gen.go . VillageService
type VillageService interface {
Refresh(ctx context.Context, key, url string) (domain.RefreshVillagesResult, error)
}
type VillageConsumer struct {
marshaler CommandEventMarshaler
publisher message.Publisher
subscriber message.Subscriber
logger watermill.LoggerAdapter
svc VillageService
}
func NewVillageConsumer(
marshaler CommandEventMarshaler,
publisher message.Publisher,
subscriber message.Subscriber,
logger watermill.LoggerAdapter,
svc VillageService,
) *VillageConsumer {
return &VillageConsumer{
marshaler: marshaler,
publisher: publisher,
subscriber: subscriber,
logger: logger,
svc: svc,
}
}
func (v *VillageConsumer) Register(router *message.Router) {
router.AddHandler(
"VillageConsumer.refresh",
serversEventRefreshed,
v.subscriber,
villagesEventRefreshed,
v.publisher,
v.refresh,
)
}
func (v *VillageConsumer) refresh(msg *message.Message) ([]*message.Message, error) {
var payload model.ServerRefreshedEvPayload
if err := v.marshaler.Unmarshal(msg, &payload); err != nil {
v.logger.Error("invalid payload, dropping message", err, watermill.LogFields{
"handler_name": message.HandlerNameFromCtx(msg.Context()),
})
return nil, nil
}
if !payload.Open {
v.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
}
res, err := v.svc.Refresh(msg.Context(), payload.Key, payload.URL)
if err != nil {
return nil, fmt.Errorf("VillageService.Refresh: %w", err)
}
ev, err := v.marshaler.Marshal(model.VillagesRefreshedEvPayload{
Key: payload.Key,
URL: payload.URL,
VersionCode: payload.VersionCode,
NumVillages: res.NumVillages,
NumPlayerVillages: res.NumPlayerVillages,
NumBarbarianVillages: res.NumBarbarianVillages,
NumBonusVillages: res.NumBonusVillages,
})
if err != nil {
return nil, fmt.Errorf("marshaler.Marshal: %w", err)
}
return []*message.Message{ev}, nil
}