From de19857b349119a84e97b4a43673400ce30c2d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Wysoki=C5=84ski?= Date: Thu, 27 Oct 2022 12:12:29 +0000 Subject: [PATCH] refactor: maxMonitorsPerGroup, maxGroupsPerServer -> ENVs (#27) Reviewed-on: https://gitea.dwysokinski.me/twhelp/dcbot/pulls/27 --- cmd/dcbot/internal/run/run.go | 8 +++++--- internal/service/group.go | 21 +++++++++++---------- internal/service/group_test.go | 8 ++++---- internal/service/monitor.go | 29 ++++++++++++++--------------- internal/service/monitor_test.go | 12 ++++++------ k8s/base/bot.yml | 4 ++++ 6 files changed, 44 insertions(+), 38 deletions(-) diff --git a/cmd/dcbot/internal/run/run.go b/cmd/dcbot/internal/run/run.go index be829b2..e615ac5 100644 --- a/cmd/dcbot/internal/run/run.go +++ b/cmd/dcbot/internal/run/run.go @@ -47,8 +47,8 @@ func New() *cli.Command { monitorRepo := bundb.NewMonitor(db) choiceSvc := service.NewChoice(client) - groupSvc := service.NewGroup(groupRepo, client) - monitorSvc := service.NewMonitor(monitorRepo, groupRepo, client) + groupSvc := service.NewGroup(groupRepo, client, cfg.MaxGroupsPerServer) + monitorSvc := service.NewMonitor(monitorRepo, groupRepo, client, cfg.MaxMonitorsPerGroup) bot, err := discord.NewBot(cfg.Token, groupSvc, monitorSvc, choiceSvc) if err != nil { @@ -77,7 +77,9 @@ func New() *cli.Command { } type botConfig struct { - Token string `envconfig:"TOKEN" required:"true"` + Token string `envconfig:"TOKEN" required:"true"` + MaxGroupsPerServer int `envconfig:"MAX_GROUPS_PER_SERVER" default:"10"` + MaxMonitorsPerGroup int `envconfig:"MAX_MONITORS_PER_GROUP" default:"10"` } func newBotConfig() (botConfig, error) { diff --git a/internal/service/group.go b/internal/service/group.go index 85cabdd..e0ef3a4 100644 --- a/internal/service/group.go +++ b/internal/service/group.go @@ -9,10 +9,6 @@ import ( "gitea.dwysokinski.me/twhelp/dcbot/internal/twhelp" ) -const ( - maxGroupsPerServer = 10 -) - //counterfeiter:generate -o internal/mock/group_repository.gen.go . GroupRepository type GroupRepository interface { Create(ctx context.Context, params domain.CreateGroupParams) (domain.Group, error) @@ -23,12 +19,17 @@ type GroupRepository interface { } type Group struct { - repo GroupRepository - client TWHelpClient + repo GroupRepository + client TWHelpClient + maxGroupsPerServer int } -func NewGroup(repo GroupRepository, client TWHelpClient) *Group { - return &Group{repo: repo, client: client} +func NewGroup(repo GroupRepository, client TWHelpClient, maxGroupsPerServer int) *Group { + return &Group{ + repo: repo, + client: client, + maxGroupsPerServer: maxGroupsPerServer, + } } func (g *Group) Create(ctx context.Context, params domain.CreateGroupParams) (domain.Group, error) { @@ -39,10 +40,10 @@ func (g *Group) Create(ctx context.Context, params domain.CreateGroupParams) (do return domain.Group{}, fmt.Errorf("GroupRepository.List: %w", err) } - if len(groups) >= maxGroupsPerServer { + if len(groups) >= g.maxGroupsPerServer { return domain.Group{}, domain.GroupLimitReachedError{ Current: len(groups), - Limit: maxGroupsPerServer, + Limit: g.maxGroupsPerServer, } } diff --git a/internal/service/group_test.go b/internal/service/group_test.go index 35db996..49935d3 100644 --- a/internal/service/group_test.go +++ b/internal/service/group_test.go @@ -53,7 +53,7 @@ func TestGroup_Create(t *testing.T) { }, nil }) - g, err := service.NewGroup(repo, client).Create(context.Background(), params) + g, err := service.NewGroup(repo, client, 1).Create(context.Background(), params) assert.NoError(t, err) assert.NotEmpty(t, g.ID) assert.Equal(t, params.ServerID(), g.ServerID) @@ -72,7 +72,7 @@ func TestGroup_Create(t *testing.T) { repo := &mock.FakeGroupRepository{} repo.ListReturns(make([]domain.Group, maxGroupsPerServer), nil) - g, err := service.NewGroup(repo, nil).Create(context.Background(), params) + g, err := service.NewGroup(repo, nil, maxGroupsPerServer).Create(context.Background(), params) assert.ErrorIs(t, err, domain.GroupLimitReachedError{ Current: maxGroupsPerServer, Limit: maxGroupsPerServer, @@ -94,7 +94,7 @@ func TestGroup_Create(t *testing.T) { } }) - g, err := service.NewGroup(repo, client).Create(context.Background(), params) + g, err := service.NewGroup(repo, client, 1).Create(context.Background(), params) assert.ErrorIs(t, err, domain.ServerDoesNotExistError{ VersionCode: params.VersionCode(), Key: params.ServerKey(), @@ -117,7 +117,7 @@ func TestGroup_Create(t *testing.T) { }, nil }) - g, err := service.NewGroup(repo, client).Create(context.Background(), params) + g, err := service.NewGroup(repo, client, 1).Create(context.Background(), params) assert.ErrorIs(t, err, domain.ServerIsClosedError{ VersionCode: params.VersionCode(), Key: params.ServerKey(), diff --git a/internal/service/monitor.go b/internal/service/monitor.go index dc37ddf..e1d9c82 100644 --- a/internal/service/monitor.go +++ b/internal/service/monitor.go @@ -11,10 +11,6 @@ import ( "gitea.dwysokinski.me/twhelp/dcbot/internal/twhelp" ) -const ( - maxMonitorsPerGroup = 10 -) - //counterfeiter:generate -o internal/mock/monitor_repository.gen.go . MonitorRepository type MonitorRepository interface { Create(ctx context.Context, params domain.CreateMonitorParams) (domain.Monitor, error) @@ -30,23 +26,26 @@ type GroupReader interface { } type Monitor struct { - repo MonitorRepository - client TWHelpClient - groupSvc GroupReader - ennoblementsMu sync.Mutex // ennoblementsMu is used by Monitor.fetchEnnoblements - ennoblementsSince map[string]time.Time // ennoblementsSince is used by Monitor.fetchEnnoblements + repo MonitorRepository + client TWHelpClient + groupSvc GroupReader + maxMonitorsPerGroup int + ennoblementsMu sync.Mutex // ennoblementsMu is used by Monitor.fetchEnnoblements + ennoblementsSince map[string]time.Time // ennoblementsSince is used by Monitor.fetchEnnoblements } func NewMonitor( repo MonitorRepository, groupSvc GroupReader, client TWHelpClient, + maxMonitorsPerGroup int, ) *Monitor { return &Monitor{ - repo: repo, - client: client, - groupSvc: groupSvc, - ennoblementsSince: make(map[string]time.Time), + repo: repo, + client: client, + groupSvc: groupSvc, + maxMonitorsPerGroup: maxMonitorsPerGroup, + ennoblementsSince: make(map[string]time.Time), } } @@ -66,10 +65,10 @@ func (m *Monitor) Create(ctx context.Context, groupID, serverID, tribeTag string return domain.Monitor{}, fmt.Errorf("MonitorRepository.List: %w", err) } - if len(monitors) >= maxMonitorsPerGroup { + if len(monitors) >= m.maxMonitorsPerGroup { return domain.Monitor{}, domain.MonitorLimitReachedError{ Current: len(monitors), - Limit: maxMonitorsPerGroup, + Limit: m.maxMonitorsPerGroup, } } diff --git a/internal/service/monitor_test.go b/internal/service/monitor_test.go index 89f3909..26a330e 100644 --- a/internal/service/monitor_test.go +++ b/internal/service/monitor_test.go @@ -56,7 +56,7 @@ func TestMonitor_Create(t *testing.T) { groupID := uuid.NewString() - monitor, err := service.NewMonitor(repo, groupSvc, client). + monitor, err := service.NewMonitor(repo, groupSvc, client, 10). Create(context.Background(), groupID, uuid.NewString(), tribe.Tag) assert.NoError(t, err) assert.NotEmpty(t, monitor.ID) @@ -72,7 +72,7 @@ func TestMonitor_Create(t *testing.T) { groupSvc := &mock.FakeGroupReader{} groupSvc.GetReturns(domain.Group{}, domain.GroupNotFoundError{ID: groupID}) - monitor, err := service.NewMonitor(nil, groupSvc, nil). + monitor, err := service.NewMonitor(nil, groupSvc, nil, 10). Create(context.Background(), groupID, uuid.NewString(), "tag") assert.ErrorIs(t, err, domain.GroupDoesNotExistError{ ID: groupID, @@ -101,7 +101,7 @@ func TestMonitor_Create(t *testing.T) { }, nil }) - monitor, err := service.NewMonitor(repo, groupSvc, nil). + monitor, err := service.NewMonitor(repo, groupSvc, nil, maxMonitorsPerGroup). Create(context.Background(), uuid.NewString(), uuid.NewString(), "TAG") assert.ErrorIs(t, err, domain.MonitorLimitReachedError{ Current: maxMonitorsPerGroup, @@ -148,7 +148,7 @@ func TestMonitor_Create(t *testing.T) { tag := "TAG" - monitor, err := service.NewMonitor(repo, groupSvc, client). + monitor, err := service.NewMonitor(repo, groupSvc, client, 10). Create(context.Background(), uuid.NewString(), uuid.NewString(), tag) assert.ErrorIs(t, err, domain.TribeDoesNotExistError{ Tag: tag, @@ -185,7 +185,7 @@ func TestMonitor_Create(t *testing.T) { } client.GetTribeByTagReturns(tribe, nil) - monitor, err := service.NewMonitor(repo, groupSvc, client). + monitor, err := service.NewMonitor(repo, groupSvc, client, 10). Create(context.Background(), uuid.NewString(), uuid.NewString(), tribe.Tag) assert.ErrorIs(t, err, domain.TribeDoesNotExistError{ Tag: tribe.Tag, @@ -598,7 +598,7 @@ func TestMonitor_Execute(t *testing.T) { return monitors[groupID], nil }) - notifications, err := service.NewMonitor(repo, groupSvc, client). + notifications, err := service.NewMonitor(repo, groupSvc, client, 10). Execute(context.Background()) assert.NoError(t, err) expectedNotifications := []domain.EnnoblementNotification{ diff --git a/k8s/base/bot.yml b/k8s/base/bot.yml index c6e80a3..fde31d9 100644 --- a/k8s/base/bot.yml +++ b/k8s/base/bot.yml @@ -34,6 +34,10 @@ spec: key: token - name: TWHELP_URL value: "https://tribalwarshelp.com" + - name: BOT_MAX_GROUPS_PER_SERVER + value: "10" + - name: BOT_MAX_MONITORS_PER_GROUP + value: "10" livenessProbe: exec: command: [ "cat", "/tmp/healthy" ]