All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #23
110 lines
2.9 KiB
Go
110 lines
2.9 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/domain"
|
|
"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)
|
|
List(ctx context.Context, groupID string) ([]domain.Monitor, error)
|
|
Get(ctx context.Context, id string) (domain.Monitor, error)
|
|
Delete(ctx context.Context, id string) error
|
|
}
|
|
|
|
//counterfeiter:generate -o internal/mock/group_getter.gen.go . GroupGetter
|
|
type GroupGetter interface {
|
|
Get(ctx context.Context, id, serverID string) (domain.Group, error)
|
|
}
|
|
|
|
type Monitor struct {
|
|
repo MonitorRepository
|
|
client TWHelpClient
|
|
groupSvc GroupGetter
|
|
}
|
|
|
|
func NewMonitor(repo MonitorRepository, groupSvc GroupGetter, client TWHelpClient) *Monitor {
|
|
return &Monitor{repo: repo, client: client, groupSvc: groupSvc}
|
|
}
|
|
|
|
func (m *Monitor) Create(ctx context.Context, groupID, serverID, tribeTag string) (domain.Monitor, error) {
|
|
// check if group exists
|
|
group, err := m.groupSvc.Get(ctx, groupID, serverID)
|
|
if err != nil {
|
|
if errors.Is(err, domain.GroupNotFoundError{ID: groupID}) {
|
|
return domain.Monitor{}, domain.GroupDoesNotExistError{ID: groupID}
|
|
}
|
|
return domain.Monitor{}, fmt.Errorf("GroupService.Get: %w", err)
|
|
}
|
|
|
|
// check limit
|
|
monitors, err := m.repo.List(ctx, group.ID)
|
|
if err != nil {
|
|
return domain.Monitor{}, fmt.Errorf("MonitorRepository.List: %w", err)
|
|
}
|
|
|
|
if len(monitors) >= maxMonitorsPerGroup {
|
|
return domain.Monitor{}, domain.MonitorLimitReachedError{
|
|
Current: len(monitors),
|
|
Limit: maxMonitorsPerGroup,
|
|
}
|
|
}
|
|
|
|
// check if tribe exists
|
|
tribe, err := m.client.GetTribeByTag(ctx, group.VersionCode, group.ServerKey, tribeTag)
|
|
if err != nil {
|
|
var apiErr twhelp.APIError
|
|
if !errors.As(err, &apiErr) {
|
|
return domain.Monitor{}, fmt.Errorf("TWHelpClient.GetServer: %w", err)
|
|
}
|
|
return domain.Monitor{}, domain.TribeDoesNotExistError{
|
|
Tag: tribeTag,
|
|
}
|
|
}
|
|
|
|
if !tribe.DeletedAt.IsZero() {
|
|
return domain.Monitor{}, domain.TribeDoesNotExistError{
|
|
Tag: tribeTag,
|
|
}
|
|
}
|
|
|
|
params, err := domain.NewCreateMonitorParams(group.ID, tribe.ID)
|
|
if err != nil {
|
|
return domain.Monitor{}, fmt.Errorf("domain.NewCreateMonitorParams: %w", err)
|
|
}
|
|
|
|
monitor, err := m.repo.Create(ctx, params)
|
|
if err != nil {
|
|
return domain.Monitor{}, fmt.Errorf("MonitorRepository.Create: %w", err)
|
|
}
|
|
|
|
return monitor, nil
|
|
}
|
|
|
|
func (m *Monitor) Delete(ctx context.Context, id, serverID string) error {
|
|
monitor, err := m.repo.Get(ctx, id)
|
|
if err != nil {
|
|
return fmt.Errorf("MonitorRepository.Get: %w", err)
|
|
}
|
|
|
|
_, err = m.groupSvc.Get(ctx, monitor.GroupID, serverID)
|
|
if err != nil {
|
|
return fmt.Errorf("GroupService.Get: %w", err)
|
|
}
|
|
|
|
if err = m.repo.Delete(ctx, id); err != nil {
|
|
return fmt.Errorf("MonitorRepository.Delete: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|