add the 'Select' option to the FetchConfigs
This commit is contained in:
parent
b4ca01785f
commit
1a63e5fa91
|
@ -9,6 +9,7 @@ import (
|
|||
type FetchConfig struct {
|
||||
Server string
|
||||
Filter *models.DailyPlayerStatsFilter
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -38,10 +38,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg dailyplayerstats.FetchC
|
|||
}
|
||||
query = query.Apply(relationshipAndSortAppender.Append)
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -21,7 +21,6 @@ func (ucase *usecase) Fetch(ctx context.Context, cfg dailyplayerstats.FetchConfi
|
|||
if cfg.Filter == nil {
|
||||
cfg.Filter = &models.DailyPlayerStatsFilter{}
|
||||
}
|
||||
|
||||
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > dailyplayerstats.FetchLimit || cfg.Limit <= 0) {
|
||||
cfg.Limit = dailyplayerstats.FetchLimit
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
type FetchConfig struct {
|
||||
Server string
|
||||
Filter *models.DailyTribeStatsFilter
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -38,10 +38,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg dailytribestats.FetchCo
|
|||
}
|
||||
query = query.Apply(relationshipAndSortAppender.Append)
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
type FetchConfig struct {
|
||||
Server string
|
||||
Filter *models.EnnoblementFilter
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -38,10 +38,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg ennoblement.FetchConfig
|
|||
}
|
||||
query = query.Apply(relationshipAndSortAppender.Append)
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
2
go.sum
2
go.sum
|
@ -160,8 +160,6 @@ github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GH
|
|||
github.com/tribalwarshelp/map-generator v0.0.0-20210106163923-fa048a59f5f2 h1:yYSQuWN6YvY0cL77Ha7Y350Xm2/J+6suHubv5F/ZluY=
|
||||
github.com/tribalwarshelp/map-generator v0.0.0-20210106163923-fa048a59f5f2/go.mod h1:ywyp0CZ3JsJ+0GAbUJVWo3dipHcAohD7KkV2TNbiTHU=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20210106162314-d3488036ca2f/go.mod h1:vtDs7EjEysk4dpFPfu3c4lkICXZYIRV0BrT7rsqG0dw=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20210115163415-972e2df3f7db h1:RzMEF4BP3YJ7jJOyYO00TdeB6DY7g0Dp/8cQ8t6WKzw=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20210115163415-972e2df3f7db/go.mod h1:vtDs7EjEysk4dpFPfu3c4lkICXZYIRV0BrT7rsqG0dw=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20210321105345-7a8582fd0b91 h1:YxUIaDrLe3nE+8MHWxcGn1f/Ic0AfC/iS8/tnHAm2iE=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20210321105345-7a8582fd0b91/go.mod h1:EnTN6KBL5jZZnan7cVOWIsAO3q+a1XNPpa9m6Pv3MeM=
|
||||
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
|
||||
|
|
|
@ -11,6 +11,10 @@ import (
|
|||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
const (
|
||||
wait = 4 * time.Millisecond
|
||||
)
|
||||
|
||||
type DataLoaders struct {
|
||||
VersionByCode *VersionLoader
|
||||
}
|
||||
|
@ -25,7 +29,7 @@ type Config struct {
|
|||
func NewDataLoaders(cfg Config) *DataLoaders {
|
||||
return &DataLoaders{
|
||||
VersionByCode: &VersionLoader{
|
||||
wait: 4 * time.Millisecond,
|
||||
wait: wait,
|
||||
maxBatch: 0,
|
||||
fetch: func(keys []string) ([]*models.Version, []error) {
|
||||
codes := []models.VersionCode{}
|
||||
|
@ -36,6 +40,7 @@ func NewDataLoaders(cfg Config) *DataLoaders {
|
|||
Filter: &models.VersionFilter{
|
||||
Code: codes,
|
||||
},
|
||||
Select: true,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, []error{err}
|
||||
|
|
|
@ -2,8 +2,6 @@ package dataloaders
|
|||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/tribalwarshelp/api/player"
|
||||
"github.com/tribalwarshelp/api/tribe"
|
||||
"github.com/tribalwarshelp/api/village"
|
||||
|
@ -19,13 +17,14 @@ type ServerDataLoaders struct {
|
|||
func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
|
||||
return &ServerDataLoaders{
|
||||
PlayerByID: &PlayerLoader{
|
||||
wait: 2 * time.Millisecond,
|
||||
wait: wait,
|
||||
maxBatch: 0,
|
||||
fetch: func(ids []int) ([]*models.Player, []error) {
|
||||
players, _, err := cfg.PlayerRepo.Fetch(context.Background(), player.FetchConfig{
|
||||
Filter: &models.PlayerFilter{
|
||||
ID: ids,
|
||||
},
|
||||
Select: true,
|
||||
Server: server,
|
||||
})
|
||||
if err != nil {
|
||||
|
@ -46,7 +45,7 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
|
|||
},
|
||||
},
|
||||
TribeByID: &TribeLoader{
|
||||
wait: 2 * time.Millisecond,
|
||||
wait: wait,
|
||||
maxBatch: 0,
|
||||
fetch: func(ids []int) ([]*models.Tribe, []error) {
|
||||
tribes, _, err := cfg.TribeRepo.Fetch(context.Background(), tribe.FetchConfig{
|
||||
|
@ -54,6 +53,7 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
|
|||
Filter: &models.TribeFilter{
|
||||
ID: ids,
|
||||
},
|
||||
Select: true,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, []error{err}
|
||||
|
@ -73,7 +73,7 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
|
|||
},
|
||||
},
|
||||
VillageByID: &VillageLoader{
|
||||
wait: 2 * time.Millisecond,
|
||||
wait: wait,
|
||||
maxBatch: 0,
|
||||
fetch: func(ids []int) ([]*models.Village, []error) {
|
||||
villages, _, err := cfg.VillageRepo.Fetch(context.Background(), village.FetchConfig{
|
||||
|
@ -82,6 +82,7 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
|
|||
Filter: &models.VillageFilter{
|
||||
ID: ids,
|
||||
},
|
||||
Select: true,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, []error{err}
|
||||
|
|
|
@ -2,8 +2,6 @@ package dataloaders
|
|||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
)
|
||||
|
||||
|
@ -15,7 +13,7 @@ type VersionDataLoaders struct {
|
|||
func NewVersionDataLoaders(versionCode models.VersionCode, cfg Config) *VersionDataLoaders {
|
||||
return &VersionDataLoaders{
|
||||
PlayerServersByID: &PlayerServersLoader{
|
||||
wait: 2 * time.Millisecond,
|
||||
wait: wait,
|
||||
maxBatch: 0,
|
||||
fetch: func(keys []int) ([][]string, []error) {
|
||||
playerServersByID, err := cfg.PlayerRepo.FetchPlayerServers(context.Background(), versionCode, keys...)
|
||||
|
@ -30,7 +28,7 @@ func NewVersionDataLoaders(versionCode models.VersionCode, cfg Config) *VersionD
|
|||
},
|
||||
},
|
||||
PlayerNameChangesByID: &PlayerNameChangesLoader{
|
||||
wait: 2 * time.Millisecond,
|
||||
wait: wait,
|
||||
maxBatch: 0,
|
||||
fetch: func(keys []int) ([][]*models.PlayerNameChange, []error) {
|
||||
playerNameChangesByID, err := cfg.PlayerRepo.FetchNameChanges(context.Background(), versionCode, keys...)
|
||||
|
|
|
@ -31,6 +31,7 @@ func (r *queryResolver) DailyPlayerStats(ctx context.Context,
|
|||
Sort: sort,
|
||||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Select: shouldSelectItems(ctx),
|
||||
Count: shouldCount(ctx),
|
||||
})
|
||||
return list, err
|
||||
|
|
|
@ -31,6 +31,7 @@ func (r *queryResolver) DailyTribeStats(ctx context.Context,
|
|||
Sort: sort,
|
||||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Select: shouldSelectItems(ctx),
|
||||
Count: shouldCount(ctx),
|
||||
})
|
||||
return list, err
|
||||
|
|
|
@ -63,6 +63,7 @@ func (r *queryResolver) Ennoblements(ctx context.Context, server string,
|
|||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Count: shouldCount(ctx),
|
||||
Select: shouldSelectItems(ctx),
|
||||
})
|
||||
return list, err
|
||||
}
|
||||
|
|
|
@ -67,11 +67,19 @@ func getTribe(ctx context.Context, id int) *models.Tribe {
|
|||
return nil
|
||||
}
|
||||
|
||||
func shouldCount(ctx context.Context) bool {
|
||||
func findField(ctx context.Context, name string) bool {
|
||||
for _, field := range graphql.CollectFieldsCtx(ctx, nil) {
|
||||
if field.Name == countField {
|
||||
if field.Name == name {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func shouldCount(ctx context.Context) bool {
|
||||
return findField(ctx, countField)
|
||||
}
|
||||
|
||||
func shouldSelectItems(ctx context.Context) bool {
|
||||
return findField(ctx, itemsField)
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ func (r *queryResolver) Players(ctx context.Context,
|
|||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Count: shouldCount(ctx),
|
||||
Select: shouldSelectItems(ctx),
|
||||
})
|
||||
return list, err
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ func (r *Resolver) PlayerHistory(ctx context.Context,
|
|||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Count: shouldCount(ctx),
|
||||
Select: shouldSelectItems(ctx),
|
||||
})
|
||||
return list, err
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ import (
|
|||
|
||||
const (
|
||||
countField = "total"
|
||||
itemsField = "items"
|
||||
)
|
||||
|
||||
type Resolver struct {
|
||||
|
|
|
@ -33,6 +33,7 @@ func (r *queryResolver) Servers(ctx context.Context,
|
|||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Count: shouldCount(ctx),
|
||||
Select: shouldSelectItems(ctx),
|
||||
})
|
||||
return list, err
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ func (r *Resolver) ServerStats(ctx context.Context,
|
|||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Count: shouldCount(ctx),
|
||||
Select: shouldSelectItems(ctx),
|
||||
})
|
||||
return list, err
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ func (r *queryResolver) Tribes(ctx context.Context,
|
|||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Count: shouldCount(ctx),
|
||||
Select: shouldSelectItems(ctx),
|
||||
})
|
||||
return list, err
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ func (r *Resolver) TribeChanges(ctx context.Context,
|
|||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Count: shouldCount(ctx),
|
||||
Select: shouldSelectItems(ctx),
|
||||
Server: server,
|
||||
})
|
||||
return list, err
|
||||
|
|
|
@ -31,6 +31,7 @@ func (r *Resolver) TribeHistory(ctx context.Context,
|
|||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Count: shouldCount(ctx),
|
||||
Select: shouldSelectItems(ctx),
|
||||
Server: server,
|
||||
})
|
||||
return list, err
|
||||
|
|
|
@ -21,6 +21,7 @@ func (r *queryResolver) Versions(ctx context.Context,
|
|||
Sort: sort,
|
||||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Select: shouldSelectItems(ctx),
|
||||
Count: shouldCount(ctx),
|
||||
})
|
||||
return list, err
|
||||
|
|
|
@ -30,6 +30,7 @@ func (r *queryResolver) Villages(ctx context.Context,
|
|||
Sort: sort,
|
||||
Limit: utils.SafeIntPointer(limit, 0),
|
||||
Offset: utils.SafeIntPointer(offset, 0),
|
||||
Select: shouldSelectItems(ctx),
|
||||
Count: shouldCount(ctx),
|
||||
Server: server,
|
||||
})
|
||||
|
|
|
@ -29,6 +29,7 @@ func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloaders.Conf
|
|||
versionDataLoaders := make(map[models.VersionCode]*dataloaders.VersionDataLoaders)
|
||||
servers, _, err := dltcc.ServerRepo.Fetch(c.Request.Context(), server.FetchConfig{
|
||||
Columns: []string{utils.Underscore("versionCode"), "key"},
|
||||
Select: true,
|
||||
})
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, &gqlerror.Error{
|
||||
|
|
|
@ -16,13 +16,13 @@ type NetworksAndIps struct {
|
|||
}
|
||||
|
||||
func (networksAndIps NetworksAndIps) Contains(ip net.IP) bool {
|
||||
for _, expectedIP := range networksAndIps.Ips {
|
||||
if expectedIP.Equal(ip) {
|
||||
for _, whitelistedIP := range networksAndIps.Ips {
|
||||
if whitelistedIP.Equal(ip) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
for _, subnetwork := range networksAndIps.Networks {
|
||||
if subnetwork.Contains(ip) {
|
||||
for _, network := range networksAndIps.Networks {
|
||||
if network.Contains(ip) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
@ -43,7 +43,10 @@ func (cfg LimitWhitelistConfig) GetNetworksAndIps() NetworksAndIps {
|
|||
continue
|
||||
}
|
||||
|
||||
ips = append(ips, net.ParseIP(ip))
|
||||
parsed := net.ParseIP(ip)
|
||||
if parsed != nil {
|
||||
ips = append(ips, parsed)
|
||||
}
|
||||
}
|
||||
return NetworksAndIps{
|
||||
Networks: networks,
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
type FetchConfig struct {
|
||||
Server string
|
||||
Filter *models.PlayerFilter
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -39,10 +39,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg player.FetchConfig) ([]
|
|||
}
|
||||
query = query.Apply(relationshipAndSortAppender.Append)
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -37,8 +37,9 @@ func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*mode
|
|||
Filter: &models.PlayerFilter{
|
||||
ID: []int{id},
|
||||
},
|
||||
Limit: 1,
|
||||
Count: false,
|
||||
Limit: 1,
|
||||
Count: false,
|
||||
Select: true,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -10,6 +10,7 @@ type FetchConfig struct {
|
|||
Server string
|
||||
Filter *models.PlayerHistoryFilter
|
||||
Count bool
|
||||
Select bool
|
||||
Sort []string
|
||||
Limit int
|
||||
Offset int
|
||||
|
|
|
@ -38,10 +38,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg playerhistory.FetchConf
|
|||
}
|
||||
query = query.Apply(relationshipAndSortAppender.Append)
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
type FetchConfig struct {
|
||||
Filter *models.ServerFilter
|
||||
Columns []string
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -41,10 +41,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg server.FetchConfig) ([]
|
|||
query = query.Column(cfg.Columns...)
|
||||
}
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
return nil, 0, fmt.Errorf("Internal server error")
|
||||
|
|
|
@ -34,8 +34,9 @@ func (ucase *usecase) GetByKey(ctx context.Context, key string) (*models.Server,
|
|||
Filter: &models.ServerFilter{
|
||||
Key: []string{key},
|
||||
},
|
||||
Limit: 1,
|
||||
Count: false,
|
||||
Limit: 1,
|
||||
Count: false,
|
||||
Select: true,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -32,38 +32,14 @@ func New(villageRepo village.Repository) servermap.Usecase {
|
|||
func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersConfig) ([]*generator.Marker, error) {
|
||||
g := new(errgroup.Group)
|
||||
|
||||
tribes := make(map[string][]int)
|
||||
tribeIDs := []int{}
|
||||
cache := make(map[int]bool)
|
||||
for _, data := range cfg.Tribes {
|
||||
//id,#color
|
||||
id, color, err := parseMarker(data)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "tribe=%s", data)
|
||||
}
|
||||
if ok := cache[id]; ok || color == "" {
|
||||
continue
|
||||
}
|
||||
tribeIDs = append(tribeIDs, id)
|
||||
cache[id] = true
|
||||
tribes[color] = append(tribes[color], id)
|
||||
tribes, tribeIDs, err := toMarkers(cfg.Tribes)
|
||||
if err == nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
players := make(map[string][]int)
|
||||
playerIDs := []int{}
|
||||
cache = make(map[int]bool)
|
||||
for _, data := range cfg.Players {
|
||||
//id,#color
|
||||
id, color, err := parseMarker(data)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "player=%s", data)
|
||||
}
|
||||
if ok := cache[id]; ok || color == "" {
|
||||
continue
|
||||
}
|
||||
playerIDs = append(playerIDs, id)
|
||||
cache[id] = true
|
||||
players[color] = append(players[color], id)
|
||||
players, playerIDs, err := toMarkers(cfg.Players)
|
||||
if err == nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
otherMarkers := []*generator.Marker{}
|
||||
|
@ -82,6 +58,7 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
|
|||
TribeIDNEQ: tribeIDs,
|
||||
},
|
||||
},
|
||||
Select: true,
|
||||
Columns: []string{"x", "y"},
|
||||
Count: false,
|
||||
})
|
||||
|
@ -108,6 +85,7 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
|
|||
Filter: &models.VillageFilter{
|
||||
PlayerID: []int{0},
|
||||
},
|
||||
Select: true,
|
||||
Columns: []string{"x", "y"},
|
||||
Count: false,
|
||||
})
|
||||
|
@ -138,6 +116,7 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
|
|||
TribeID: ids,
|
||||
},
|
||||
},
|
||||
Select: true,
|
||||
Columns: []string{"x", "y"},
|
||||
Count: false,
|
||||
})
|
||||
|
@ -166,6 +145,7 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
|
|||
Filter: &models.VillageFilter{
|
||||
PlayerID: ids,
|
||||
},
|
||||
Select: true,
|
||||
Columns: []string{"x", "y"},
|
||||
Count: false,
|
||||
})
|
||||
|
@ -183,14 +163,17 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
|
|||
})
|
||||
}
|
||||
|
||||
err := g.Wait()
|
||||
err = g.Wait()
|
||||
if err == nil {
|
||||
return nil, err
|
||||
}
|
||||
sort.SliceStable(playerMarkers, func(i, j int) bool {
|
||||
return len(playerMarkers[i].Villages) < len(playerMarkers[j].Villages)
|
||||
})
|
||||
sort.SliceStable(tribeMarkers, func(i, j int) bool {
|
||||
return len(tribeMarkers[i].Villages) < len(tribeMarkers[j].Villages)
|
||||
})
|
||||
return concatMarkers(otherMarkers, tribeMarkers, playerMarkers), err
|
||||
return concatMarkers(otherMarkers, tribeMarkers, playerMarkers), nil
|
||||
}
|
||||
|
||||
func concatMarkers(slices ...[]*generator.Marker) []*generator.Marker {
|
||||
|
@ -206,14 +189,14 @@ func concatMarkers(slices ...[]*generator.Marker) []*generator.Marker {
|
|||
return tmp
|
||||
}
|
||||
|
||||
func parseMarker(str string) (int, string, error) {
|
||||
splitted := strings.Split(str, ",")
|
||||
func toMarker(param string) (int, string, error) {
|
||||
splitted := strings.Split(param, ",")
|
||||
if len(splitted) != 2 {
|
||||
return 0, "", fmt.Errorf("%s: Invalid marker format (should be id,#hexcolor)", str)
|
||||
return 0, "", fmt.Errorf("%s: Invalid marker format (should be id,#hexcolor)", param)
|
||||
}
|
||||
id, err := strconv.Atoi(splitted[0])
|
||||
if err != nil {
|
||||
return 0, "", errors.Wrapf(err, "%s: Invalid marker format (should be id,#hexcolor)", str)
|
||||
return 0, "", errors.Wrapf(err, "%s: Invalid marker format (should be id,#hexcolor)", param)
|
||||
}
|
||||
if id <= 0 {
|
||||
return 0, "", fmt.Errorf("ID should be greater than 0")
|
||||
|
@ -221,3 +204,23 @@ func parseMarker(str string) (int, string, error) {
|
|||
|
||||
return id, splitted[1], nil
|
||||
}
|
||||
|
||||
func toMarkers(params []string) (map[string][]int, []int, error) {
|
||||
idsByColor := make(map[string][]int)
|
||||
ids := []int{}
|
||||
cache := make(map[int]bool)
|
||||
for _, param := range params {
|
||||
//id,#color
|
||||
id, color, err := toMarker(param)
|
||||
if err != nil {
|
||||
return nil, nil, errors.Wrapf(err, "invalid param %s", param)
|
||||
}
|
||||
if ok := cache[id]; ok || color == "" {
|
||||
continue
|
||||
}
|
||||
ids = append(ids, id)
|
||||
cache[id] = true
|
||||
idsByColor[color] = append(idsByColor[color], id)
|
||||
}
|
||||
return idsByColor, ids, nil
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
type FetchConfig struct {
|
||||
Server string
|
||||
Filter *models.ServerStatsFilter
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -33,10 +33,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg serverstats.FetchConfig
|
|||
query = query.Apply(cfg.Filter.Where)
|
||||
}
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -10,6 +10,7 @@ type FetchConfig struct {
|
|||
Server string
|
||||
Filter *models.TribeFilter
|
||||
Count bool
|
||||
Select bool
|
||||
Sort []string
|
||||
Limit int
|
||||
Offset int
|
||||
|
|
|
@ -34,10 +34,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg tribe.FetchConfig) ([]*
|
|||
query = query.Apply(cfg.Filter.Where)
|
||||
}
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -39,6 +39,7 @@ func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*mode
|
|||
Limit: 1,
|
||||
Server: server,
|
||||
Count: false,
|
||||
Select: true,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -10,6 +10,7 @@ type FetchConfig struct {
|
|||
Server string
|
||||
Filter *models.TribeChangeFilter
|
||||
Count bool
|
||||
Select bool
|
||||
Sort []string
|
||||
Limit int
|
||||
Offset int
|
||||
|
|
|
@ -38,10 +38,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg tribechange.FetchConfig
|
|||
}
|
||||
query = query.Apply(relationshipAndSortAppender.Append)
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
type FetchConfig struct {
|
||||
Server string
|
||||
Filter *models.TribeHistoryFilter
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -38,10 +38,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg tribehistory.FetchConfi
|
|||
}
|
||||
query = query.Apply(relationshipAndSortAppender.Append)
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
|
||||
type FetchConfig struct {
|
||||
Filter *models.VersionFilter
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -38,10 +38,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg version.FetchConfig) ([
|
|||
query = query.Apply(cfg.Filter.Where)
|
||||
}
|
||||
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
return nil, 0, fmt.Errorf("Internal server error")
|
||||
|
|
|
@ -38,7 +38,9 @@ func (ucase *usecase) GetByCode(ctx context.Context, code models.VersionCode) (*
|
|||
Filter: &models.VersionFilter{
|
||||
Code: []models.VersionCode{code},
|
||||
},
|
||||
Limit: 1,
|
||||
Limit: 1,
|
||||
Select: true,
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -10,6 +10,7 @@ type FetchConfig struct {
|
|||
Server string
|
||||
Filter *models.VillageFilter
|
||||
Columns []string
|
||||
Select bool
|
||||
Count bool
|
||||
Sort []string
|
||||
Limit int
|
||||
|
|
|
@ -41,10 +41,12 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg village.FetchConfig) ([
|
|||
query = query.Apply(relationshipAndSortAppender.Append)
|
||||
|
||||
total := 0
|
||||
if cfg.Count {
|
||||
if cfg.Count && cfg.Select {
|
||||
total, err = query.SelectAndCount()
|
||||
} else {
|
||||
} else if cfg.Select {
|
||||
err = query.Select()
|
||||
} else if cfg.Count {
|
||||
total, err = query.Count()
|
||||
}
|
||||
if err != nil && err != pg.ErrNoRows {
|
||||
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
|
||||
|
|
|
@ -37,6 +37,8 @@ func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*mode
|
|||
},
|
||||
Limit: 1,
|
||||
Server: server,
|
||||
Select: true,
|
||||
Count: false,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
Reference in New Issue