bump github.com/tribalwarshelp/shared and github.com/tribalwarshelp/map-generator

This commit is contained in:
Dawid Wysokiński 2021-05-05 19:32:45 +02:00
parent cd3e429b5b
commit 0a271d1255
87 changed files with 1334 additions and 1555 deletions

View File

@ -1,4 +1,2 @@
gqlgen:
bash ./scripts/gqlgen-generate.sh
dev:
bash ./scripts/dev.sh

View File

@ -2,13 +2,12 @@ package dailyplayerstats
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.DailyPlayerStatsFilter
Filter *twmodel.DailyPlayerStatsFilter
Select bool
Count bool
Sort []string
@ -17,5 +16,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.DailyPlayerStats, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.DailyPlayerStats, int, error)
}

View File

@ -2,12 +2,14 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/tribalwarshelp/api/dailyplayerstats"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -18,25 +20,21 @@ func NewPGRepository(db *pg.DB) dailyplayerstats.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg dailyplayerstats.FetchConfig) ([]*models.DailyPlayerStats, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg dailyplayerstats.FetchConfig) ([]*twmodel.DailyPlayerStats, int, error) {
var err error
data := []*models.DailyPlayerStats{}
var data []*twmodel.DailyPlayerStats
total := 0
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset)
relationshipAndSortAppender := &models.DailyPlayerStatsRelationshipAndSortAppender{
Filter: &models.DailyPlayerStatsFilter{},
Sort: cfg.Sort,
}
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
relationshipAndSortAppender.Filter = cfg.Filter
}
query = query.Apply(relationshipAndSortAppender.Append)
Offset(cfg.Offset).
Apply(cfg.Filter.WhereWithRelations).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()
@ -47,9 +45,9 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg dailyplayerstats.FetchC
}
if err != nil && err != pg.ErrNoRows {
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
return nil, 0, fmt.Errorf("Server not found")
return nil, 0, errors.New("Server not found")
}
return nil, 0, fmt.Errorf("Internal server error")
return nil, 0, errors.New("Internal server error")
}
return data, total, nil

View File

@ -2,10 +2,9 @@ package dailyplayerstats
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.DailyPlayerStats, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.DailyPlayerStats, int, error)
}

View File

@ -2,11 +2,10 @@ package usecase
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/dailyplayerstats"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -17,13 +16,12 @@ func New(repo dailyplayerstats.Repository) dailyplayerstats.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg dailyplayerstats.FetchConfig) ([]*models.DailyPlayerStats, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg dailyplayerstats.FetchConfig) ([]*twmodel.DailyPlayerStats, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.DailyPlayerStatsFilter{}
cfg.Filter = &twmodel.DailyPlayerStatsFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > dailyplayerstats.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = dailyplayerstats.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}

View File

@ -2,13 +2,12 @@ package dailytribestats
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.DailyTribeStatsFilter
Filter *twmodel.DailyTribeStatsFilter
Select bool
Count bool
Sort []string
@ -17,5 +16,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.DailyTribeStats, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.DailyTribeStats, int, error)
}

View File

@ -3,11 +3,13 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/tribalwarshelp/api/dailytribestats"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -18,25 +20,21 @@ func NewPGRepository(db *pg.DB) dailytribestats.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg dailytribestats.FetchConfig) ([]*models.DailyTribeStats, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg dailytribestats.FetchConfig) ([]*twmodel.DailyTribeStats, int, error) {
var err error
data := []*models.DailyTribeStats{}
data := []*twmodel.DailyTribeStats{}
total := 0
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset)
relationshipAndSortAppender := &models.DailyTribeStatsRelationshipAndSortAppender{
Filter: &models.DailyTribeStatsFilter{},
Sort: cfg.Sort,
}
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
relationshipAndSortAppender.Filter = cfg.Filter
}
query = query.Apply(relationshipAndSortAppender.Append)
Offset(cfg.Offset).
Apply(cfg.Filter.WhereWithRelations).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()

View File

@ -2,10 +2,9 @@ package dailytribestats
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.DailyTribeStats, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.DailyTribeStats, int, error)
}

View File

@ -2,11 +2,10 @@ package usecase
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/dailytribestats"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -17,14 +16,12 @@ func New(repo dailytribestats.Repository) dailytribestats.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg dailytribestats.FetchConfig) ([]*models.DailyTribeStats, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg dailytribestats.FetchConfig) ([]*twmodel.DailyTribeStats, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.DailyTribeStatsFilter{}
cfg.Filter = &twmodel.DailyTribeStatsFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > dailytribestats.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = dailytribestats.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}

View File

@ -2,13 +2,12 @@ package ennoblement
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.EnnoblementFilter
Filter *twmodel.EnnoblementFilter
Select bool
Count bool
Sort []string
@ -17,5 +16,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Ennoblement, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Ennoblement, int, error)
}

View File

@ -2,12 +2,14 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/tribalwarshelp/api/ennoblement"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -18,25 +20,21 @@ func NewPGRepository(db *pg.DB) ennoblement.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg ennoblement.FetchConfig) ([]*models.Ennoblement, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg ennoblement.FetchConfig) ([]*twmodel.Ennoblement, int, error) {
var err error
total := 0
data := []*models.Ennoblement{}
data := []*twmodel.Ennoblement{}
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset)
relationshipAndSortAppender := &models.EnnoblementRelationshipAndSortAppender{
Filter: &models.EnnoblementFilter{},
Sort: cfg.Sort,
}
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
relationshipAndSortAppender.Filter = cfg.Filter
}
query = query.Apply(relationshipAndSortAppender.Append)
Offset(cfg.Offset).
Apply(cfg.Filter.WhereWithRelations).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()
@ -47,9 +45,9 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg ennoblement.FetchConfig
}
if err != nil && err != pg.ErrNoRows {
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
return nil, 0, fmt.Errorf("Server not found")
return nil, 0, errors.New("Server not found")
}
return nil, 0, fmt.Errorf("Internal server error")
return nil, 0, errors.New("Internal server error")
}
return data, total, nil

View File

@ -2,10 +2,9 @@ package ennoblement
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Ennoblement, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Ennoblement, int, error)
}

View File

@ -2,10 +2,10 @@ package usecase
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/ennoblement"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -16,14 +16,12 @@ func New(repo ennoblement.Repository) ennoblement.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg ennoblement.FetchConfig) ([]*models.Ennoblement, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg ennoblement.FetchConfig) ([]*twmodel.Ennoblement, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.EnnoblementFilter{}
cfg.Filter = &twmodel.EnnoblementFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > ennoblement.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = ennoblement.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}

7
go.mod
View File

@ -4,8 +4,11 @@ go 1.16
require (
github.com/99designs/gqlgen v0.13.0
github.com/Kichiyaki/appmode v0.0.0-20210502105643-0a26207c548d
github.com/Kichiyaki/gin-logrus v0.0.0-20210428175948-4f47ab6231a6
github.com/Kichiyaki/go-pg-logrus-query-logger/v10 v10.0.0-20210428180109-fb97298564d9
github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210505101614-8a71f17a0466
github.com/Kichiyaki/goutil v0.0.0-20210504132659-3d843a787db7
github.com/agnivade/levenshtein v1.1.0 // indirect
github.com/gin-contrib/cors v1.3.1
github.com/gin-gonic/gin v1.6.3
@ -16,8 +19,8 @@ require (
github.com/onsi/gomega v1.10.4 // indirect
github.com/pkg/errors v0.9.1
github.com/sirupsen/logrus v1.8.1
github.com/tribalwarshelp/map-generator v0.0.0-20210423190517-1da85d9287dc
github.com/tribalwarshelp/shared v0.0.0-20210423190057-03d8445d35dc
github.com/tribalwarshelp/map-generator v0.0.0-20210505172714-6520104d1450
github.com/tribalwarshelp/shared v0.0.0-20210505172413-bf85190fd66d
github.com/vektah/gqlparser/v2 v2.1.0
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect

26
go.sum
View File

@ -2,14 +2,19 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA=
github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Kichiyaki/gin-logrus v0.0.0-20210424132338-4ac67b4af979 h1:IgLHMjg5lAVpJ0zNcInVR8Q6WloI55v8rOoTXSHGx/A=
github.com/Kichiyaki/gin-logrus v0.0.0-20210424132338-4ac67b4af979/go.mod h1:6ieK3YHhyNxjkbBUR3B1IsfXi+A+LeS0SEPV10iH/cg=
github.com/Kichiyaki/appmode v0.0.0-20210502105643-0a26207c548d h1:ApX13STtfJc2YPH5D2JnBa6+4AM2vt7a81so/MPr/bA=
github.com/Kichiyaki/appmode v0.0.0-20210502105643-0a26207c548d/go.mod h1:41p1KTy/fiVocPnJR2h/iXh2NvWWVBdNoZrN8TWVXUI=
github.com/Kichiyaki/gin-logrus v0.0.0-20210428175948-4f47ab6231a6 h1:abarqFzXWxx4VElTTVWJch1u01Kf6T/zLip+Uv2yUf4=
github.com/Kichiyaki/gin-logrus v0.0.0-20210428175948-4f47ab6231a6/go.mod h1:6ieK3YHhyNxjkbBUR3B1IsfXi+A+LeS0SEPV10iH/cg=
github.com/Kichiyaki/go-pg-logrus-query-logger/v10 v10.0.0-20210423175217-c83fa01c60d7 h1:7IdSzhdupqm4AC3UDH9b5gdCDE2SlX6qkVC0zwqAuLA=
github.com/Kichiyaki/go-pg-logrus-query-logger/v10 v10.0.0-20210423175217-c83fa01c60d7/go.mod h1:ADHVWnGlWcRn1aGthuh7I1Lrn6zzsjkVJju151dXyDw=
github.com/Kichiyaki/go-pg-logrus-query-logger/v10 v10.0.0-20210428180109-fb97298564d9 h1:S/08K0AD4bXYeSPJKei8ZbumDy1JNARZsgYbNZgr9Tk=
github.com/Kichiyaki/go-pg-logrus-query-logger/v10 v10.0.0-20210428180109-fb97298564d9/go.mod h1:ADHVWnGlWcRn1aGthuh7I1Lrn6zzsjkVJju151dXyDw=
github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83/go.mod h1:+iGkf5HfOVeRVd9K7qQDucIl+/Kt3MyenMa90b/O/c4=
github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210505093434-655fa2df248f/go.mod h1:MSAEhr8oeK+Rhjhqyl31/8/AI88thYky80OyD8mheDA=
github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210505101614-8a71f17a0466 h1:fK7dClaaUN/WV5IZgD/GbdD3YDoolNZ5oaLeNtVnfIc=
github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210505101614-8a71f17a0466/go.mod h1:MSAEhr8oeK+Rhjhqyl31/8/AI88thYky80OyD8mheDA=
github.com/Kichiyaki/goutil v0.0.0-20210502095630-318d17091eab/go.mod h1:+HhI932Xb0xrCodNcCv5GPiCjLYhDxWhCtlEqMIJhB4=
github.com/Kichiyaki/goutil v0.0.0-20210504132659-3d843a787db7 h1:OU3ZA5H8fHTzaYIw9UBfH3gtWRL0XmnczlhH3E2PjV4=
github.com/Kichiyaki/goutil v0.0.0-20210504132659-3d843a787db7/go.mod h1:+HhI932Xb0xrCodNcCv5GPiCjLYhDxWhCtlEqMIJhB4=
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
github.com/agnivade/levenshtein v1.0.3/go.mod h1:4SFRZbbXWLF4MU1T9Qg0pGgH3Pjs+t6ie5efyrwRJXs=
github.com/agnivade/levenshtein v1.1.0 h1:n6qGwyHG61v3ABce1rPVZklEYRT8NFpCMrpZdBUbYGM=
@ -150,7 +155,6 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@ -164,10 +168,14 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo=
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs=
github.com/tribalwarshelp/map-generator v0.0.0-20210423190517-1da85d9287dc h1:gNr9Tu5ujQH7wvgmapJXtyaQe+fhXCvfz+m6qYhiO1U=
github.com/tribalwarshelp/map-generator v0.0.0-20210423190517-1da85d9287dc/go.mod h1:odB3ZTsbWK+BbW4bEmOTmase97w9Xu3OqBiR+7+7JBA=
github.com/tribalwarshelp/shared v0.0.0-20210423190057-03d8445d35dc h1:giWPsD/6WTOrQl9KT5AXrrf3KLkHSGuNpWa2CyyaM6w=
github.com/tribalwarshelp/shared v0.0.0-20210423190057-03d8445d35dc/go.mod h1:CDQvesBYmSyGDl5X37xfa+ub55ZbikrHDuIZ4AcfM8I=
github.com/tribalwarshelp/map-generator v0.0.0-20210505171633-0ec559e0ee90 h1:9KG3hWBaGae1e8/+Ny7jEdwXKATnqyhipRMbZL8QsgQ=
github.com/tribalwarshelp/map-generator v0.0.0-20210505171633-0ec559e0ee90/go.mod h1:WYM9nyZLWJIpfZu1DGjTQhraUN0lwVT2fnJ1DFWMDcI=
github.com/tribalwarshelp/map-generator v0.0.0-20210505172714-6520104d1450 h1:Ej1AvIVPxPno6s4tr4MTg0pNlFA4E/aOxJE7uhYV3NI=
github.com/tribalwarshelp/map-generator v0.0.0-20210505172714-6520104d1450/go.mod h1:ND7ZOyvb9Kp/Mg8z58ZZlL8JPJFk0lsP1XnzFDuvtnk=
github.com/tribalwarshelp/shared v0.0.0-20210505171518-9aa09097fd04 h1:phczaKfpeiQt+JGnlVCuInrlv0etMk0f9RSJ9GmsgzQ=
github.com/tribalwarshelp/shared v0.0.0-20210505171518-9aa09097fd04/go.mod h1:GBnSKQrxL8Nmi3MViIzZVbyP9+ugd28gWArsSvw1iVU=
github.com/tribalwarshelp/shared v0.0.0-20210505172413-bf85190fd66d h1:aMlYOsJbYwKqHx7wAt526eIutV1Q5EnYK6b7lOzvPmk=
github.com/tribalwarshelp/shared v0.0.0-20210505172413-bf85190fd66d/go.mod h1:GBnSKQrxL8Nmi3MViIzZVbyP9+ugd28gWArsSvw1iVU=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go v1.2.5 h1:NozRHfUeEta89taVkyfsDVSy2f7v89Frft4pjnWuGuc=
github.com/ugorji/go v1.2.5/go.mod h1:gat2tIT8KJG8TVI8yv77nEO/KYT6dV7JE1gfUa8Xuls=

View File

@ -2,13 +2,13 @@ package dataloaders
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"time"
"github.com/tribalwarshelp/api/player"
"github.com/tribalwarshelp/api/tribe"
"github.com/tribalwarshelp/api/version"
"github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/shared/models"
)
const (
@ -31,13 +31,13 @@ func NewDataLoaders(cfg Config) *DataLoaders {
VersionByCode: &VersionLoader{
wait: wait,
maxBatch: 0,
fetch: func(keys []string) ([]*models.Version, []error) {
codes := []models.VersionCode{}
fetch: func(keys []string) ([]*twmodel.Version, []error) {
codes := []twmodel.VersionCode{}
for _, code := range keys {
codes = append(codes, models.VersionCode(code))
codes = append(codes, twmodel.VersionCode(code))
}
versions, _, err := cfg.VersionRepo.Fetch(context.Background(), version.FetchConfig{
Filter: &models.VersionFilter{
Filter: &twmodel.VersionFilter{
Code: codes,
},
Select: true,
@ -46,12 +46,12 @@ func NewDataLoaders(cfg Config) *DataLoaders {
return nil, []error{err}
}
versionByCode := make(map[models.VersionCode]*models.Version)
for _, version := range versions {
versionByCode[version.Code] = version
versionByCode := make(map[twmodel.VersionCode]*twmodel.Version)
for _, v := range versions {
versionByCode[v.Code] = v
}
inOrder := make([]*models.Version, len(keys))
inOrder := make([]*twmodel.Version, len(keys))
for i, code := range codes {
inOrder[i] = versionByCode[code]
}

View File

@ -3,16 +3,15 @@
package dataloaders
import (
"github.com/tribalwarshelp/shared/tw/twmodel"
"sync"
"time"
"github.com/tribalwarshelp/shared/models"
)
// PlayerLoaderConfig captures the config to create a new PlayerLoader
type PlayerLoaderConfig struct {
// Fetch is a method that provides the data for the loader
Fetch func(keys []int) ([]*models.Player, []error)
Fetch func(keys []int) ([]*twmodel.Player, []error)
// Wait is how long wait before sending a batch
Wait time.Duration
@ -33,7 +32,7 @@ func NewPlayerLoader(config PlayerLoaderConfig) *PlayerLoader {
// PlayerLoader batches and caches requests
type PlayerLoader struct {
// this method provides the data for the loader
fetch func(keys []int) ([]*models.Player, []error)
fetch func(keys []int) ([]*twmodel.Player, []error)
// how long to done before sending a batch
wait time.Duration
@ -44,7 +43,7 @@ type PlayerLoader struct {
// INTERNAL
// lazily created cache
cache map[int]*models.Player
cache map[int]*twmodel.Player
// the current batch. keys will continue to be collected until timeout is hit,
// then everything will be sent to the fetch method and out to the listeners
@ -56,25 +55,25 @@ type PlayerLoader struct {
type playerLoaderBatch struct {
keys []int
data []*models.Player
data []*twmodel.Player
error []error
closing bool
done chan struct{}
}
// Load a Player by key, batching and caching will be applied automatically
func (l *PlayerLoader) Load(key int) (*models.Player, error) {
func (l *PlayerLoader) Load(key int) (*twmodel.Player, error) {
return l.LoadThunk(key)()
}
// LoadThunk returns a function that when called will block waiting for a Player.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *PlayerLoader) LoadThunk(key int) func() (*models.Player, error) {
func (l *PlayerLoader) LoadThunk(key int) func() (*twmodel.Player, error) {
l.mu.Lock()
if it, ok := l.cache[key]; ok {
l.mu.Unlock()
return func() (*models.Player, error) {
return func() (*twmodel.Player, error) {
return it, nil
}
}
@ -85,10 +84,10 @@ func (l *PlayerLoader) LoadThunk(key int) func() (*models.Player, error) {
pos := batch.keyIndex(l, key)
l.mu.Unlock()
return func() (*models.Player, error) {
return func() (*twmodel.Player, error) {
<-batch.done
var data *models.Player
var data *twmodel.Player
if pos < len(batch.data) {
data = batch.data[pos]
}
@ -113,14 +112,14 @@ func (l *PlayerLoader) LoadThunk(key int) func() (*models.Player, error) {
// LoadAll fetches many keys at once. It will be broken into appropriate sized
// sub batches depending on how the loader is configured
func (l *PlayerLoader) LoadAll(keys []int) ([]*models.Player, []error) {
results := make([]func() (*models.Player, error), len(keys))
func (l *PlayerLoader) LoadAll(keys []int) ([]*twmodel.Player, []error) {
results := make([]func() (*twmodel.Player, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
players := make([]*models.Player, len(keys))
players := make([]*twmodel.Player, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
players[i], errors[i] = thunk()
@ -131,13 +130,13 @@ func (l *PlayerLoader) LoadAll(keys []int) ([]*models.Player, []error) {
// LoadAllThunk returns a function that when called will block waiting for a Players.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *PlayerLoader) LoadAllThunk(keys []int) func() ([]*models.Player, []error) {
results := make([]func() (*models.Player, error), len(keys))
func (l *PlayerLoader) LoadAllThunk(keys []int) func() ([]*twmodel.Player, []error) {
results := make([]func() (*twmodel.Player, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
return func() ([]*models.Player, []error) {
players := make([]*models.Player, len(keys))
return func() ([]*twmodel.Player, []error) {
players := make([]*twmodel.Player, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
players[i], errors[i] = thunk()
@ -149,7 +148,7 @@ func (l *PlayerLoader) LoadAllThunk(keys []int) func() ([]*models.Player, []erro
// Prime the cache with the provided key and value. If the key already exists, no change is made
// and false is returned.
// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)
func (l *PlayerLoader) Prime(key int, value *models.Player) bool {
func (l *PlayerLoader) Prime(key int, value *twmodel.Player) bool {
l.mu.Lock()
var found bool
if _, found = l.cache[key]; !found {
@ -169,9 +168,9 @@ func (l *PlayerLoader) Clear(key int) {
l.mu.Unlock()
}
func (l *PlayerLoader) unsafeSet(key int, value *models.Player) {
func (l *PlayerLoader) unsafeSet(key int, value *twmodel.Player) {
if l.cache == nil {
l.cache = map[int]*models.Player{}
l.cache = map[int]*twmodel.Player{}
}
l.cache[key] = value
}

View File

@ -3,16 +3,15 @@
package dataloaders
import (
"github.com/tribalwarshelp/shared/tw/twmodel"
"sync"
"time"
"github.com/tribalwarshelp/shared/models"
)
// PlayerNameChangesLoaderConfig captures the config to create a new PlayerNameChangesLoader
type PlayerNameChangesLoaderConfig struct {
// Fetch is a method that provides the data for the loader
Fetch func(keys []int) ([][]*models.PlayerNameChange, []error)
Fetch func(keys []int) ([][]*twmodel.PlayerNameChange, []error)
// Wait is how long wait before sending a batch
Wait time.Duration
@ -33,7 +32,7 @@ func NewPlayerNameChangesLoader(config PlayerNameChangesLoaderConfig) *PlayerNam
// PlayerNameChangesLoader batches and caches requests
type PlayerNameChangesLoader struct {
// this method provides the data for the loader
fetch func(keys []int) ([][]*models.PlayerNameChange, []error)
fetch func(keys []int) ([][]*twmodel.PlayerNameChange, []error)
// how long to done before sending a batch
wait time.Duration
@ -44,7 +43,7 @@ type PlayerNameChangesLoader struct {
// INTERNAL
// lazily created cache
cache map[int][]*models.PlayerNameChange
cache map[int][]*twmodel.PlayerNameChange
// the current batch. keys will continue to be collected until timeout is hit,
// then everything will be sent to the fetch method and out to the listeners
@ -56,25 +55,25 @@ type PlayerNameChangesLoader struct {
type playerNameChangesLoaderBatch struct {
keys []int
data [][]*models.PlayerNameChange
data [][]*twmodel.PlayerNameChange
error []error
closing bool
done chan struct{}
}
// Load a PlayerNameChange by key, batching and caching will be applied automatically
func (l *PlayerNameChangesLoader) Load(key int) ([]*models.PlayerNameChange, error) {
func (l *PlayerNameChangesLoader) Load(key int) ([]*twmodel.PlayerNameChange, error) {
return l.LoadThunk(key)()
}
// LoadThunk returns a function that when called will block waiting for a PlayerNameChange.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *PlayerNameChangesLoader) LoadThunk(key int) func() ([]*models.PlayerNameChange, error) {
func (l *PlayerNameChangesLoader) LoadThunk(key int) func() ([]*twmodel.PlayerNameChange, error) {
l.mu.Lock()
if it, ok := l.cache[key]; ok {
l.mu.Unlock()
return func() ([]*models.PlayerNameChange, error) {
return func() ([]*twmodel.PlayerNameChange, error) {
return it, nil
}
}
@ -85,10 +84,10 @@ func (l *PlayerNameChangesLoader) LoadThunk(key int) func() ([]*models.PlayerNam
pos := batch.keyIndex(l, key)
l.mu.Unlock()
return func() ([]*models.PlayerNameChange, error) {
return func() ([]*twmodel.PlayerNameChange, error) {
<-batch.done
var data []*models.PlayerNameChange
var data []*twmodel.PlayerNameChange
if pos < len(batch.data) {
data = batch.data[pos]
}
@ -113,14 +112,14 @@ func (l *PlayerNameChangesLoader) LoadThunk(key int) func() ([]*models.PlayerNam
// LoadAll fetches many keys at once. It will be broken into appropriate sized
// sub batches depending on how the loader is configured
func (l *PlayerNameChangesLoader) LoadAll(keys []int) ([][]*models.PlayerNameChange, []error) {
results := make([]func() ([]*models.PlayerNameChange, error), len(keys))
func (l *PlayerNameChangesLoader) LoadAll(keys []int) ([][]*twmodel.PlayerNameChange, []error) {
results := make([]func() ([]*twmodel.PlayerNameChange, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
playerNameChanges := make([][]*models.PlayerNameChange, len(keys))
playerNameChanges := make([][]*twmodel.PlayerNameChange, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
playerNameChanges[i], errors[i] = thunk()
@ -131,13 +130,13 @@ func (l *PlayerNameChangesLoader) LoadAll(keys []int) ([][]*models.PlayerNameCha
// LoadAllThunk returns a function that when called will block waiting for a PlayerNameChanges.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *PlayerNameChangesLoader) LoadAllThunk(keys []int) func() ([][]*models.PlayerNameChange, []error) {
results := make([]func() ([]*models.PlayerNameChange, error), len(keys))
func (l *PlayerNameChangesLoader) LoadAllThunk(keys []int) func() ([][]*twmodel.PlayerNameChange, []error) {
results := make([]func() ([]*twmodel.PlayerNameChange, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
return func() ([][]*models.PlayerNameChange, []error) {
playerNameChanges := make([][]*models.PlayerNameChange, len(keys))
return func() ([][]*twmodel.PlayerNameChange, []error) {
playerNameChanges := make([][]*twmodel.PlayerNameChange, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
playerNameChanges[i], errors[i] = thunk()
@ -149,13 +148,13 @@ func (l *PlayerNameChangesLoader) LoadAllThunk(keys []int) func() ([][]*models.P
// Prime the cache with the provided key and value. If the key already exists, no change is made
// and false is returned.
// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)
func (l *PlayerNameChangesLoader) Prime(key int, value []*models.PlayerNameChange) bool {
func (l *PlayerNameChangesLoader) Prime(key int, value []*twmodel.PlayerNameChange) bool {
l.mu.Lock()
var found bool
if _, found = l.cache[key]; !found {
// make a copy when writing to the cache, its easy to pass a pointer in from a loop var
// and end up with the whole cache pointing to the same value.
cpy := make([]*models.PlayerNameChange, len(value))
cpy := make([]*twmodel.PlayerNameChange, len(value))
copy(cpy, value)
l.unsafeSet(key, cpy)
}
@ -170,9 +169,9 @@ func (l *PlayerNameChangesLoader) Clear(key int) {
l.mu.Unlock()
}
func (l *PlayerNameChangesLoader) unsafeSet(key int, value []*models.PlayerNameChange) {
func (l *PlayerNameChangesLoader) unsafeSet(key int, value []*twmodel.PlayerNameChange) {
if l.cache == nil {
l.cache = map[int][]*models.PlayerNameChange{}
l.cache = map[int][]*twmodel.PlayerNameChange{}
}
l.cache[key] = value
}

View File

@ -2,10 +2,11 @@ package dataloaders
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/player"
"github.com/tribalwarshelp/api/tribe"
"github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/shared/models"
)
type ServerDataLoaders struct {
@ -19,9 +20,9 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
PlayerByID: &PlayerLoader{
wait: wait,
maxBatch: 0,
fetch: func(ids []int) ([]*models.Player, []error) {
fetch: func(ids []int) ([]*twmodel.Player, []error) {
players, _, err := cfg.PlayerRepo.Fetch(context.Background(), player.FetchConfig{
Filter: &models.PlayerFilter{
Filter: &twmodel.PlayerFilter{
ID: ids,
},
Select: true,
@ -31,12 +32,12 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
return nil, []error{err}
}
playerByID := make(map[int]*models.Player)
for _, player := range players {
playerByID[player.ID] = player
playerByID := make(map[int]*twmodel.Player)
for _, p := range players {
playerByID[p.ID] = p
}
inOrder := make([]*models.Player, len(ids))
inOrder := make([]*twmodel.Player, len(ids))
for i, id := range ids {
inOrder[i] = playerByID[id]
}
@ -47,10 +48,10 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
TribeByID: &TribeLoader{
wait: wait,
maxBatch: 0,
fetch: func(ids []int) ([]*models.Tribe, []error) {
fetch: func(ids []int) ([]*twmodel.Tribe, []error) {
tribes, _, err := cfg.TribeRepo.Fetch(context.Background(), tribe.FetchConfig{
Server: server,
Filter: &models.TribeFilter{
Filter: &twmodel.TribeFilter{
ID: ids,
},
Select: true,
@ -59,12 +60,12 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
return nil, []error{err}
}
tribeByID := make(map[int]*models.Tribe)
for _, tribe := range tribes {
tribeByID[tribe.ID] = tribe
tribeByID := make(map[int]*twmodel.Tribe)
for _, t := range tribes {
tribeByID[t.ID] = t
}
inOrder := make([]*models.Tribe, len(ids))
inOrder := make([]*twmodel.Tribe, len(ids))
for i, id := range ids {
inOrder[i] = tribeByID[id]
}
@ -75,11 +76,11 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
VillageByID: &VillageLoader{
wait: wait,
maxBatch: 0,
fetch: func(ids []int) ([]*models.Village, []error) {
fetch: func(ids []int) ([]*twmodel.Village, []error) {
villages, _, err := cfg.VillageRepo.Fetch(context.Background(), village.FetchConfig{
Server: server,
Count: false,
Filter: &models.VillageFilter{
Filter: &twmodel.VillageFilter{
ID: ids,
},
Select: true,
@ -88,12 +89,12 @@ func NewServerDataLoaders(server string, cfg Config) *ServerDataLoaders {
return nil, []error{err}
}
villageByID := make(map[int]*models.Village)
for _, village := range villages {
villageByID[village.ID] = village
villageByID := make(map[int]*twmodel.Village)
for _, v := range villages {
villageByID[v.ID] = v
}
inOrder := make([]*models.Village, len(ids))
inOrder := make([]*twmodel.Village, len(ids))
for i, id := range ids {
inOrder[i] = villageByID[id]
}

View File

@ -3,16 +3,15 @@
package dataloaders
import (
"github.com/tribalwarshelp/shared/tw/twmodel"
"sync"
"time"
"github.com/tribalwarshelp/shared/models"
)
// TribeLoaderConfig captures the config to create a new TribeLoader
type TribeLoaderConfig struct {
// Fetch is a method that provides the data for the loader
Fetch func(keys []int) ([]*models.Tribe, []error)
Fetch func(keys []int) ([]*twmodel.Tribe, []error)
// Wait is how long wait before sending a batch
Wait time.Duration
@ -33,7 +32,7 @@ func NewTribeLoader(config TribeLoaderConfig) *TribeLoader {
// TribeLoader batches and caches requests
type TribeLoader struct {
// this method provides the data for the loader
fetch func(keys []int) ([]*models.Tribe, []error)
fetch func(keys []int) ([]*twmodel.Tribe, []error)
// how long to done before sending a batch
wait time.Duration
@ -44,7 +43,7 @@ type TribeLoader struct {
// INTERNAL
// lazily created cache
cache map[int]*models.Tribe
cache map[int]*twmodel.Tribe
// the current batch. keys will continue to be collected until timeout is hit,
// then everything will be sent to the fetch method and out to the listeners
@ -56,25 +55,25 @@ type TribeLoader struct {
type tribeLoaderBatch struct {
keys []int
data []*models.Tribe
data []*twmodel.Tribe
error []error
closing bool
done chan struct{}
}
// Load a Tribe by key, batching and caching will be applied automatically
func (l *TribeLoader) Load(key int) (*models.Tribe, error) {
func (l *TribeLoader) Load(key int) (*twmodel.Tribe, error) {
return l.LoadThunk(key)()
}
// LoadThunk returns a function that when called will block waiting for a Tribe.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *TribeLoader) LoadThunk(key int) func() (*models.Tribe, error) {
func (l *TribeLoader) LoadThunk(key int) func() (*twmodel.Tribe, error) {
l.mu.Lock()
if it, ok := l.cache[key]; ok {
l.mu.Unlock()
return func() (*models.Tribe, error) {
return func() (*twmodel.Tribe, error) {
return it, nil
}
}
@ -85,10 +84,10 @@ func (l *TribeLoader) LoadThunk(key int) func() (*models.Tribe, error) {
pos := batch.keyIndex(l, key)
l.mu.Unlock()
return func() (*models.Tribe, error) {
return func() (*twmodel.Tribe, error) {
<-batch.done
var data *models.Tribe
var data *twmodel.Tribe
if pos < len(batch.data) {
data = batch.data[pos]
}
@ -113,14 +112,14 @@ func (l *TribeLoader) LoadThunk(key int) func() (*models.Tribe, error) {
// LoadAll fetches many keys at once. It will be broken into appropriate sized
// sub batches depending on how the loader is configured
func (l *TribeLoader) LoadAll(keys []int) ([]*models.Tribe, []error) {
results := make([]func() (*models.Tribe, error), len(keys))
func (l *TribeLoader) LoadAll(keys []int) ([]*twmodel.Tribe, []error) {
results := make([]func() (*twmodel.Tribe, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
tribes := make([]*models.Tribe, len(keys))
tribes := make([]*twmodel.Tribe, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
tribes[i], errors[i] = thunk()
@ -131,13 +130,13 @@ func (l *TribeLoader) LoadAll(keys []int) ([]*models.Tribe, []error) {
// LoadAllThunk returns a function that when called will block waiting for a Tribes.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *TribeLoader) LoadAllThunk(keys []int) func() ([]*models.Tribe, []error) {
results := make([]func() (*models.Tribe, error), len(keys))
func (l *TribeLoader) LoadAllThunk(keys []int) func() ([]*twmodel.Tribe, []error) {
results := make([]func() (*twmodel.Tribe, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
return func() ([]*models.Tribe, []error) {
tribes := make([]*models.Tribe, len(keys))
return func() ([]*twmodel.Tribe, []error) {
tribes := make([]*twmodel.Tribe, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
tribes[i], errors[i] = thunk()
@ -149,7 +148,7 @@ func (l *TribeLoader) LoadAllThunk(keys []int) func() ([]*models.Tribe, []error)
// Prime the cache with the provided key and value. If the key already exists, no change is made
// and false is returned.
// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)
func (l *TribeLoader) Prime(key int, value *models.Tribe) bool {
func (l *TribeLoader) Prime(key int, value *twmodel.Tribe) bool {
l.mu.Lock()
var found bool
if _, found = l.cache[key]; !found {
@ -169,9 +168,9 @@ func (l *TribeLoader) Clear(key int) {
l.mu.Unlock()
}
func (l *TribeLoader) unsafeSet(key int, value *models.Tribe) {
func (l *TribeLoader) unsafeSet(key int, value *twmodel.Tribe) {
if l.cache == nil {
l.cache = map[int]*models.Tribe{}
l.cache = map[int]*twmodel.Tribe{}
}
l.cache[key] = value
}

View File

@ -2,7 +2,7 @@ package dataloaders
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type VersionDataLoaders struct {
@ -10,7 +10,7 @@ type VersionDataLoaders struct {
PlayerNameChangesByID *PlayerNameChangesLoader
}
func NewVersionDataLoaders(versionCode models.VersionCode, cfg Config) *VersionDataLoaders {
func NewVersionDataLoaders(versionCode twmodel.VersionCode, cfg Config) *VersionDataLoaders {
return &VersionDataLoaders{
PlayerServersByID: &PlayerServersLoader{
wait: wait,
@ -30,12 +30,12 @@ func NewVersionDataLoaders(versionCode models.VersionCode, cfg Config) *VersionD
PlayerNameChangesByID: &PlayerNameChangesLoader{
wait: wait,
maxBatch: 0,
fetch: func(keys []int) ([][]*models.PlayerNameChange, []error) {
fetch: func(keys []int) ([][]*twmodel.PlayerNameChange, []error) {
playerNameChangesByID, err := cfg.PlayerRepo.FetchNameChanges(context.Background(), versionCode, keys...)
if err != nil {
return nil, []error{err}
}
inOrder := make([][]*models.PlayerNameChange, len(keys))
inOrder := make([][]*twmodel.PlayerNameChange, len(keys))
for i, id := range keys {
inOrder[i] = playerNameChangesByID[id]
}

View File

@ -3,16 +3,15 @@
package dataloaders
import (
"github.com/tribalwarshelp/shared/tw/twmodel"
"sync"
"time"
"github.com/tribalwarshelp/shared/models"
)
// VersionLoaderConfig captures the config to create a new VersionLoader
type VersionLoaderConfig struct {
// Fetch is a method that provides the data for the loader
Fetch func(keys []string) ([]*models.Version, []error)
Fetch func(keys []string) ([]*twmodel.Version, []error)
// Wait is how long wait before sending a batch
Wait time.Duration
@ -33,7 +32,7 @@ func NewVersionLoader(config VersionLoaderConfig) *VersionLoader {
// VersionLoader batches and caches requests
type VersionLoader struct {
// this method provides the data for the loader
fetch func(keys []string) ([]*models.Version, []error)
fetch func(keys []string) ([]*twmodel.Version, []error)
// how long to done before sending a batch
wait time.Duration
@ -44,7 +43,7 @@ type VersionLoader struct {
// INTERNAL
// lazily created cache
cache map[string]*models.Version
cache map[string]*twmodel.Version
// the current batch. keys will continue to be collected until timeout is hit,
// then everything will be sent to the fetch method and out to the listeners
@ -56,25 +55,25 @@ type VersionLoader struct {
type versionLoaderBatch struct {
keys []string
data []*models.Version
data []*twmodel.Version
error []error
closing bool
done chan struct{}
}
// Load a Version by key, batching and caching will be applied automatically
func (l *VersionLoader) Load(key string) (*models.Version, error) {
func (l *VersionLoader) Load(key string) (*twmodel.Version, error) {
return l.LoadThunk(key)()
}
// LoadThunk returns a function that when called will block waiting for a Version.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *VersionLoader) LoadThunk(key string) func() (*models.Version, error) {
func (l *VersionLoader) LoadThunk(key string) func() (*twmodel.Version, error) {
l.mu.Lock()
if it, ok := l.cache[key]; ok {
l.mu.Unlock()
return func() (*models.Version, error) {
return func() (*twmodel.Version, error) {
return it, nil
}
}
@ -85,10 +84,10 @@ func (l *VersionLoader) LoadThunk(key string) func() (*models.Version, error) {
pos := batch.keyIndex(l, key)
l.mu.Unlock()
return func() (*models.Version, error) {
return func() (*twmodel.Version, error) {
<-batch.done
var data *models.Version
var data *twmodel.Version
if pos < len(batch.data) {
data = batch.data[pos]
}
@ -113,14 +112,14 @@ func (l *VersionLoader) LoadThunk(key string) func() (*models.Version, error) {
// LoadAll fetches many keys at once. It will be broken into appropriate sized
// sub batches depending on how the loader is configured
func (l *VersionLoader) LoadAll(keys []string) ([]*models.Version, []error) {
results := make([]func() (*models.Version, error), len(keys))
func (l *VersionLoader) LoadAll(keys []string) ([]*twmodel.Version, []error) {
results := make([]func() (*twmodel.Version, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
versions := make([]*models.Version, len(keys))
versions := make([]*twmodel.Version, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
versions[i], errors[i] = thunk()
@ -131,13 +130,13 @@ func (l *VersionLoader) LoadAll(keys []string) ([]*models.Version, []error) {
// LoadAllThunk returns a function that when called will block waiting for a Versions.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *VersionLoader) LoadAllThunk(keys []string) func() ([]*models.Version, []error) {
results := make([]func() (*models.Version, error), len(keys))
func (l *VersionLoader) LoadAllThunk(keys []string) func() ([]*twmodel.Version, []error) {
results := make([]func() (*twmodel.Version, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
return func() ([]*models.Version, []error) {
versions := make([]*models.Version, len(keys))
return func() ([]*twmodel.Version, []error) {
versions := make([]*twmodel.Version, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
versions[i], errors[i] = thunk()
@ -149,7 +148,7 @@ func (l *VersionLoader) LoadAllThunk(keys []string) func() ([]*models.Version, [
// Prime the cache with the provided key and value. If the key already exists, no change is made
// and false is returned.
// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)
func (l *VersionLoader) Prime(key string, value *models.Version) bool {
func (l *VersionLoader) Prime(key string, value *twmodel.Version) bool {
l.mu.Lock()
var found bool
if _, found = l.cache[key]; !found {
@ -169,9 +168,9 @@ func (l *VersionLoader) Clear(key string) {
l.mu.Unlock()
}
func (l *VersionLoader) unsafeSet(key string, value *models.Version) {
func (l *VersionLoader) unsafeSet(key string, value *twmodel.Version) {
if l.cache == nil {
l.cache = map[string]*models.Version{}
l.cache = map[string]*twmodel.Version{}
}
l.cache[key] = value
}

View File

@ -3,16 +3,15 @@
package dataloaders
import (
"github.com/tribalwarshelp/shared/tw/twmodel"
"sync"
"time"
"github.com/tribalwarshelp/shared/models"
)
// VillageLoaderConfig captures the config to create a new VillageLoader
type VillageLoaderConfig struct {
// Fetch is a method that provides the data for the loader
Fetch func(keys []int) ([]*models.Village, []error)
Fetch func(keys []int) ([]*twmodel.Village, []error)
// Wait is how long wait before sending a batch
Wait time.Duration
@ -33,7 +32,7 @@ func NewVillageLoader(config VillageLoaderConfig) *VillageLoader {
// VillageLoader batches and caches requests
type VillageLoader struct {
// this method provides the data for the loader
fetch func(keys []int) ([]*models.Village, []error)
fetch func(keys []int) ([]*twmodel.Village, []error)
// how long to done before sending a batch
wait time.Duration
@ -44,7 +43,7 @@ type VillageLoader struct {
// INTERNAL
// lazily created cache
cache map[int]*models.Village
cache map[int]*twmodel.Village
// the current batch. keys will continue to be collected until timeout is hit,
// then everything will be sent to the fetch method and out to the listeners
@ -56,25 +55,25 @@ type VillageLoader struct {
type villageLoaderBatch struct {
keys []int
data []*models.Village
data []*twmodel.Village
error []error
closing bool
done chan struct{}
}
// Load a Village by key, batching and caching will be applied automatically
func (l *VillageLoader) Load(key int) (*models.Village, error) {
func (l *VillageLoader) Load(key int) (*twmodel.Village, error) {
return l.LoadThunk(key)()
}
// LoadThunk returns a function that when called will block waiting for a Village.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *VillageLoader) LoadThunk(key int) func() (*models.Village, error) {
func (l *VillageLoader) LoadThunk(key int) func() (*twmodel.Village, error) {
l.mu.Lock()
if it, ok := l.cache[key]; ok {
l.mu.Unlock()
return func() (*models.Village, error) {
return func() (*twmodel.Village, error) {
return it, nil
}
}
@ -85,10 +84,10 @@ func (l *VillageLoader) LoadThunk(key int) func() (*models.Village, error) {
pos := batch.keyIndex(l, key)
l.mu.Unlock()
return func() (*models.Village, error) {
return func() (*twmodel.Village, error) {
<-batch.done
var data *models.Village
var data *twmodel.Village
if pos < len(batch.data) {
data = batch.data[pos]
}
@ -113,14 +112,14 @@ func (l *VillageLoader) LoadThunk(key int) func() (*models.Village, error) {
// LoadAll fetches many keys at once. It will be broken into appropriate sized
// sub batches depending on how the loader is configured
func (l *VillageLoader) LoadAll(keys []int) ([]*models.Village, []error) {
results := make([]func() (*models.Village, error), len(keys))
func (l *VillageLoader) LoadAll(keys []int) ([]*twmodel.Village, []error) {
results := make([]func() (*twmodel.Village, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
villages := make([]*models.Village, len(keys))
villages := make([]*twmodel.Village, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
villages[i], errors[i] = thunk()
@ -131,13 +130,13 @@ func (l *VillageLoader) LoadAll(keys []int) ([]*models.Village, []error) {
// LoadAllThunk returns a function that when called will block waiting for a Villages.
// This method should be used if you want one goroutine to make requests to many
// different data loaders without blocking until the thunk is called.
func (l *VillageLoader) LoadAllThunk(keys []int) func() ([]*models.Village, []error) {
results := make([]func() (*models.Village, error), len(keys))
func (l *VillageLoader) LoadAllThunk(keys []int) func() ([]*twmodel.Village, []error) {
results := make([]func() (*twmodel.Village, error), len(keys))
for i, key := range keys {
results[i] = l.LoadThunk(key)
}
return func() ([]*models.Village, []error) {
villages := make([]*models.Village, len(keys))
return func() ([]*twmodel.Village, []error) {
villages := make([]*twmodel.Village, len(keys))
errors := make([]error, len(keys))
for i, thunk := range results {
villages[i], errors[i] = thunk()
@ -149,7 +148,7 @@ func (l *VillageLoader) LoadAllThunk(keys []int) func() ([]*models.Village, []er
// Prime the cache with the provided key and value. If the key already exists, no change is made
// and false is returned.
// (To forcefully prime the cache, clear the key first with loader.clear(key).prime(key, value).)
func (l *VillageLoader) Prime(key int, value *models.Village) bool {
func (l *VillageLoader) Prime(key int, value *twmodel.Village) bool {
l.mu.Lock()
var found bool
if _, found = l.cache[key]; !found {
@ -169,9 +168,9 @@ func (l *VillageLoader) Clear(key int) {
l.mu.Unlock()
}
func (l *VillageLoader) unsafeSet(key int, value *models.Village) {
func (l *VillageLoader) unsafeSet(key int, value *twmodel.Village) {
if l.cache == nil {
l.cache = map[int]*models.Village{}
l.cache = map[int]*twmodel.Village{}
}
l.cache[key] = value
}

File diff suppressed because it is too large Load Diff

View File

@ -3,75 +3,75 @@
package generated
import (
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type DailyPlayerStats struct {
Total int `json:"total"`
Items []*models.DailyPlayerStats `json:"items"`
Total int `json:"total"`
Items []*twmodel.DailyPlayerStats `json:"items"`
}
type DailyTribeStats struct {
Total int `json:"total"`
Items []*models.DailyTribeStats `json:"items"`
Total int `json:"total"`
Items []*twmodel.DailyTribeStats `json:"items"`
}
type EnnoblementList struct {
Items []*models.Ennoblement `json:"items"`
Total int `json:"total"`
Items []*twmodel.Ennoblement `json:"items"`
Total int `json:"total"`
}
type FoundPlayerList struct {
Items []*models.FoundPlayer `json:"items"`
Total int `json:"total"`
Items []*twmodel.FoundPlayer `json:"items"`
Total int `json:"total"`
}
type FoundTribeList struct {
Items []*models.FoundTribe `json:"items"`
Total int `json:"total"`
Items []*twmodel.FoundTribe `json:"items"`
Total int `json:"total"`
}
type PlayerHistory struct {
Total int `json:"total"`
Items []*models.PlayerHistory `json:"items"`
Total int `json:"total"`
Items []*twmodel.PlayerHistory `json:"items"`
}
type PlayerList struct {
Items []*models.Player `json:"items"`
Total int `json:"total"`
Items []*twmodel.Player `json:"items"`
Total int `json:"total"`
}
type ServerList struct {
Items []*models.Server `json:"items"`
Total int `json:"total"`
Items []*twmodel.Server `json:"items"`
Total int `json:"total"`
}
type ServerStats struct {
Items []*models.ServerStats `json:"items"`
Total int `json:"total"`
Items []*twmodel.ServerStats `json:"items"`
Total int `json:"total"`
}
type TribeChanges struct {
Total int `json:"total"`
Items []*models.TribeChange `json:"items"`
Total int `json:"total"`
Items []*twmodel.TribeChange `json:"items"`
}
type TribeHistory struct {
Total int `json:"total"`
Items []*models.TribeHistory `json:"items"`
Total int `json:"total"`
Items []*twmodel.TribeHistory `json:"items"`
}
type TribeList struct {
Items []*models.Tribe `json:"items"`
Total int `json:"total"`
Items []*twmodel.Tribe `json:"items"`
Total int `json:"total"`
}
type VersionList struct {
Items []*models.Version `json:"items"`
Total int `json:"total"`
Items []*twmodel.Version `json:"items"`
Total int `json:"total"`
}
type VillageList struct {
Items []*models.Village `json:"items"`
Total int `json:"total"`
Items []*twmodel.Village `json:"items"`
Total int `json:"total"`
}

View File

@ -4,7 +4,7 @@ exec:
filename: generated/generated.go
package: generated
model:
filename: generated/models.go
filename: generated/twmodel.go
package: generated
resolver:
filename: resolvers/resolver.go
@ -16,104 +16,104 @@ directives:
skip_runtime: true
models:
VersionCode:
model: github.com/tribalwarshelp/shared/models.VersionCode
model: github.com/tribalwarshelp/shared/twmodel.VersionCode
ServerStatus:
model: github.com/tribalwarshelp/shared/models.ServerStatus
model: github.com/tribalwarshelp/shared/twmodel.ServerStatus
Version:
model: github.com/tribalwarshelp/shared/models.Version
model: github.com/tribalwarshelp/shared/twmodel.Version
VersionFilter:
model: github.com/tribalwarshelp/shared/models.VersionFilter
model: github.com/tribalwarshelp/shared/twmodel.VersionFilter
Server:
model: github.com/tribalwarshelp/shared/models.Server
model: github.com/tribalwarshelp/shared/twmodel.Server
ServerConfig:
model: github.com/tribalwarshelp/shared/models.ServerConfig
model: github.com/tribalwarshelp/shared/twmodel.ServerConfig
ServerConfigBuild:
model: github.com/tribalwarshelp/shared/models.ServerConfigBuild
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigBuild
ServerConfigMisc:
model: github.com/tribalwarshelp/shared/models.ServerConfigMisc
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigMisc
ServerConfigCommands:
model: github.com/tribalwarshelp/shared/models.ServerConfigCommands
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigCommands
ServerConfigNewbie:
model: github.com/tribalwarshelp/shared/models.ServerConfigNewbie
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigNewbie
ServerConfigGame:
model: github.com/tribalwarshelp/shared/models.ServerConfigGame
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigGame
ServerConfigBuildings:
model: github.com/tribalwarshelp/shared/models.ServerConfigBuildings
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigBuildings
ServerConfigSnob:
model: github.com/tribalwarshelp/shared/models.ServerConfigSnob
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigSnob
ServerConfigAlly:
model: github.com/tribalwarshelp/shared/models.ServerConfigAlly
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigAlly
ServerConfigCoord:
model: github.com/tribalwarshelp/shared/models.ServerConfigCoord
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigCoord
ServerConfigSitter:
model: github.com/tribalwarshelp/shared/models.ServerConfigSitter
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigSitter
ServerConfigSleep:
model: github.com/tribalwarshelp/shared/models.ServerConfigSleep
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigSleep
ServerConfigNight:
model: github.com/tribalwarshelp/shared/models.ServerConfigNight
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigNight
ServerConfigWin:
model: github.com/tribalwarshelp/shared/models.ServerConfigWin
model: github.com/tribalwarshelp/shared/twmodel.ServerConfigWin
Unit:
model: github.com/tribalwarshelp/shared/models.Unit
model: github.com/tribalwarshelp/shared/twmodel.Unit
UnitConfig:
model: github.com/tribalwarshelp/shared/models.UnitConfig
model: github.com/tribalwarshelp/shared/twmodel.UnitConfig
Building:
model: github.com/tribalwarshelp/shared/models.Building
model: github.com/tribalwarshelp/shared/twmodel.Building
BuildingConfig:
model: github.com/tribalwarshelp/shared/models.BuildingConfig
model: github.com/tribalwarshelp/shared/twmodel.BuildingConfig
ServerFilter:
model: github.com/tribalwarshelp/shared/models.ServerFilter
model: github.com/tribalwarshelp/shared/twmodel.ServerFilter
Player:
model: github.com/tribalwarshelp/shared/models.Player
model: github.com/tribalwarshelp/shared/twmodel.Player
PlayerFilter:
model: github.com/tribalwarshelp/shared/models.PlayerFilter
model: github.com/tribalwarshelp/shared/twmodel.PlayerFilter
FoundPlayer:
model: github.com/tribalwarshelp/shared/models.FoundPlayer
model: github.com/tribalwarshelp/shared/twmodel.FoundPlayer
Tribe:
model: github.com/tribalwarshelp/shared/models.Tribe
model: github.com/tribalwarshelp/shared/twmodel.Tribe
TribeFilter:
model: github.com/tribalwarshelp/shared/models.TribeFilter
model: github.com/tribalwarshelp/shared/twmodel.TribeFilter
TribeFilterOr:
model: github.com/tribalwarshelp/shared/models.TribeFilterOr
model: github.com/tribalwarshelp/shared/twmodel.TribeFilterOr
FoundTribe:
model: github.com/tribalwarshelp/shared/models.FoundTribe
model: github.com/tribalwarshelp/shared/twmodel.FoundTribe
Village:
model: github.com/tribalwarshelp/shared/models.Village
model: github.com/tribalwarshelp/shared/twmodel.Village
VillageFilter:
model: github.com/tribalwarshelp/shared/models.VillageFilter
model: github.com/tribalwarshelp/shared/twmodel.VillageFilter
LiveEnnoblement:
model: github.com/tribalwarshelp/shared/models.LiveEnnoblement
model: github.com/tribalwarshelp/shared/twmodel.LiveEnnoblement
Ennoblement:
model: github.com/tribalwarshelp/shared/models.Ennoblement
model: github.com/tribalwarshelp/shared/twmodel.Ennoblement
EnnoblementFilter:
model: github.com/tribalwarshelp/shared/models.EnnoblementFilter
model: github.com/tribalwarshelp/shared/twmodel.EnnoblementFilter
EnnoblementFilterOr:
model: github.com/tribalwarshelp/shared/models.EnnoblementFilterOr
model: github.com/tribalwarshelp/shared/twmodel.EnnoblementFilterOr
PlayerHistoryRecord:
model: github.com/tribalwarshelp/shared/models.PlayerHistory
model: github.com/tribalwarshelp/shared/twmodel.PlayerHistory
PlayerHistoryFilter:
model: github.com/tribalwarshelp/shared/models.PlayerHistoryFilter
model: github.com/tribalwarshelp/shared/twmodel.PlayerHistoryFilter
TribeHistoryRecord:
model: github.com/tribalwarshelp/shared/models.TribeHistory
model: github.com/tribalwarshelp/shared/twmodel.TribeHistory
TribeHistoryFilter:
model: github.com/tribalwarshelp/shared/models.TribeHistoryFilter
model: github.com/tribalwarshelp/shared/twmodel.TribeHistoryFilter
ServerStatsRecord:
model: github.com/tribalwarshelp/shared/models.ServerStats
model: github.com/tribalwarshelp/shared/twmodel.ServerStats
ServerStatsFilter:
model: github.com/tribalwarshelp/shared/models.ServerStatsFilter
model: github.com/tribalwarshelp/shared/twmodel.ServerStatsFilter
TribeChangeRecord:
model: github.com/tribalwarshelp/shared/models.TribeChange
model: github.com/tribalwarshelp/shared/twmodel.TribeChange
TribeChangeFilter:
model: github.com/tribalwarshelp/shared/models.TribeChangeFilter
model: github.com/tribalwarshelp/shared/twmodel.TribeChangeFilter
TribeChangeFilterOr:
model: github.com/tribalwarshelp/shared/models.TribeChangeFilterOr
model: github.com/tribalwarshelp/shared/twmodel.TribeChangeFilterOr
DailyPlayerStatsRecord:
model: github.com/tribalwarshelp/shared/models.DailyPlayerStats
model: github.com/tribalwarshelp/shared/twmodel.DailyPlayerStats
DailyPlayerStatsFilter:
model: github.com/tribalwarshelp/shared/models.DailyPlayerStatsFilter
model: github.com/tribalwarshelp/shared/twmodel.DailyPlayerStatsFilter
DailyTribeStatsRecord:
model: github.com/tribalwarshelp/shared/models.DailyTribeStats
model: github.com/tribalwarshelp/shared/twmodel.DailyTribeStats
DailyTribeStatsFilter:
model: github.com/tribalwarshelp/shared/models.DailyTribeStatsFilter
model: github.com/tribalwarshelp/shared/twmodel.DailyTribeStatsFilter
PlayerNameChange:
model: github.com/tribalwarshelp/shared/models.PlayerNameChange
model: github.com/tribalwarshelp/shared/twmodel.PlayerNameChange

View File

@ -1,6 +1,9 @@
package querycomplexity
import (
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/dailyplayerstats"
"github.com/tribalwarshelp/api/dailytribestats"
"github.com/tribalwarshelp/api/ennoblement"
@ -12,10 +15,8 @@ import (
"github.com/tribalwarshelp/api/tribe"
"github.com/tribalwarshelp/api/tribechange"
"github.com/tribalwarshelp/api/tribehistory"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/api/version"
"github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/shared/models"
)
const (
@ -43,14 +44,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.DailyPlayerStats = func(
childComplexity int,
server string,
filter *models.DailyPlayerStatsFilter,
filter *twmodel.DailyPlayerStatsFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, dailyplayerstats.FetchLimit),
safeptr.SafeIntPointer(limit, dailyplayerstats.FetchLimit),
dailyPlayerStatsTotalFieldComplexity,
1,
)
@ -60,14 +61,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.DailyTribeStats = func(
childComplexity int,
server string,
filter *models.DailyTribeStatsFilter,
filter *twmodel.DailyTribeStatsFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, dailytribestats.FetchLimit),
safeptr.SafeIntPointer(limit, dailytribestats.FetchLimit),
dailyTribeStatsTotalFieldComplexity,
1,
)
@ -77,14 +78,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.Ennoblements = func(
childComplexity int,
server string,
filter *models.EnnoblementFilter,
filter *twmodel.EnnoblementFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, ennoblement.FetchLimit),
safeptr.SafeIntPointer(limit, ennoblement.FetchLimit),
ennoblementsTotalFieldComplexity,
1,
)
@ -94,14 +95,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.PlayerHistory = func(
childComplexity int,
server string,
filter *models.PlayerHistoryFilter,
filter *twmodel.PlayerHistoryFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, playerhistory.FetchLimit),
safeptr.SafeIntPointer(limit, playerhistory.FetchLimit),
playerHistoryTotalFieldComplexity,
1,
)
@ -111,14 +112,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.TribeHistory = func(
childComplexity int,
server string,
filter *models.TribeHistoryFilter,
filter *twmodel.TribeHistoryFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, tribehistory.FetchLimit),
safeptr.SafeIntPointer(limit, tribehistory.FetchLimit),
tribeHistoryTotalFieldComplexity,
1,
)
@ -128,14 +129,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.TribeChanges = func(
childComplexity int,
server string,
filter *models.TribeChangeFilter,
filter *twmodel.TribeChangeFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, tribechange.FetchLimit),
safeptr.SafeIntPointer(limit, tribechange.FetchLimit),
tribeChangesTotalFieldComplexity,
1,
)
@ -153,7 +154,7 @@ func GetComplexityRoot() generated.ComplexityRoot {
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, player.FetchLimit),
safeptr.SafeIntPointer(limit, player.FetchLimit),
searchPlayerTotalFieldComplexity,
3,
)
@ -170,7 +171,7 @@ func GetComplexityRoot() generated.ComplexityRoot {
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, tribe.FetchLimit),
safeptr.SafeIntPointer(limit, tribe.FetchLimit),
searchTribeTotalFieldComplexity,
3,
)
@ -186,14 +187,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.Players = func(
childComplexity int,
server string,
filter *models.PlayerFilter,
filter *twmodel.PlayerFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, player.FetchLimit),
safeptr.SafeIntPointer(limit, player.FetchLimit),
playersTotalFieldComplexity,
1,
)
@ -203,14 +204,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.Tribes = func(
childComplexity int,
server string,
filter *models.TribeFilter,
filter *twmodel.TribeFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, tribe.FetchLimit),
safeptr.SafeIntPointer(limit, tribe.FetchLimit),
tribesTotalFieldComplexity,
1,
)
@ -220,14 +221,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.Villages = func(
childComplexity int,
server string,
filter *models.VillageFilter,
filter *twmodel.VillageFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, village.FetchLimit),
safeptr.SafeIntPointer(limit, village.FetchLimit),
villagesTotalFieldComplexity,
1,
)
@ -237,14 +238,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.Query.ServerStats = func(
childComplexity int,
server string,
filter *models.ServerStatsFilter,
filter *twmodel.ServerStatsFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, serverstats.FetchLimit),
safeptr.SafeIntPointer(limit, serverstats.FetchLimit),
serverStatsTotalFieldComplexity,
1,
)
@ -253,14 +254,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.ServerList.Total = getCountComplexity
complexityRoot.Query.Servers = func(
childComplexity int,
filter *models.ServerFilter,
filter *twmodel.ServerFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, server.FetchLimit),
safeptr.SafeIntPointer(limit, server.FetchLimit),
serversTotalFieldComplexity,
1,
)
@ -269,14 +270,14 @@ func GetComplexityRoot() generated.ComplexityRoot {
complexityRoot.VersionList.Total = getCountComplexity
complexityRoot.Query.Versions = func(
childComplexity int,
filter *models.VersionFilter,
filter *twmodel.VersionFilter,
limit *int,
offset *int,
sort []string,
) int {
return computeComplexity(
childComplexity,
utils.SafeIntPointer(limit, version.FetchLimit),
safeptr.SafeIntPointer(limit, version.FetchLimit),
versionsTotalFieldComplexity,
1,
)

View File

@ -2,14 +2,14 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/dailyplayerstats"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/shared/models"
)
func (r *dailyPlayerStatsRecordResolver) Player(ctx context.Context, obj *models.DailyPlayerStats) (*models.Player, error) {
func (r *dailyPlayerStatsRecordResolver) Player(ctx context.Context, obj *twmodel.DailyPlayerStats) (*twmodel.Player, error) {
if obj.Player != nil {
return obj.Player, nil
}
@ -19,7 +19,7 @@ func (r *dailyPlayerStatsRecordResolver) Player(ctx context.Context, obj *models
func (r *queryResolver) DailyPlayerStats(ctx context.Context,
server string,
filter *models.DailyPlayerStatsFilter,
filter *twmodel.DailyPlayerStatsFilter,
limit *int,
offset *int,
sort []string) (*generated.DailyPlayerStats, error) {
@ -29,8 +29,8 @@ func (r *queryResolver) DailyPlayerStats(ctx context.Context,
Server: server,
Filter: filter,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Select: shouldSelectItems(ctx),
Count: shouldCount(ctx),
})

View File

@ -2,14 +2,14 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/dailytribestats"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/shared/models"
)
func (r *dailyTribeStatsRecordResolver) Tribe(ctx context.Context, obj *models.DailyTribeStats) (*models.Tribe, error) {
func (r *dailyTribeStatsRecordResolver) Tribe(ctx context.Context, obj *twmodel.DailyTribeStats) (*twmodel.Tribe, error) {
if obj.Tribe != nil {
return obj.Tribe, nil
}
@ -19,7 +19,7 @@ func (r *dailyTribeStatsRecordResolver) Tribe(ctx context.Context, obj *models.D
func (r *queryResolver) DailyTribeStats(ctx context.Context,
server string,
filter *models.DailyTribeStatsFilter,
filter *twmodel.DailyTribeStatsFilter,
limit *int,
offset *int,
sort []string) (*generated.DailyTribeStats, error) {
@ -29,8 +29,8 @@ func (r *queryResolver) DailyTribeStats(ctx context.Context,
Server: server,
Filter: filter,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Select: shouldSelectItems(ctx),
Count: shouldCount(ctx),
})

View File

@ -2,14 +2,14 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/ennoblement"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/shared/models"
)
func (r *ennoblementResolver) NewOwner(ctx context.Context, obj *models.Ennoblement) (*models.Player, error) {
func (r *ennoblementResolver) NewOwner(ctx context.Context, obj *twmodel.Ennoblement) (*twmodel.Player, error) {
if obj.NewOwner != nil {
return obj.NewOwner, nil
}
@ -17,7 +17,7 @@ func (r *ennoblementResolver) NewOwner(ctx context.Context, obj *models.Ennoblem
return getPlayer(ctx, obj.NewOwnerID), nil
}
func (r *ennoblementResolver) NewOwnerTribe(ctx context.Context, obj *models.Ennoblement) (*models.Tribe, error) {
func (r *ennoblementResolver) NewOwnerTribe(ctx context.Context, obj *twmodel.Ennoblement) (*twmodel.Tribe, error) {
if obj.NewOwnerTribe != nil {
return obj.NewOwnerTribe, nil
}
@ -25,7 +25,7 @@ func (r *ennoblementResolver) NewOwnerTribe(ctx context.Context, obj *models.Enn
return getTribe(ctx, obj.NewOwnerTribeID), nil
}
func (r *ennoblementResolver) OldOwner(ctx context.Context, obj *models.Ennoblement) (*models.Player, error) {
func (r *ennoblementResolver) OldOwner(ctx context.Context, obj *twmodel.Ennoblement) (*twmodel.Player, error) {
if obj.OldOwner != nil {
return obj.OldOwner, nil
}
@ -33,7 +33,7 @@ func (r *ennoblementResolver) OldOwner(ctx context.Context, obj *models.Ennoblem
return getPlayer(ctx, obj.OldOwnerID), nil
}
func (r *ennoblementResolver) OldOwnerTribe(ctx context.Context, obj *models.Ennoblement) (*models.Tribe, error) {
func (r *ennoblementResolver) OldOwnerTribe(ctx context.Context, obj *twmodel.Ennoblement) (*twmodel.Tribe, error) {
if obj.OldOwnerTribe != nil {
return obj.OldOwnerTribe, nil
}
@ -41,7 +41,7 @@ func (r *ennoblementResolver) OldOwnerTribe(ctx context.Context, obj *models.Enn
return getTribe(ctx, obj.OldOwnerTribeID), nil
}
func (r *ennoblementResolver) Village(ctx context.Context, obj *models.Ennoblement) (*models.Village, error) {
func (r *ennoblementResolver) Village(ctx context.Context, obj *twmodel.Ennoblement) (*twmodel.Village, error) {
if obj.Village != nil {
return obj.Village, nil
}
@ -50,7 +50,7 @@ func (r *ennoblementResolver) Village(ctx context.Context, obj *models.Ennobleme
}
func (r *queryResolver) Ennoblements(ctx context.Context, server string,
f *models.EnnoblementFilter,
f *twmodel.EnnoblementFilter,
limit *int,
offset *int,
sort []string) (*generated.EnnoblementList, error) {
@ -60,8 +60,8 @@ func (r *queryResolver) Ennoblements(ctx context.Context, server string,
Server: server,
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Count: shouldCount(ctx),
Select: shouldSelectItems(ctx),
})

View File

@ -2,10 +2,11 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/99designs/gqlgen/graphql"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/shared/models"
)
func getServer(ctx context.Context) (string, bool) {
@ -22,7 +23,7 @@ func getServer(ctx context.Context) (string, bool) {
return server, ok
}
func getPlayer(ctx context.Context, id int) *models.Player {
func getPlayer(ctx context.Context, id int) *twmodel.Player {
if server, ok := getServer(ctx); ok {
dataloaders := middleware.ServerDataLoadersFromContext(ctx)
if dataloaders != nil {
@ -37,7 +38,7 @@ func getPlayer(ctx context.Context, id int) *models.Player {
return nil
}
func getVillage(ctx context.Context, id int) *models.Village {
func getVillage(ctx context.Context, id int) *twmodel.Village {
if server, ok := getServer(ctx); ok {
dataloaders := middleware.ServerDataLoadersFromContext(ctx)
if dataloaders != nil {
@ -52,7 +53,7 @@ func getVillage(ctx context.Context, id int) *models.Village {
return nil
}
func getTribe(ctx context.Context, id int) *models.Tribe {
func getTribe(ctx context.Context, id int) *twmodel.Tribe {
if server, ok := getServer(ctx); ok {
dataloaders := middleware.ServerDataLoadersFromContext(ctx)
if dataloaders != nil {

View File

@ -2,16 +2,15 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/player"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw"
)
func (r *playerResolver) Tribe(ctx context.Context, obj *models.Player) (*models.Tribe, error) {
func (r *playerResolver) Tribe(ctx context.Context, obj *twmodel.Player) (*twmodel.Tribe, error) {
if obj.Tribe != nil {
return obj.Tribe, nil
}
@ -19,11 +18,11 @@ func (r *playerResolver) Tribe(ctx context.Context, obj *models.Player) (*models
return getTribe(ctx, obj.TribeID), nil
}
func (r *playerResolver) Servers(ctx context.Context, obj *models.Player) ([]string, error) {
func (r *playerResolver) Servers(ctx context.Context, obj *twmodel.Player) ([]string, error) {
versionDataLoaders := middleware.VersionDataLoadersFromContext(ctx)
if versionDataLoaders != nil {
serverKey, _ := getServer(ctx)
if loaders, ok := versionDataLoaders[tw.VersionCodeFromServerKey(serverKey)]; ok {
if loaders, ok := versionDataLoaders[twmodel.VersionCodeFromServerKey(serverKey)]; ok {
servers, err := loaders.PlayerServersByID.Load(obj.ID)
if err == nil {
return servers, nil
@ -33,23 +32,23 @@ func (r *playerResolver) Servers(ctx context.Context, obj *models.Player) ([]str
return []string{}, nil
}
func (r *playerResolver) NameChanges(ctx context.Context, obj *models.Player) ([]*models.PlayerNameChange, error) {
func (r *playerResolver) NameChanges(ctx context.Context, obj *twmodel.Player) ([]*twmodel.PlayerNameChange, error) {
versionDataLoaders := middleware.VersionDataLoadersFromContext(ctx)
if versionDataLoaders != nil {
serverKey, _ := getServer(ctx)
if loaders, ok := versionDataLoaders[tw.VersionCodeFromServerKey(serverKey)]; ok {
if loaders, ok := versionDataLoaders[twmodel.VersionCodeFromServerKey(serverKey)]; ok {
servers, err := loaders.PlayerNameChangesByID.Load(obj.ID)
if err == nil {
return servers, nil
}
}
}
return []*models.PlayerNameChange{}, nil
return []*twmodel.PlayerNameChange{}, nil
}
func (r *queryResolver) Players(ctx context.Context,
server string,
f *models.PlayerFilter,
f *twmodel.PlayerFilter,
limit *int,
offset *int,
sort []string) (*generated.PlayerList, error) {
@ -59,15 +58,15 @@ func (r *queryResolver) Players(ctx context.Context,
Server: server,
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Count: shouldCount(ctx),
Select: shouldSelectItems(ctx),
})
return list, err
}
func (r *queryResolver) Player(ctx context.Context, server string, id int) (*models.Player, error) {
func (r *queryResolver) Player(ctx context.Context, server string, id int) (*twmodel.Player, error) {
return r.PlayerUcase.GetByID(ctx, server, id)
}
@ -82,11 +81,11 @@ func (r *queryResolver) SearchPlayer(ctx context.Context,
list := &generated.FoundPlayerList{}
list.Items, list.Total, err = r.PlayerUcase.SearchPlayer(ctx, player.SearchPlayerConfig{
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Version: version,
Name: utils.SafeStrPointer(name, ""),
ID: utils.SafeIntPointer(id, 0),
Name: safeptr.SafeStringPointer(name, ""),
ID: safeptr.SafeIntPointer(id, 0),
Count: shouldCount(ctx),
})
return list, err

View File

@ -2,14 +2,14 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/playerhistory"
"github.com/tribalwarshelp/shared/models"
)
func (r *playerHistoryRecordResolver) Player(ctx context.Context, obj *models.PlayerHistory) (*models.Player, error) {
func (r *playerHistoryRecordResolver) Player(ctx context.Context, obj *twmodel.PlayerHistory) (*twmodel.Player, error) {
if obj.Player != nil {
return obj.Player, nil
}
@ -17,7 +17,7 @@ func (r *playerHistoryRecordResolver) Player(ctx context.Context, obj *models.Pl
return getPlayer(ctx, obj.PlayerID), nil
}
func (r *playerHistoryRecordResolver) Tribe(ctx context.Context, obj *models.PlayerHistory) (*models.Tribe, error) {
func (r *playerHistoryRecordResolver) Tribe(ctx context.Context, obj *twmodel.PlayerHistory) (*twmodel.Tribe, error) {
if obj.Tribe != nil {
return obj.Tribe, nil
}
@ -27,7 +27,7 @@ func (r *playerHistoryRecordResolver) Tribe(ctx context.Context, obj *models.Pla
func (r *Resolver) PlayerHistory(ctx context.Context,
server string,
f *models.PlayerHistoryFilter,
f *twmodel.PlayerHistoryFilter,
limit *int,
offset *int,
sort []string) (*generated.PlayerHistory, error) {
@ -37,8 +37,8 @@ func (r *Resolver) PlayerHistory(ctx context.Context,
Server: server,
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Count: shouldCount(ctx),
Select: shouldSelectItems(ctx),
})

View File

@ -2,16 +2,16 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/server"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/shared/models"
)
func (r *serverResolver) Version(ctx context.Context, obj *models.Server) (*models.Version, error) {
func (r *serverResolver) Version(ctx context.Context, obj *twmodel.Server) (*twmodel.Version, error) {
loaders := middleware.DataLoadersFromContext(ctx)
if loaders != nil {
lv, _ := loaders.VersionByCode.Load(obj.VersionCode.String())
@ -21,7 +21,7 @@ func (r *serverResolver) Version(ctx context.Context, obj *models.Server) (*mode
}
func (r *queryResolver) Servers(ctx context.Context,
f *models.ServerFilter,
f *twmodel.ServerFilter,
limit *int,
offset *int,
sort []string) (*generated.ServerList, error) {
@ -30,14 +30,14 @@ func (r *queryResolver) Servers(ctx context.Context,
list.Items, list.Total, err = r.ServerUcase.Fetch(ctx, server.FetchConfig{
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Count: shouldCount(ctx),
Select: shouldSelectItems(ctx),
})
return list, err
}
func (r *queryResolver) Server(ctx context.Context, key string) (*models.Server, error) {
func (r *queryResolver) Server(ctx context.Context, key string) (*twmodel.Server, error) {
return r.ServerUcase.GetByKey(ctx, key)
}

View File

@ -2,16 +2,16 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/serverstats"
"github.com/tribalwarshelp/shared/models"
)
func (r *Resolver) ServerStats(ctx context.Context,
server string,
f *models.ServerStatsFilter,
f *twmodel.ServerStatsFilter,
limit *int,
offset *int,
sort []string) (*generated.ServerStats, error) {
@ -21,8 +21,8 @@ func (r *Resolver) ServerStats(ctx context.Context,
Server: server,
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Count: shouldCount(ctx),
Select: shouldSelectItems(ctx),
})

View File

@ -2,16 +2,16 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/tribe"
"github.com/tribalwarshelp/shared/models"
)
func (r *queryResolver) Tribes(ctx context.Context,
server string,
f *models.TribeFilter,
f *twmodel.TribeFilter,
limit *int,
offset *int,
sort []string) (*generated.TribeList, error) {
@ -21,15 +21,15 @@ func (r *queryResolver) Tribes(ctx context.Context,
Server: server,
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Count: shouldCount(ctx),
Select: shouldSelectItems(ctx),
})
return list, err
}
func (r *queryResolver) Tribe(ctx context.Context, server string, id int) (*models.Tribe, error) {
func (r *queryResolver) Tribe(ctx context.Context, server string, id int) (*twmodel.Tribe, error) {
return r.TribeUcase.GetByID(ctx, server, id)
}
@ -43,8 +43,8 @@ func (r *queryResolver) SearchTribe(ctx context.Context,
list := &generated.FoundTribeList{}
list.Items, list.Total, err = r.TribeUcase.SearchTribe(ctx, tribe.SearchTribeConfig{
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Version: version,
Query: query,
Count: shouldCount(ctx),

View File

@ -2,14 +2,14 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/tribechange"
"github.com/tribalwarshelp/shared/models"
)
func (r *tribeChangeRecordResolver) Player(ctx context.Context, obj *models.TribeChange) (*models.Player, error) {
func (r *tribeChangeRecordResolver) Player(ctx context.Context, obj *twmodel.TribeChange) (*twmodel.Player, error) {
if obj.Player != nil {
return obj.Player, nil
}
@ -17,7 +17,7 @@ func (r *tribeChangeRecordResolver) Player(ctx context.Context, obj *models.Trib
return getPlayer(ctx, obj.PlayerID), nil
}
func (r *tribeChangeRecordResolver) NewTribe(ctx context.Context, obj *models.TribeChange) (*models.Tribe, error) {
func (r *tribeChangeRecordResolver) NewTribe(ctx context.Context, obj *twmodel.TribeChange) (*twmodel.Tribe, error) {
if obj.NewTribe != nil {
return obj.NewTribe, nil
}
@ -25,7 +25,7 @@ func (r *tribeChangeRecordResolver) NewTribe(ctx context.Context, obj *models.Tr
return getTribe(ctx, obj.NewTribeID), nil
}
func (r *tribeChangeRecordResolver) OldTribe(ctx context.Context, obj *models.TribeChange) (*models.Tribe, error) {
func (r *tribeChangeRecordResolver) OldTribe(ctx context.Context, obj *twmodel.TribeChange) (*twmodel.Tribe, error) {
if obj.OldTribe != nil {
return obj.OldTribe, nil
}
@ -35,7 +35,7 @@ func (r *tribeChangeRecordResolver) OldTribe(ctx context.Context, obj *models.Tr
func (r *Resolver) TribeChanges(ctx context.Context,
server string,
f *models.TribeChangeFilter,
f *twmodel.TribeChangeFilter,
limit *int,
offset *int,
sort []string) (*generated.TribeChanges, error) {
@ -44,8 +44,8 @@ func (r *Resolver) TribeChanges(ctx context.Context,
list.Items, list.Total, err = r.TribeChangeUcase.Fetch(ctx, tribechange.FetchConfig{
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Count: shouldCount(ctx),
Select: shouldSelectItems(ctx),
Server: server,

View File

@ -2,14 +2,14 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/tribehistory"
"github.com/tribalwarshelp/shared/models"
)
func (r *tribeHistoryRecordResolver) Tribe(ctx context.Context, obj *models.TribeHistory) (*models.Tribe, error) {
func (r *tribeHistoryRecordResolver) Tribe(ctx context.Context, obj *twmodel.TribeHistory) (*twmodel.Tribe, error) {
if obj.Tribe != nil {
return obj.Tribe, nil
}
@ -19,7 +19,7 @@ func (r *tribeHistoryRecordResolver) Tribe(ctx context.Context, obj *models.Trib
func (r *Resolver) TribeHistory(ctx context.Context,
server string,
f *models.TribeHistoryFilter,
f *twmodel.TribeHistoryFilter,
limit *int,
offset *int,
sort []string) (*generated.TribeHistory, error) {
@ -28,8 +28,8 @@ func (r *Resolver) TribeHistory(ctx context.Context,
list.Items, list.Total, err = r.TribeHistoryUcase.Fetch(ctx, tribehistory.FetchConfig{
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Count: shouldCount(ctx),
Select: shouldSelectItems(ctx),
Server: server,

View File

@ -2,15 +2,15 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/version"
"github.com/tribalwarshelp/shared/models"
)
func (r *queryResolver) Versions(ctx context.Context,
f *models.VersionFilter,
f *twmodel.VersionFilter,
limit *int,
offset *int,
sort []string) (*generated.VersionList, error) {
@ -19,14 +19,14 @@ func (r *queryResolver) Versions(ctx context.Context,
list.Items, list.Total, err = r.VersionUcase.Fetch(ctx, version.FetchConfig{
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Select: shouldSelectItems(ctx),
Count: shouldCount(ctx),
})
return list, err
}
func (r *queryResolver) Version(ctx context.Context, code models.VersionCode) (*models.Version, error) {
func (r *queryResolver) Version(ctx context.Context, code twmodel.VersionCode) (*twmodel.Version, error) {
return r.VersionUcase.GetByCode(ctx, code)
}

View File

@ -2,14 +2,14 @@ package resolvers
import (
"context"
"github.com/tribalwarshelp/api/utils"
"github.com/Kichiyaki/goutil/safeptr"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/graphql/generated"
"github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/shared/models"
)
func (r *villageResolver) Player(ctx context.Context, obj *models.Village) (*models.Player, error) {
func (r *villageResolver) Player(ctx context.Context, obj *twmodel.Village) (*twmodel.Player, error) {
if obj.Player != nil {
return obj.Player, nil
}
@ -19,7 +19,7 @@ func (r *villageResolver) Player(ctx context.Context, obj *models.Village) (*mod
func (r *queryResolver) Villages(ctx context.Context,
server string,
f *models.VillageFilter,
f *twmodel.VillageFilter,
limit *int,
offset *int,
sort []string) (*generated.VillageList, error) {
@ -28,8 +28,8 @@ func (r *queryResolver) Villages(ctx context.Context,
list.Items, list.Total, err = r.VillageUcase.Fetch(ctx, village.FetchConfig{
Filter: f,
Sort: sort,
Limit: utils.SafeIntPointer(limit, 0),
Offset: utils.SafeIntPointer(offset, 0),
Limit: safeptr.SafeIntPointer(limit, 0),
Offset: safeptr.SafeIntPointer(offset, 0),
Select: shouldSelectItems(ctx),
Count: shouldCount(ctx),
Server: server,
@ -37,6 +37,6 @@ func (r *queryResolver) Villages(ctx context.Context,
return list, err
}
func (r *queryResolver) Village(ctx context.Context, server string, id int) (*models.Village, error) {
func (r *queryResolver) Village(ctx context.Context, server string, id int) (*twmodel.Village, error) {
return r.VillageUcase.GetByID(ctx, server, id)
}

27
main.go
View File

@ -2,11 +2,12 @@ package main
import (
"context"
"github.com/Kichiyaki/appmode"
"github.com/Kichiyaki/goutil/envutil"
"github.com/sirupsen/logrus"
"net/http"
"os"
"os/signal"
"strconv"
"strings"
"time"
@ -14,8 +15,6 @@ import (
servermaphttpdelivery "github.com/tribalwarshelp/api/servermap/delivery/http"
"github.com/tribalwarshelp/shared/mode"
httpdelivery "github.com/tribalwarshelp/api/graphql/delivery/http"
"github.com/tribalwarshelp/api/graphql/resolvers"
@ -59,7 +58,7 @@ import (
func init() {
os.Setenv("TZ", "UTC")
if mode.Get() == mode.DevelopmentMode {
if appmode.Equals(appmode.DevelopmentMode) {
godotenv.Load(".env.local")
}
@ -72,7 +71,7 @@ func main() {
Password: os.Getenv("DB_PASSWORD"),
Database: os.Getenv("DB_NAME"),
Addr: os.Getenv("DB_HOST") + ":" + os.Getenv("DB_PORT"),
PoolSize: mustParseEnvToInt("DB_POOL_SIZE"),
PoolSize: envutil.GetenvInt("DB_POOL_SIZE"),
})
defer func() {
if err := db.Close(); err != nil {
@ -109,7 +108,7 @@ func main() {
router := gin.New()
router.Use(ginlogrus.Logger(logrus.WithField("hostname", "api")), gin.Recovery())
if mode.Get() == mode.DevelopmentMode {
if appmode.Equals(appmode.DevelopmentMode) {
router.Use(cors.New(cors.Config{
AllowOriginFunc: func(string) bool {
return true
@ -187,25 +186,13 @@ func main() {
logrus.Println("Server exiting")
}
func mustParseEnvToInt(key string) int {
str := os.Getenv(key)
if str == "" {
return 0
}
i, err := strconv.Atoi(str)
if err != nil {
return 0
}
return i
}
func setupLogger() {
if mode.Get() == mode.DevelopmentMode {
if appmode.Equals(appmode.DevelopmentMode) {
logrus.SetLevel(logrus.DebugLevel)
}
timestampFormat := "2006-01-02 15:04:05"
if mode.Get() == mode.ProductionMode {
if appmode.Equals(appmode.ProductionMode) {
customFormatter := new(logrus.JSONFormatter)
customFormatter.TimestampFormat = timestampFormat
logrus.SetFormatter(customFormatter)

View File

@ -2,16 +2,16 @@ package middleware
import (
"context"
"github.com/Kichiyaki/goutil/strutil"
"github.com/tribalwarshelp/shared/tw/twmodel"
"net/http"
"github.com/vektah/gqlparser/v2/gqlerror"
"github.com/gin-gonic/gin"
"github.com/tribalwarshelp/api/graphql/dataloaders"
"github.com/tribalwarshelp/api/server"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
"github.com/gin-gonic/gin"
)
var serverDataLoadersContextKey ContextKey = "serverDataLoaders"
@ -26,9 +26,9 @@ func DataLoadersToContext(dltcc DataLoadersToContextConfig, cfg dataloaders.Conf
return func(c *gin.Context) {
ctx := c.Request.Context()
serverDataLoaders := make(map[string]*dataloaders.ServerDataLoaders)
versionDataLoaders := make(map[models.VersionCode]*dataloaders.VersionDataLoaders)
versionDataLoaders := make(map[twmodel.VersionCode]*dataloaders.VersionDataLoaders)
servers, _, err := dltcc.ServerRepo.Fetch(c.Request.Context(), server.FetchConfig{
Columns: []string{utils.Underscore("versionCode"), "key"},
Columns: []string{strutil.Underscore("versionCode"), "key"},
Select: true,
})
if err != nil {
@ -65,17 +65,17 @@ func ServerDataLoadersFromContext(ctx context.Context) map[string]*dataloaders.S
return dl.(map[string]*dataloaders.ServerDataLoaders)
}
func StoreVersionDataLoadersInContext(ctx context.Context, loaders map[models.VersionCode]*dataloaders.VersionDataLoaders) context.Context {
func StoreVersionDataLoadersInContext(ctx context.Context, loaders map[twmodel.VersionCode]*dataloaders.VersionDataLoaders) context.Context {
return context.WithValue(ctx, versionLoadersContextKey, loaders)
}
func VersionDataLoadersFromContext(ctx context.Context) map[models.VersionCode]*dataloaders.VersionDataLoaders {
func VersionDataLoadersFromContext(ctx context.Context) map[twmodel.VersionCode]*dataloaders.VersionDataLoaders {
dl := ctx.Value(versionLoadersContextKey)
if dl == nil {
return nil
}
return dl.(map[models.VersionCode]*dataloaders.VersionDataLoaders)
return dl.(map[twmodel.VersionCode]*dataloaders.VersionDataLoaders)
}
func StoreDataLoadersInContext(ctx context.Context, loaders *dataloaders.DataLoaders) context.Context {

View File

@ -2,10 +2,10 @@ package middleware
import (
"context"
"github.com/Kichiyaki/appmode"
"net"
"github.com/gin-gonic/gin"
"github.com/tribalwarshelp/shared/mode"
)
var limitWhitelistContextKey ContextKey = "limitWhitelist"
@ -59,7 +59,7 @@ func LimitWhitelist(cfg LimitWhitelistConfig) gin.HandlerFunc {
return func(c *gin.Context) {
ctx := c.Request.Context()
clientIP := net.ParseIP(c.ClientIP())
canExceedLimit := networksAndIps.Contains(clientIP) || mode.Get() == mode.DevelopmentMode
canExceedLimit := networksAndIps.Contains(clientIP) || appmode.Equals(appmode.DevelopmentMode)
ctx = StoreLimitWhitelistDataInContext(ctx, canExceedLimit)
c.Request = c.Request.WithContext(ctx)
c.Next()

View File

@ -2,13 +2,12 @@ package player
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.PlayerFilter
Filter *twmodel.PlayerFilter
Select bool
Count bool
Sort []string
@ -27,8 +26,8 @@ type SearchPlayerConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Player, int, error)
FetchNameChanges(ctx context.Context, code models.VersionCode, playerID ...int) (map[int][]*models.PlayerNameChange, error)
FetchPlayerServers(ctx context.Context, code models.VersionCode, playerID ...int) (map[int][]string, error)
SearchPlayer(ctx context.Context, cfg SearchPlayerConfig) ([]*models.FoundPlayer, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Player, int, error)
FetchNameChanges(ctx context.Context, code twmodel.VersionCode, playerID ...int) (map[int][]*twmodel.PlayerNameChange, error)
FetchPlayerServers(ctx context.Context, code twmodel.VersionCode, playerID ...int) (map[int][]string, error)
SearchPlayer(ctx context.Context, cfg SearchPlayerConfig) ([]*twmodel.FoundPlayer, int, error)
}

View File

@ -2,13 +2,15 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/tribalwarshelp/api/player"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -19,25 +21,21 @@ func NewPGRepository(db *pg.DB) player.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg player.FetchConfig) ([]*models.Player, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg player.FetchConfig) ([]*twmodel.Player, int, error) {
var err error
data := []*models.Player{}
data := []*twmodel.Player{}
total := 0
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset)
relationshipAndSortAppender := &models.PlayerRelationshipAndSortAppender{
Filter: &models.PlayerFilter{},
Sort: cfg.Sort,
}
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
relationshipAndSortAppender.Filter = cfg.Filter
}
query = query.Apply(relationshipAndSortAppender.Append)
Offset(cfg.Offset).
Apply(cfg.Filter.WhereWithRelations).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()
@ -48,9 +46,9 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg player.FetchConfig) ([]
}
if err != nil && err != pg.ErrNoRows {
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
return nil, 0, fmt.Errorf("Server not found")
return nil, 0, errors.New("Server not found")
}
return nil, 0, fmt.Errorf("Internal server error")
return nil, 0, errors.New("Internal server error")
}
return data, total, nil
@ -61,27 +59,27 @@ type fetchPlayerServersQueryResult struct {
Servers []string `pg:",array"`
}
func (repo *pgRepository) FetchNameChanges(ctx context.Context, code models.VersionCode, playerID ...int) (map[int][]*models.PlayerNameChange, error) {
data := []*models.PlayerNameChange{}
func (repo *pgRepository) FetchNameChanges(ctx context.Context, code twmodel.VersionCode, playerID ...int) (map[int][]*twmodel.PlayerNameChange, error) {
data := []*twmodel.PlayerNameChange{}
if err := repo.Model(&data).
Context(ctx).
Where("version_code = ?", code).
Where("player_id IN (?)", pg.In(playerID)).
Order("change_date ASC").
Select(); err != nil && err != pg.ErrNoRows {
return nil, fmt.Errorf("Internal server error")
return nil, errors.New("Internal server error")
}
m := make(map[int][]*models.PlayerNameChange)
m := make(map[int][]*twmodel.PlayerNameChange)
for _, res := range data {
m[res.PlayerID] = append(m[res.PlayerID], res)
}
return m, nil
}
func (repo *pgRepository) FetchPlayerServers(ctx context.Context, code models.VersionCode, playerID ...int) (map[int][]string, error) {
func (repo *pgRepository) FetchPlayerServers(ctx context.Context, code twmodel.VersionCode, playerID ...int) (map[int][]string, error) {
data := []*fetchPlayerServersQueryResult{}
if err := repo.Model(&models.PlayerToServer{}).
if err := repo.Model(&twmodel.PlayerToServer{}).
Context(ctx).
Column("player_id").
ColumnExpr("array_agg(server_key) as servers").
@ -90,7 +88,7 @@ func (repo *pgRepository) FetchPlayerServers(ctx context.Context, code models.Ve
Where("player_id IN (?)", pg.In(playerID)).
Group("player_id").
Select(&data); err != nil && err != pg.ErrNoRows {
return nil, fmt.Errorf("Internal server error")
return nil, errors.New("Internal server error")
}
m := make(map[int][]string)
@ -100,19 +98,19 @@ func (repo *pgRepository) FetchPlayerServers(ctx context.Context, code models.Ve
return m, nil
}
func (repo *pgRepository) SearchPlayer(ctx context.Context, cfg player.SearchPlayerConfig) ([]*models.FoundPlayer, int, error) {
servers := []*models.Server{}
func (repo *pgRepository) SearchPlayer(ctx context.Context, cfg player.SearchPlayerConfig) ([]*twmodel.FoundPlayer, int, error) {
servers := []*twmodel.Server{}
if err := repo.
Model(&servers).
Context(ctx).
Column("key").
Where("version_code = ?", cfg.Version).
Select(); err != nil {
return nil, 0, fmt.Errorf("Internal server error")
return nil, 0, errors.New("Internal server error")
}
var query *orm.Query
res := []*models.FoundPlayer{}
res := []*twmodel.FoundPlayer{}
whereClause := "player.id = ?1 OR player.name ILIKE ?0"
if cfg.ID <= 0 {
whereClause = "player.name ILIKE ?0"
@ -147,14 +145,17 @@ func (repo *pgRepository) SearchPlayer(ctx context.Context, cfg player.SearchPla
Table("union_q").
Limit(cfg.Limit).
Offset(cfg.Offset).
Order(cfg.Sort...)
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count {
count, err = base.SelectAndCount(&res)
} else {
err = base.Select(&res)
}
if err != nil && err != pg.ErrNoRows {
return nil, 0, fmt.Errorf("Internal server error")
return nil, 0, errors.New("Internal server error")
}
}

View File

@ -2,12 +2,11 @@ package player
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Player, int, error)
GetByID(ctx context.Context, server string, id int) (*models.Player, error)
SearchPlayer(ctx context.Context, cfg SearchPlayerConfig) ([]*models.FoundPlayer, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Player, int, error)
GetByID(ctx context.Context, server string, id int) (*twmodel.Player, error)
SearchPlayer(ctx context.Context, cfg SearchPlayerConfig) ([]*twmodel.FoundPlayer, int, error)
}

View File

@ -3,12 +3,12 @@ package usecase
import (
"context"
"fmt"
"github.com/pkg/errors"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/player"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -19,22 +19,20 @@ func New(repo player.Repository) player.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg player.FetchConfig) ([]*models.Player, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg player.FetchConfig) ([]*twmodel.Player, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.PlayerFilter{}
cfg.Filter = &twmodel.PlayerFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > player.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = player.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}
func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*models.Player, error) {
func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*twmodel.Player, error) {
players, _, err := ucase.repo.Fetch(ctx, player.FetchConfig{
Server: server,
Filter: &models.PlayerFilter{
Filter: &twmodel.PlayerFilter{
ID: []int{id},
},
Limit: 1,
@ -50,16 +48,15 @@ func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*mode
return players[0], nil
}
func (ucase *usecase) SearchPlayer(ctx context.Context, cfg player.SearchPlayerConfig) ([]*models.FoundPlayer, int, error) {
func (ucase *usecase) SearchPlayer(ctx context.Context, cfg player.SearchPlayerConfig) ([]*twmodel.FoundPlayer, int, error) {
if "" == strings.TrimSpace(cfg.Version) {
return nil, 0, fmt.Errorf("Version is required.")
return nil, 0, errors.New("Version is required.")
}
if "" == strings.TrimSpace(cfg.Name) && cfg.ID <= 0 {
return nil, 0, fmt.Errorf("Your search is ambiguous. You must specify the variable 'name' or 'id'.")
return nil, 0, errors.New("Your search is ambiguous. You must specify the variable 'name' or 'id'.")
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > player.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = player.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.SearchPlayer(ctx, cfg)
}

View File

@ -2,13 +2,12 @@ package playerhistory
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.PlayerHistoryFilter
Filter *twmodel.PlayerHistoryFilter
Count bool
Select bool
Sort []string
@ -17,5 +16,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.PlayerHistory, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.PlayerHistory, int, error)
}

View File

@ -2,12 +2,14 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/pkg/errors"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/tribalwarshelp/api/playerhistory"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -18,25 +20,21 @@ func NewPGRepository(db *pg.DB) playerhistory.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg playerhistory.FetchConfig) ([]*models.PlayerHistory, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg playerhistory.FetchConfig) ([]*twmodel.PlayerHistory, int, error) {
var err error
total := 0
data := []*models.PlayerHistory{}
data := []*twmodel.PlayerHistory{}
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset)
relationshipAndSortAppender := &models.PlayerHistoryRelationshipAndSortAppender{
Filter: &models.PlayerHistoryFilter{},
Sort: cfg.Sort,
}
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
relationshipAndSortAppender.Filter = cfg.Filter
}
query = query.Apply(relationshipAndSortAppender.Append)
Offset(cfg.Offset).
Apply(cfg.Filter.WhereWithRelations).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()
@ -47,9 +45,9 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg playerhistory.FetchConf
}
if err != nil && err != pg.ErrNoRows {
if strings.Contains(err.Error(), `relation "`+cfg.Server) {
return nil, 0, fmt.Errorf("Server not found")
return nil, 0, errors.New("Server not found")
}
return nil, 0, fmt.Errorf("Internal server error")
return nil, 0, errors.New("Internal server error")
}
return data, total, nil

View File

@ -2,10 +2,9 @@ package playerhistory
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.PlayerHistory, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.PlayerHistory, int, error)
}

View File

@ -2,11 +2,10 @@ package usecase
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/playerhistory"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -17,14 +16,12 @@ func New(repo playerhistory.Repository) playerhistory.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg playerhistory.FetchConfig) ([]*models.PlayerHistory, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg playerhistory.FetchConfig) ([]*twmodel.PlayerHistory, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.PlayerHistoryFilter{}
cfg.Filter = &twmodel.PlayerHistoryFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > playerhistory.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = playerhistory.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}

View File

@ -1,5 +0,0 @@
#!/bin/sh
export MODE=development
export GIN_MODE=debug
go run -race main.go

View File

@ -2,12 +2,11 @@ package server
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Filter *models.ServerFilter
Filter *twmodel.ServerFilter
Columns []string
Select bool
Count bool
@ -17,5 +16,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Server, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Server, int, error)
}

View File

@ -3,12 +3,14 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/pkg/errors"
"github.com/tribalwarshelp/api/server"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -16,7 +18,7 @@ type pgRepository struct {
}
func NewPGRepository(db *pg.DB) (server.Repository, error) {
if err := db.Model(&models.Server{}).CreateTable(&orm.CreateTableOptions{
if err := db.Model(&twmodel.Server{}).CreateTable(&orm.CreateTableOptions{
IfNotExists: true,
}); err != nil {
return nil, errors.Wrap(err, "cannot create 'servers' table")
@ -24,19 +26,20 @@ func NewPGRepository(db *pg.DB) (server.Repository, error) {
return &pgRepository{db}, nil
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg server.FetchConfig) ([]*models.Server, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg server.FetchConfig) ([]*twmodel.Server, int, error) {
var err error
total := 0
data := []*models.Server{}
data := []*twmodel.Server{}
query := repo.
Model(&data).
Context(ctx).
Order(cfg.Sort...).
Limit(cfg.Limit).
Offset(cfg.Offset)
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
}
Apply(cfg.Filter.Where).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if len(cfg.Columns) > 0 {
query = query.Column(cfg.Columns...)
}

View File

@ -2,11 +2,10 @@ package server
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Server, int, error)
GetByKey(ctx context.Context, key string) (*models.Server, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Server, int, error)
GetByKey(ctx context.Context, key string) (*twmodel.Server, error)
}

View File

@ -3,11 +3,10 @@ package usecase
import (
"context"
"fmt"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/server"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -18,20 +17,19 @@ func New(repo server.Repository) server.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg server.FetchConfig) ([]*models.Server, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg server.FetchConfig) ([]*twmodel.Server, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.ServerFilter{}
cfg.Filter = &twmodel.ServerFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > server.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = server.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}
func (ucase *usecase) GetByKey(ctx context.Context, key string) (*models.Server, error) {
func (ucase *usecase) GetByKey(ctx context.Context, key string) (*twmodel.Server, error) {
servers, _, err := ucase.repo.Fetch(ctx, server.FetchConfig{
Filter: &models.ServerFilter{
Filter: &twmodel.ServerFilter{
Key: []string{key},
},
Limit: 1,

View File

@ -2,17 +2,18 @@ package httpdelivery
import (
"fmt"
"github.com/Kichiyaki/appmode"
"net/http"
"strconv"
"time"
"github.com/tribalwarshelp/map-generator/generator"
"github.com/tribalwarshelp/shared/mode"
"github.com/gin-gonic/gin"
"github.com/vektah/gqlparser/v2/gqlerror"
"github.com/tribalwarshelp/api/server"
"github.com/tribalwarshelp/api/servermap"
"github.com/vektah/gqlparser/v2/gqlerror"
)
const (
@ -43,7 +44,7 @@ func Attach(cfg Config) error {
func (h *handler) mapHandler(c *gin.Context) {
c.Header("Cache-Control", fmt.Sprintf(`public, max-age=%d`, imageTTL))
server, err := h.serverUsecase.GetByKey(c.Request.Context(), c.Param("server"))
srv, err := h.serverUsecase.GetByKey(c.Request.Context(), c.Param("server"))
if err != nil {
c.JSON(http.StatusNotFound, &gqlerror.Error{
Message: err.Error(),
@ -55,7 +56,7 @@ func (h *handler) mapHandler(c *gin.Context) {
largerMarkers := c.Query("largerMarkers")
markersOnly := c.Query("markersOnly")
markers, err := h.mapUsecase.GetMarkers(c.Request.Context(), servermap.GetMarkersConfig{
Server: server.Key,
Server: srv.Key,
Tribes: c.Request.URL.Query()["tribe"],
Players: c.Request.URL.Query()["player"],
ShowBarbarianVillages: showBarbarian == "true" || showBarbarian == "1",
@ -87,12 +88,12 @@ func (h *handler) mapHandler(c *gin.Context) {
BackgroundColor: c.Query("backgroundColor"),
GridLineColor: c.Query("gridLineColor"),
ContinentNumberColor: c.Query("continentNumberColor"),
MapSize: server.Config.Coord.MapSize,
MapSize: srv.Config.Coord.MapSize,
CenterX: centerX,
CenterY: centerY,
Scale: float32(scale),
Quality: 90,
PNG: mode.Get() == mode.ProductionMode,
PNG: appmode.Equals(appmode.ProductionMode),
}); err != nil {
c.JSON(http.StatusBadRequest, &gqlerror.Error{
Message: err.Error(),

View File

@ -3,16 +3,18 @@ package usecase
import (
"context"
"fmt"
"github.com/tribalwarshelp/shared/tw/twmodel"
"sort"
"strconv"
"strings"
"sync"
"github.com/pkg/errors"
"github.com/tribalwarshelp/map-generator/generator"
"github.com/tribalwarshelp/api/servermap"
"github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/map-generator/generator"
"github.com/tribalwarshelp/shared/models"
"golang.org/x/sync/errgroup"
)
@ -52,8 +54,8 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
g.Go(func() error {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Server: cfg.Server,
Filter: &models.VillageFilter{
PlayerFilter: &models.PlayerFilter{
Filter: &twmodel.VillageFilter{
PlayerFilter: &twmodel.PlayerFilter{
IDNEQ: append(playerIDs, 0),
TribeIDNEQ: tribeIDs,
},
@ -82,7 +84,7 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
g.Go(func() error {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Server: cfg.Server,
Filter: &models.VillageFilter{
Filter: &twmodel.VillageFilter{
PlayerID: []int{0},
},
Select: true,
@ -110,8 +112,8 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
g.Go(func() error {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Server: cfg.Server,
Filter: &models.VillageFilter{
PlayerFilter: &models.PlayerFilter{
Filter: &twmodel.VillageFilter{
PlayerFilter: &twmodel.PlayerFilter{
IDNEQ: playerIDs,
TribeID: ids,
},
@ -142,7 +144,7 @@ func (ucase *usecase) GetMarkers(ctx context.Context, cfg servermap.GetMarkersCo
g.Go(func() error {
villages, _, err := ucase.villageRepo.Fetch(ctx, village.FetchConfig{
Server: cfg.Server,
Filter: &models.VillageFilter{
Filter: &twmodel.VillageFilter{
PlayerID: ids,
},
Select: true,

View File

@ -2,13 +2,12 @@ package serverstats
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.ServerStatsFilter
Filter *twmodel.ServerStatsFilter
Select bool
Count bool
Sort []string
@ -17,5 +16,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.ServerStats, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.ServerStats, int, error)
}

View File

@ -3,11 +3,13 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/tribalwarshelp/api/serverstats"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -18,20 +20,21 @@ func NewPGRepository(db *pg.DB) serverstats.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg serverstats.FetchConfig) ([]*models.ServerStats, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg serverstats.FetchConfig) ([]*twmodel.ServerStats, int, error) {
var err error
data := []*models.ServerStats{}
data := []*twmodel.ServerStats{}
total := 0
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Order(cfg.Sort...).
Limit(cfg.Limit).
Offset(cfg.Offset)
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
}
Offset(cfg.Offset).
Apply(cfg.Filter.Where).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()

View File

@ -2,10 +2,9 @@ package serverstats
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.ServerStats, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.ServerStats, int, error)
}

View File

@ -2,11 +2,10 @@ package usecase
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/serverstats"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -17,14 +16,14 @@ func New(repo serverstats.Repository) serverstats.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg serverstats.FetchConfig) ([]*models.ServerStats, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg serverstats.FetchConfig) ([]*twmodel.ServerStats, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.ServerStatsFilter{}
cfg.Filter = &twmodel.ServerStatsFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > serverstats.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = serverstats.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}

View File

@ -2,13 +2,12 @@ package tribe
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.TribeFilter
Filter *twmodel.TribeFilter
Count bool
Select bool
Sort []string
@ -26,6 +25,6 @@ type SearchTribeConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Tribe, int, error)
SearchTribe(ctx context.Context, cfg SearchTribeConfig) ([]*models.FoundTribe, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Tribe, int, error)
SearchTribe(ctx context.Context, cfg SearchTribeConfig) ([]*twmodel.FoundTribe, int, error)
}

View File

@ -3,12 +3,14 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/tribalwarshelp/api/tribe"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -19,20 +21,21 @@ func NewPGRepository(db *pg.DB) tribe.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg tribe.FetchConfig) ([]*models.Tribe, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg tribe.FetchConfig) ([]*twmodel.Tribe, int, error) {
var err error
data := []*models.Tribe{}
data := []*twmodel.Tribe{}
total := 0
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Order(cfg.Sort...).
Limit(cfg.Limit).
Offset(cfg.Offset)
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
}
Offset(cfg.Offset).
Apply(cfg.Filter.Where).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()
@ -51,8 +54,8 @@ func (repo *pgRepository) Fetch(ctx context.Context, cfg tribe.FetchConfig) ([]*
return data, total, nil
}
func (repo *pgRepository) SearchTribe(ctx context.Context, cfg tribe.SearchTribeConfig) ([]*models.FoundTribe, int, error) {
servers := []*models.Server{}
func (repo *pgRepository) SearchTribe(ctx context.Context, cfg tribe.SearchTribeConfig) ([]*twmodel.FoundTribe, int, error) {
servers := []*twmodel.Server{}
if err := repo.
Model(&servers).
Context(ctx).
@ -63,7 +66,7 @@ func (repo *pgRepository) SearchTribe(ctx context.Context, cfg tribe.SearchTribe
}
var query *orm.Query
res := []*models.FoundTribe{}
res := []*twmodel.FoundTribe{}
for _, server := range servers {
safeKey := pg.Safe(server.Key)
otherQuery := repo.
@ -89,7 +92,10 @@ func (repo *pgRepository) SearchTribe(ctx context.Context, cfg tribe.SearchTribe
Table("union_q").
Limit(cfg.Limit).
Offset(cfg.Offset).
Order(cfg.Sort...)
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count {
count, err = base.SelectAndCount(&res)
} else {

View File

@ -2,12 +2,11 @@ package tribe
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Tribe, int, error)
GetByID(ctx context.Context, server string, id int) (*models.Tribe, error)
SearchTribe(ctx context.Context, cfg SearchTribeConfig) ([]*models.FoundTribe, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Tribe, int, error)
GetByID(ctx context.Context, server string, id int) (*twmodel.Tribe, error)
SearchTribe(ctx context.Context, cfg SearchTribeConfig) ([]*twmodel.FoundTribe, int, error)
}

View File

@ -3,12 +3,11 @@ package usecase
import (
"context"
"fmt"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/tribe"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -19,21 +18,19 @@ func New(repo tribe.Repository) tribe.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg tribe.FetchConfig) ([]*models.Tribe, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg tribe.FetchConfig) ([]*twmodel.Tribe, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.TribeFilter{}
cfg.Filter = &twmodel.TribeFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > tribe.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = tribe.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}
func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*models.Tribe, error) {
func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*twmodel.Tribe, error) {
tribes, _, err := ucase.repo.Fetch(ctx, tribe.FetchConfig{
Filter: &models.TribeFilter{
Filter: &twmodel.TribeFilter{
ID: []int{id},
},
Limit: 1,
@ -50,7 +47,7 @@ func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*mode
return tribes[0], nil
}
func (ucase *usecase) SearchTribe(ctx context.Context, cfg tribe.SearchTribeConfig) ([]*models.FoundTribe, int, error) {
func (ucase *usecase) SearchTribe(ctx context.Context, cfg tribe.SearchTribeConfig) ([]*twmodel.FoundTribe, int, error) {
if "" == strings.TrimSpace(cfg.Version) {
return nil, 0, fmt.Errorf("Version is required.")
}
@ -60,6 +57,5 @@ func (ucase *usecase) SearchTribe(ctx context.Context, cfg tribe.SearchTribeConf
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > tribe.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = tribe.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.SearchTribe(ctx, cfg)
}

View File

@ -2,13 +2,12 @@ package tribechange
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.TribeChangeFilter
Filter *twmodel.TribeChangeFilter
Count bool
Select bool
Sort []string
@ -17,5 +16,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.TribeChange, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.TribeChange, int, error)
}

View File

@ -1,22 +0,0 @@
package repository
import (
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/tribalwarshelp/shared/models"
)
func appendTribeChangeFilterOr(or *models.TribeChangeFilterOr) func(*orm.Query) (*orm.Query, error) {
return func(q *orm.Query) (*orm.Query, error) {
if or != nil {
if len(or.NewTribeID) > 0 {
q = q.WhereOr("new_tribe_id IN (?)", pg.In(or.NewTribeID))
}
if len(or.OldTribeID) > 0 {
q = q.WhereOr("old_tribe_id IN (?)", pg.In(or.OldTribeID))
}
}
return q, nil
}
}

View File

@ -3,11 +3,13 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/tribalwarshelp/api/tribechange"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -18,25 +20,21 @@ func NewPGRepository(db *pg.DB) tribechange.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg tribechange.FetchConfig) ([]*models.TribeChange, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg tribechange.FetchConfig) ([]*twmodel.TribeChange, int, error) {
var err error
total := 0
data := []*models.TribeChange{}
data := []*twmodel.TribeChange{}
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset)
relationshipAndSortAppender := &models.TribeChangeRelationshipAndSortAppender{
Filter: &models.TribeChangeFilter{},
Sort: cfg.Sort,
}
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
relationshipAndSortAppender.Filter = cfg.Filter
}
query = query.Apply(relationshipAndSortAppender.Append)
Offset(cfg.Offset).
Apply(cfg.Filter.WhereWithRelations).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()

View File

@ -2,10 +2,9 @@ package tribechange
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.TribeChange, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.TribeChange, int, error)
}

View File

@ -2,11 +2,10 @@ package usecase
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/tribechange"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -17,14 +16,12 @@ func New(repo tribechange.Repository) tribechange.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg tribechange.FetchConfig) ([]*models.TribeChange, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg tribechange.FetchConfig) ([]*twmodel.TribeChange, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.TribeChangeFilter{}
cfg.Filter = &twmodel.TribeChangeFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > tribechange.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = tribechange.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}

View File

@ -2,13 +2,12 @@ package tribehistory
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.TribeHistoryFilter
Filter *twmodel.TribeHistoryFilter
Select bool
Count bool
Sort []string
@ -17,5 +16,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.TribeHistory, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.TribeHistory, int, error)
}

View File

@ -3,11 +3,13 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/tribalwarshelp/api/tribehistory"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -18,25 +20,21 @@ func NewPGRepository(db *pg.DB) tribehistory.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg tribehistory.FetchConfig) ([]*models.TribeHistory, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg tribehistory.FetchConfig) ([]*twmodel.TribeHistory, int, error) {
var err error
total := 0
data := []*models.TribeHistory{}
data := []*twmodel.TribeHistory{}
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset)
relationshipAndSortAppender := &models.TribeHistoryRelationshipAndSortAppender{
Filter: &models.TribeHistoryFilter{},
Sort: cfg.Sort,
}
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
relationshipAndSortAppender.Filter = cfg.Filter
}
query = query.Apply(relationshipAndSortAppender.Append)
Offset(cfg.Offset).
Apply(cfg.Filter.WhereWithRelations).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()

View File

@ -2,10 +2,9 @@ package tribehistory
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.TribeHistory, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.TribeHistory, int, error)
}

View File

@ -2,11 +2,10 @@ package usecase
import (
"context"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/tribehistory"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -17,14 +16,12 @@ func New(repo tribehistory.Repository) tribehistory.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg tribehistory.FetchConfig) ([]*models.TribeHistory, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg tribehistory.FetchConfig) ([]*twmodel.TribeHistory, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.TribeHistoryFilter{}
cfg.Filter = &twmodel.TribeHistoryFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > tribehistory.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = tribehistory.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}

View File

@ -1,12 +0,0 @@
package utils
import "strings"
func FindStringWithPrefix(sl []string, prefix string) string {
for _, s := range sl {
if strings.HasPrefix(s, prefix) {
return s
}
}
return ""
}

View File

@ -1,22 +0,0 @@
package utils
func SafeBoolPointer(value *bool, defaultValue bool) bool {
if value == nil {
return defaultValue
}
return *value
}
func SafeIntPointer(value *int, defaultValue int) int {
if value == nil {
return defaultValue
}
return *value
}
func SafeStrPointer(value *string, defaultValue string) string {
if value == nil {
return defaultValue
}
return *value
}

View File

@ -1,41 +0,0 @@
package utils
import (
"regexp"
"strings"
)
var (
sortexprRegex = regexp.MustCompile(`^[\p{L}\_\.]+$`)
)
func SanitizeSort(expr string) string {
splitted := strings.Split(strings.TrimSpace(expr), " ")
length := len(splitted)
if length != 2 || !sortexprRegex.Match([]byte(splitted[0])) {
return ""
}
table := ""
column := splitted[0]
if strings.Contains(splitted[0], ".") {
columnAndTable := strings.Split(splitted[0], ".")
table = Underscore(columnAndTable[0]) + "."
column = columnAndTable[1]
}
keyword := "ASC"
if strings.ToUpper(splitted[1]) == "DESC" {
keyword = "DESC"
}
return strings.ToLower(table+Underscore(column)) + " " + keyword
}
func SanitizeSorts(sorts []string) []string {
sanitized := []string{}
for _, sort := range sorts {
sanitizedSort := SanitizeSort(sort)
if sanitizedSort != "" {
sanitized = append(sanitized, sanitizedSort)
}
}
return sanitized
}

View File

@ -1,61 +0,0 @@
package utils
import (
"unicode"
"unicode/utf8"
)
type buffer struct {
r []byte
runeBytes [utf8.UTFMax]byte
}
func (b *buffer) write(r rune) {
if r < utf8.RuneSelf {
b.r = append(b.r, byte(r))
return
}
n := utf8.EncodeRune(b.runeBytes[0:], r)
b.r = append(b.r, b.runeBytes[0:n]...)
}
func (b *buffer) indent() {
if len(b.r) > 0 {
b.r = append(b.r, '_')
}
}
func Underscore(s string) string {
b := buffer{
r: make([]byte, 0, len(s)),
}
var m rune
var w bool
for _, ch := range s {
if unicode.IsUpper(ch) {
if m != 0 {
if !w {
b.indent()
w = true
}
b.write(m)
}
m = unicode.ToLower(ch)
} else {
if m != 0 {
b.indent()
b.write(m)
m = 0
w = false
}
b.write(ch)
}
}
if m != 0 {
if !w {
b.indent()
}
b.write(m)
}
return string(b.r)
}

View File

@ -2,12 +2,11 @@ package version
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Filter *models.VersionFilter
Filter *twmodel.VersionFilter
Select bool
Count bool
Sort []string
@ -16,5 +15,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Version, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Version, int, error)
}

View File

@ -3,12 +3,14 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/go-pg/pg/v10"
"github.com/go-pg/pg/v10/orm"
"github.com/pkg/errors"
"github.com/tribalwarshelp/api/version"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -16,7 +18,7 @@ type pgRepository struct {
}
func NewPGRepository(db *pg.DB) (version.Repository, error) {
if err := db.Model(&models.Version{}).CreateTable(&orm.CreateTableOptions{
if err := db.Model(&twmodel.Version{}).CreateTable(&orm.CreateTableOptions{
IfNotExists: true,
}); err != nil {
return nil, errors.Wrap(err, "cannot create 'versions' table")
@ -24,19 +26,20 @@ func NewPGRepository(db *pg.DB) (version.Repository, error) {
return &pgRepository{db}, nil
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg version.FetchConfig) ([]*models.Version, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg version.FetchConfig) ([]*twmodel.Version, int, error) {
var err error
data := []*models.Version{}
data := []*twmodel.Version{}
total := 0
query := repo.
Model(&data).
Context(ctx).
Order(cfg.Sort...).
Limit(cfg.Limit).
Offset(cfg.Offset)
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
}
Offset(cfg.Offset).
Apply(cfg.Filter.Where).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if cfg.Count && cfg.Select {
total, err = query.SelectAndCount()

View File

@ -2,11 +2,10 @@ package version
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Version, int, error)
GetByCode(ctx context.Context, code models.VersionCode) (*models.Version, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Version, int, error)
GetByCode(ctx context.Context, code twmodel.VersionCode) (*twmodel.Version, error)
}

View File

@ -3,12 +3,10 @@ package usecase
import (
"context"
"fmt"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/api/version"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -21,22 +19,20 @@ func New(repo version.Repository) version.Usecase {
}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg version.FetchConfig) ([]*models.Version, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg version.FetchConfig) ([]*twmodel.Version, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.VersionFilter{}
cfg.Filter = &twmodel.VersionFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > version.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = version.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}
func (ucase *usecase) GetByCode(ctx context.Context, code models.VersionCode) (*models.Version, error) {
func (ucase *usecase) GetByCode(ctx context.Context, code twmodel.VersionCode) (*twmodel.Version, error) {
versions, _, err := ucase.repo.Fetch(ctx, version.FetchConfig{
Filter: &models.VersionFilter{
Code: []models.VersionCode{code},
Filter: &twmodel.VersionFilter{
Code: []twmodel.VersionCode{code},
},
Limit: 1,
Select: true,

View File

@ -2,13 +2,12 @@ package village
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type FetchConfig struct {
Server string
Filter *models.VillageFilter
Filter *twmodel.VillageFilter
Columns []string
Select bool
Count bool
@ -18,5 +17,5 @@ type FetchConfig struct {
}
type Repository interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Village, int, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Village, int, error)
}

View File

@ -3,11 +3,13 @@ package repository
import (
"context"
"fmt"
"github.com/Kichiyaki/gopgutil/v10"
"github.com/tribalwarshelp/shared/tw/twmodel"
"strings"
"github.com/go-pg/pg/v10"
"github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/shared/models"
)
type pgRepository struct {
@ -18,27 +20,23 @@ func NewPGRepository(db *pg.DB) village.Repository {
return &pgRepository{db}
}
func (repo *pgRepository) Fetch(ctx context.Context, cfg village.FetchConfig) ([]*models.Village, int, error) {
func (repo *pgRepository) Fetch(ctx context.Context, cfg village.FetchConfig) ([]*twmodel.Village, int, error) {
var err error
data := []*models.Village{}
data := []*twmodel.Village{}
query := repo.
WithParam("SERVER", pg.Safe(cfg.Server)).
Model(&data).
Context(ctx).
Limit(cfg.Limit).
Offset(cfg.Offset)
Offset(cfg.Offset).
Apply(cfg.Filter.WhereWithRelations).
Apply(gopgutil.OrderAppender{
Orders: cfg.Sort,
MaxDepth: 4,
}.Apply)
if len(cfg.Columns) > 0 {
query = query.Column(cfg.Columns...)
}
relationshipAndSortAppender := &models.VillageRelationshipAndSortAppender{
Filter: &models.VillageFilter{},
Sort: cfg.Sort,
}
if cfg.Filter != nil {
query = query.Apply(cfg.Filter.Where)
relationshipAndSortAppender.Filter = cfg.Filter
}
query = query.Apply(relationshipAndSortAppender.Append)
total := 0
if cfg.Count && cfg.Select {

View File

@ -2,11 +2,10 @@ package village
import (
"context"
"github.com/tribalwarshelp/shared/models"
"github.com/tribalwarshelp/shared/tw/twmodel"
)
type Usecase interface {
Fetch(ctx context.Context, cfg FetchConfig) ([]*models.Village, int, error)
GetByID(ctx context.Context, server string, id int) (*models.Village, error)
Fetch(ctx context.Context, cfg FetchConfig) ([]*twmodel.Village, int, error)
GetByID(ctx context.Context, server string, id int) (*twmodel.Village, error)
}

View File

@ -3,11 +3,10 @@ package usecase
import (
"context"
"fmt"
"github.com/tribalwarshelp/shared/tw/twmodel"
"github.com/tribalwarshelp/api/middleware"
"github.com/tribalwarshelp/api/utils"
"github.com/tribalwarshelp/api/village"
"github.com/tribalwarshelp/shared/models"
)
type usecase struct {
@ -18,21 +17,19 @@ func New(repo village.Repository) village.Usecase {
return &usecase{repo}
}
func (ucase *usecase) Fetch(ctx context.Context, cfg village.FetchConfig) ([]*models.Village, int, error) {
func (ucase *usecase) Fetch(ctx context.Context, cfg village.FetchConfig) ([]*twmodel.Village, int, error) {
if cfg.Filter == nil {
cfg.Filter = &models.VillageFilter{}
cfg.Filter = &twmodel.VillageFilter{}
}
if !middleware.CanExceedLimit(ctx) && (cfg.Limit > village.FetchLimit || cfg.Limit <= 0) {
cfg.Limit = village.FetchLimit
}
cfg.Sort = utils.SanitizeSorts(cfg.Sort)
return ucase.repo.Fetch(ctx, cfg)
}
func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*models.Village, error) {
func (ucase *usecase) GetByID(ctx context.Context, server string, id int) (*twmodel.Village, error) {
villages, _, err := ucase.repo.Fetch(ctx, village.FetchConfig{
Filter: &models.VillageFilter{
Filter: &twmodel.VillageFilter{
ID: []int{id},
},
Limit: 1,