diff --git a/go.mod b/go.mod index fffef83..369498c 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,10 @@ module github.com/tribalwarshelp/shared go 1.16 require ( + github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83 + github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210505093434-655fa2df248f github.com/go-pg/pg/v10 v10.9.1 github.com/pkg/errors v0.9.1 - github.com/sirupsen/logrus v1.7.0 github.com/vmihailenco/msgpack/v5 v5.3.1 // indirect go.opentelemetry.io/otel v0.20.0 // indirect golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect diff --git a/go.sum b/go.sum index 308490c..6c89535 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,11 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83 h1:Oa8Bk4LNcknxw50gZOlvPwEreOlAbOnu7V82lUYNbOM= +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 h1:/kJmv8B59cMHdTmsko0RyAOeRC9WpsQPDmLtRXOAU6c= +github.com/Kichiyaki/gopgutil/v10 v10.0.0-20210505093434-655fa2df248f/go.mod h1:MSAEhr8oeK+Rhjhqyl31/8/AI88thYky80OyD8mheDA= +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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -57,10 +63,7 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= @@ -118,7 +121,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/mode/mode.go b/mode/mode.go deleted file mode 100644 index cd9f4fc..0000000 --- a/mode/mode.go +++ /dev/null @@ -1,37 +0,0 @@ -package mode - -import ( - "os" -) - -const ( - EnvMode = "MODE" - DevelopmentMode = "development" - ProductionMode = "production" - TestMode = "test" -) - -var mode = DevelopmentMode - -func init() { - Set(os.Getenv(EnvMode)) -} - -func Set(value string) { - if value == "" { - value = DevelopmentMode - } - - switch value { - case DevelopmentMode, - ProductionMode, - TestMode: - mode = value - default: - panic("unknown mode: " + value) - } -} - -func Get() string { - return mode -} diff --git a/models/helpers.go b/models/helpers.go deleted file mode 100644 index 9d69b65..0000000 --- a/models/helpers.go +++ /dev/null @@ -1,103 +0,0 @@ -package models - -import ( - "strings" - "time" -) - -func addAliasToColumnName(column, prefix string) string { - if prefix != "" && !strings.HasPrefix(column, prefix+".") { - column = wrapStringInDoubleQuotes(prefix) + "." + wrapStringInDoubleQuotes(column) - } else { - column = wrapStringInDoubleQuotes(column) - } - return column -} - -func wrapStringInDoubleQuotes(str string) string { - return `"` + str + `"` -} - -func buildConditionEquals(column string) string { - return column + " = ?" -} - -func buildConditionLT(column string) string { - return column + " < ?" -} - -func buildConditionLTE(column string) string { - return column + " <= ?" -} - -func buildConditionGT(column string) string { - return column + " > ?" -} - -func buildConditionGTE(column string) string { - return column + " >= ?" -} - -func buildConditionMatch(column string) string { - return column + " LIKE ?" -} - -func buildConditionIEQ(column string) string { - return column + " ILIKE ?" -} - -func buildConditionArray(column string) string { - return column + " = ANY(?)" -} - -func buildConditionNotInArray(column string) string { - return "NOT (" + buildConditionArray(column) + ")" -} - -func isZero(v interface{}) bool { - switch c := v.(type) { - case string: - return c == "" - case *string: - return c == nil - case []string: - return c == nil || len(c) == 0 - case []VersionCode: - return c == nil || len(c) == 0 - case []ServerStatus: - return c == nil || len(c) == 0 - case int: - return c == 0 - case *int: - return c == nil - case []int: - return c == nil || len(c) == 0 - case float64: - return c == 0 - case *float64: - return c == nil - case float32: - return c == 0 - case *float32: - return c == nil - case bool: - return !c - case *bool: - return c == nil - case time.Time: - return c.IsZero() - case *time.Time: - return c == nil - default: - return false - } -} - -func findStringWithPrefix(sl []string, prefix string) string { - for _, s := range sl { - if strings.HasPrefix(s, prefix) { - return s - } - } - return "" -} diff --git a/models/opponents_defeated.go b/models/opponents_defeated.go deleted file mode 100644 index 046f09d..0000000 --- a/models/opponents_defeated.go +++ /dev/null @@ -1,188 +0,0 @@ -package models - -import "github.com/go-pg/pg/v10/orm" - -type OpponentsDefeated struct { - RankAtt int `json:"rankAtt" pg:",use_zero" gqlgen:"rankAtt"` - ScoreAtt int `pg:",use_zero" json:"scoreAtt" gqlgen:"scoreAtt"` - RankDef int `pg:",use_zero" json:"rankDef" gqlgen:"rankDef"` - ScoreDef int `pg:",use_zero" json:"scoreDef" gqlgen:"scoreDef"` - RankSup int `pg:",use_zero" json:"rankSup,omitempty" gqlgen:"rankSup"` - ScoreSup int `pg:",use_zero" json:"scoreSup,omitempty" gqlgen:"scoreSup"` - RankTotal int `pg:",use_zero" json:"rankTotal" gqlgen:"rankTotal"` - ScoreTotal int `pg:",use_zero" json:"scoreTotal" gqlgen:"scoreTotal"` -} - -type OpponentsDefeatedFilter struct { - RankAtt int `json:"rankAtt" gqlgen:"rankAtt"` - RankAttGT int `json:"rankAttGT" gqlgen:"rankAttGT"` - RankAttGTE int `json:"rankAttGTE" gqlgen:"rankAttGTE"` - RankAttLT int `json:"rankAttLT" gqlgen:"rankAttLT"` - RankAttLTE int `json:"rankAttLTE" gqlgen:"rankAttLTE"` - ScoreAtt int `json:"scoreAtt" gqlgen:"scoreAtt"` - ScoreAttGT int `json:"scoreAttGT" gqlgen:"scoreAttGT"` - ScoreAttGTE int `json:"scoreAttGTE" gqlgen:"scoreAttGTE"` - ScoreAttLT int `json:"scoreAttLT" gqlgen:"scoreAttLT"` - ScoreAttLTE int `json:"scoreAttLTE" gqlgen:"scoreAttLTE"` - - RankDef int `json:"rankDef" gqlgen:"rankDef"` - RankDefGT int `json:"rankDefGT" gqlgen:"rankDefGT"` - RankDefGTE int `json:"rankDefGTE" gqlgen:"rankDefGTE"` - RankDefLT int `json:"rankDefLT" gqlgen:"rankDefLT"` - RankDefLTE int `json:"rankDefLTE" gqlgen:"rankDefLTE"` - ScoreDef int `json:"scoreDef" gqlgen:"scoreDef"` - ScoreDefGT int `json:"scoreDefGT" gqlgen:"scoreDefGT"` - ScoreDefGTE int `json:"scoreDefGTE" gqlgen:"scoreDefGTE"` - ScoreDefLT int `json:"scoreDefLT" gqlgen:"scoreDefLT"` - ScoreDefLTE int `json:"scoreDefLTE" gqlgen:"scoreDefLTE"` - - RankSup int `json:"rankSup,omitempty" gqlgen:"rankSup"` - RankSupGT int `json:"rankSupGT,omitempty" gqlgen:"rankSupGT"` - RankSupGTE int `json:"rankSupGTE,omitempty" gqlgen:"rankSupGTE"` - RankSupLT int `json:"rankSupLT,omitempty" gqlgen:"rankSupLT"` - RankSupLTE int `json:"rankSupLTE,omitempty" gqlgen:"rankSupLTE"` - ScoreSup int `json:"scoreSup,omitempty" gqlgen:"scoreSup"` - ScoreSupGT int `json:"scoreSupGT,omitempty" gqlgen:"scoreSupGT"` - ScoreSupGTE int `json:"scoreSupGTE,omitempty" gqlgen:"scoreSupGTE"` - ScoreSupLT int `json:"scoreSupLT,omitempty" gqlgen:"scoreSupLT"` - ScoreSupLTE int `json:"scoreSupLTE,omitempty" gqlgen:"scoreSupLTE"` - - RankTotal int `json:"rankTotal" gqlgen:"rankTotal"` - RankTotalGT int `json:"rankTotalGT" gqlgen:"rankTotalGT"` - RankTotalGTE int `json:"rankTotalGTE" gqlgen:"rankTotalGTE"` - RankTotalLT int `json:"rankTotalLT" gqlgen:"rankTotalLT"` - RankTotalLTE int `json:"rankTotalLTE" gqlgen:"rankTotalLTE"` - ScoreTotal int `json:"scoreTotal" gqlgen:"scoreTotal"` - ScoreTotalGT int `json:"scoreTotalGT" gqlgen:"scoreTotalGT"` - ScoreTotalGTE int `json:"scoreTotalGTE" gqlgen:"scoreTotalGTE"` - ScoreTotalLT int `json:"scoreTotalLT" gqlgen:"scoreTotalLT"` - ScoreTotalLTE int `json:"scoreTotalLTE" gqlgen:"scoreTotalLTE"` -} - -func (f *OpponentsDefeatedFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { - if !isZero(f.RankAtt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank_att", alias)), f.RankAtt) - } - if !isZero(f.RankAttGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank_att", alias)), f.RankAttGT) - } - if !isZero(f.RankAttGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank_att", alias)), f.RankAttGTE) - } - if !isZero(f.RankAttLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank_att", alias)), f.RankAttLT) - } - if !isZero(f.RankAttLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank_att", alias)), f.RankAttLTE) - } - if !isZero(f.ScoreAtt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("score_att", alias)), f.ScoreAtt) - } - if !isZero(f.ScoreAttGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("score_att", alias)), f.ScoreAttGT) - } - if !isZero(f.ScoreAttGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("score_att", alias)), f.ScoreAttGTE) - } - if !isZero(f.ScoreAttLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("score_att", alias)), f.ScoreAttLT) - } - if !isZero(f.ScoreAttLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("score_att", alias)), f.ScoreAttLTE) - } - - if !isZero(f.RankDef) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank_def", alias)), f.RankDef) - } - if !isZero(f.RankDefGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank_def", alias)), f.RankDefGT) - } - if !isZero(f.RankDefGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank_def", alias)), f.RankDefGTE) - } - if !isZero(f.RankDefLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank_def", alias)), f.RankDefLT) - } - if !isZero(f.RankDefLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank_def", alias)), f.RankDefLTE) - } - if !isZero(f.ScoreDef) { - q = q.Where(buildConditionEquals(addAliasToColumnName("score_def", alias)), f.ScoreDef) - } - if !isZero(f.ScoreDefGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("score_def", alias)), f.ScoreDefGT) - } - if !isZero(f.ScoreDefGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("score_def", alias)), f.ScoreDefGTE) - } - if !isZero(f.ScoreDefLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("score_def", alias)), f.ScoreDefLT) - } - if !isZero(f.ScoreDefLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("score_def", alias)), f.ScoreDefLTE) - } - - if !isZero(f.RankSup) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank_sup", alias)), f.RankSup) - } - if !isZero(f.RankSupGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank_sup", alias)), f.RankSupGT) - } - if !isZero(f.RankSupGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank_sup", alias)), f.RankSupGTE) - } - if !isZero(f.RankSupLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank_sup", alias)), f.RankSupLT) - } - if !isZero(f.RankSupLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank_sup", alias)), f.RankSupLTE) - } - if !isZero(f.ScoreSup) { - q = q.Where(buildConditionEquals(addAliasToColumnName("score_sup", alias)), f.ScoreSup) - } - if !isZero(f.ScoreSupGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("score_sup", alias)), f.ScoreSupGT) - } - if !isZero(f.ScoreSupGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("score_sup", alias)), f.ScoreSupGTE) - } - if !isZero(f.ScoreSupLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("score_sup", alias)), f.ScoreSupLT) - } - if !isZero(f.ScoreSupLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("score_sup", alias)), f.ScoreSupLTE) - } - - if !isZero(f.RankTotal) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank_total", alias)), f.RankTotal) - } - if !isZero(f.RankTotalGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank_total", alias)), f.RankTotalGT) - } - if !isZero(f.RankTotalGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank_total", alias)), f.RankTotalGTE) - } - if !isZero(f.RankTotalLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank_total", alias)), f.RankTotalLT) - } - if !isZero(f.RankTotalLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank_total", alias)), f.RankTotalLTE) - } - if !isZero(f.ScoreTotal) { - q = q.Where(buildConditionEquals(addAliasToColumnName("score_total", alias)), f.ScoreTotal) - } - if !isZero(f.ScoreTotalGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("score_total", alias)), f.ScoreTotalGT) - } - if !isZero(f.ScoreTotalGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("score_total", alias)), f.ScoreTotalGTE) - } - if !isZero(f.ScoreTotalLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("score_total", alias)), f.ScoreTotalLT) - } - if !isZero(f.ScoreTotalLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("score_total", alias)), f.ScoreTotalLTE) - } - - return q, nil -} diff --git a/models/village.go b/models/village.go deleted file mode 100644 index a823fef..0000000 --- a/models/village.go +++ /dev/null @@ -1,232 +0,0 @@ -package models - -import ( - "fmt" - "strconv" - "strings" - - "github.com/go-pg/pg/v10" - "github.com/go-pg/pg/v10/orm" -) - -type Village struct { - tableName struct{} `pg:"?SERVER.villages,alias:village"` - - ID int `json:"id" pg:"type:bigint,pk" gqlgen:"id"` - Name string `json:"name" gqlgen:"name"` - Points int `json:"points" pg:",use_zero" gqlgen:"points"` - X int `json:"x" pg:",use_zero" gqlgen:"x"` - Y int `json:"y" pg:",use_zero" gqlgen:"y"` - Bonus int `json:"bonus" pg:",use_zero" gqlgen:"bonus"` - - PlayerID int `json:"-" pg:",use_zero" gqlgen:"playerID"` - Player *Player `json:"player,omitempty" gqlgen:"-" pg:"rel:has-one"` -} - -func (v *Village) Continent() string { - if v == nil { - return "" - } - return fmt.Sprintf("K%c%c", strconv.FormatInt(int64(v.Y), 10)[0], strconv.FormatInt(int64(v.X), 10)[0]) -} - -func (v *Village) FullName() string { - return fmt.Sprintf("%s (%d|%d) %s", - v.Name, - v.X, - v.Y, - v.Continent()) -} - -type VillageFilter struct { - ID []int `json:"id" gqlgen:"id"` - IDNEQ []int `json:"idNEQ" gqlgen:"idNEQ"` - - Name []string `json:"name" gqlgen:"name"` - NameNEQ []string `json:"nameNEQ" gqlgen:"nameNEQ"` - NameMATCH string `json:"nameMATCH" gqlgen:"nameMATCH"` - NameIEQ string `json:"nameIEQ" gqlgen:"nameIEQ"` - - XGT int `json:"xGT" gqlgen:"xGT"` - XGTE int `json:"xGTE" gqlgen:"xGTE"` - XLT int `json:"xLT" gqlgen:"xLT"` - XLTE int `json:"xLTE" gqlgen:"xLTE"` - YGT int `json:"yGT" gqlgen:"yGT"` - YGTE int `json:"yGTE" gqlgen:"yGTE"` - YLT int `json:"yLT" gqlgen:"yLT"` - YLTE int `json:"yLTE" gqlgen:"yLTE"` - XY []string `json:"xy" gqlgen:"xy"` - - Points int `json:"points" gqlgen:"points"` - PointsGT int `json:"pointsGT" gqlgen:"pointsGT"` - PointsGTE int `json:"pointsGTE" gqlgen:"pointsGTE"` - PointsLT int `json:"pointsLT" gqlgen:"pointsLT"` - PointsLTE int `json:"pointsLTE" gqlgen:"pointsLTE"` - - Bonus int `json:"bonus" gqlgen:"bonus"` - BonusGT int `json:"bonusGT" gqlgen:"bonusGT"` - BonusGTE int `json:"bonusGTE" gqlgen:"bonusGTE"` - BonusLT int `json:"bonusLT" gqlgen:"bonusLT"` - BonusLTE int `json:"bonusLTE" gqlgen:"bonusLTE"` - - PlayerID []int `json:"playerID" gqlgen:"playerID"` - PlayerIDNEQ []int `json:"playerIDNEQ" gqlgen:"playerIDNEQ"` - PlayerFilter *PlayerFilter `json:"playerFilter" gqlgen:"playerFilter"` -} - -func (f *VillageFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { - if !isZero(f.ID) { - q = q.Where(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID)) - } - if !isZero(f.IDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) - } - - if !isZero(f.Name) { - q = q.Where(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name)) - } - if !isZero(f.NameNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) - } - if !isZero(f.NameMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("name", alias)), f.NameMATCH) - } - if !isZero(f.NameIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ) - } - - if !isZero(f.XGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("x", alias)), f.XGT) - } - if !isZero(f.XGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("x", alias)), f.XGTE) - } - if !isZero(f.XLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("x", alias)), f.XLT) - } - if !isZero(f.XLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("x", alias)), f.XLTE) - } - - if !isZero(f.YGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("y", alias)), f.YGT) - } - if !isZero(f.YGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("y", alias)), f.YGTE) - } - if !isZero(f.YLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("y", alias)), f.YLT) - } - if !isZero(f.YLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("y", alias)), f.YLTE) - } - - if !isZero(f.XY) { - q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { - for _, xy := range f.XY { - splitted := strings.Split(xy, "|") - if len(splitted) != 2 { - continue - } - x, err := strconv.Atoi(splitted[0]) - if err != nil { - continue - } - y, err := strconv.Atoi(splitted[1]) - if err != nil { - continue - } - q = q.WhereOrGroup(func(q *orm.Query) (*orm.Query, error) { - q = q.Where("x = ?", x) - q = q.Where("y = ?", y) - return q, nil - }) - } - return q, nil - }) - } - - if !isZero(f.Points) { - q = q.Where(buildConditionEquals(addAliasToColumnName("points", alias)), f.Points) - } - if !isZero(f.PointsGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("points", alias)), f.PointsGT) - } - if !isZero(f.PointsGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("points", alias)), f.PointsGTE) - } - if !isZero(f.PointsLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("points", alias)), f.PointsLT) - } - if !isZero(f.PointsLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("points", alias)), f.PointsLTE) - } - - if !isZero(f.Bonus) { - q = q.Where(buildConditionEquals(addAliasToColumnName("bonus", alias)), f.Bonus) - } - if !isZero(f.BonusGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("bonus", alias)), f.BonusGT) - } - if !isZero(f.BonusGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("bonus", alias)), f.BonusGTE) - } - if !isZero(f.BonusLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("bonus", alias)), f.BonusLT) - } - if !isZero(f.BonusLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("bonus", alias)), f.BonusLTE) - } - - if !isZero(f.PlayerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) - } - if !isZero(f.PlayerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerIDNEQ)) - } - - return q, nil -} - -func (f *VillageFilter) Where(q *orm.Query) (*orm.Query, error) { - return f.WhereWithAlias(q, "village") -} - -type VillageRelationshipAndSortAppender struct { - Filter *VillageFilter - Sort []string -} - -func (a *VillageRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - playerRequired := findStringWithPrefix(a.Sort, "player.") != "" - playerTribeRequired := findStringWithPrefix(a.Sort, "player.tribe.") != "" - if a.Filter.PlayerFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "player") - if err != nil { - return q, err - } - playerRequired = true - if a.Filter.PlayerFilter.TribeFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - playerTribeRequired = true - } - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if playerRequired { - q = q.Relation("Player._") - } - - if playerTribeRequired { - q = q.Join("LEFT JOIN ?SERVER.tribes AS tribe ON tribe.id = player.tribe_id") - } - - return q, nil -} diff --git a/tw/twdataloader/endpoints.go b/tw/twdataloader/endpoints.go new file mode 100644 index 0000000..d06f771 --- /dev/null +++ b/tw/twdataloader/endpoints.go @@ -0,0 +1,31 @@ +package twdataloader + +const ( + EndpointConfig = "/interface.php?func=get_config" + EndpointUnitConfig = "/interface.php?func=get_unit_info" + EndpointBuildingConfig = "/interface.php?func=get_building_info" + EndpointPlayer = "/map/player.txt.gz" + EndpointPlayerNotGzipped = "/map/player.txt" + EndpointTribe = "/map/ally.txt.gz" + EndpointTribeNotGzipped = "/map/ally.txt" + EndpointVillage = "/map/village.txt.gz" + EndpointVillageNotGzipped = "/map/village.txt" + EndpointKillAtt = "/map/kill_att.txt.gz" + EndpointKillAttNotGzipped = "/map/kill_att.txt" + EndpointKillDef = "/map/kill_def.txt.gz" + EndpointKillDefNotGzipped = "/map/kill_def.txt" + EndpointKillSup = "/map/kill_sup.txt.gz" + EndpointKillSupNotGzipped = "/map/kill_sup.txt" + EndpointKillAll = "/map/kill_all.txt.gz" + EndpointKillAllNotGzipped = "/map/kill_all.txt" + EndpointKillAttTribe = "/map/kill_att_tribe.txt.gz" + EndpointKillAttTribeNotGzipped = "/map/kill_att_tribe.txt" + EndpointKillDefTribe = "/map/kill_def_tribe.txt.gz" + EndpointKillDefTribeNotGzipped = "/map/kill_def_tribe.txt" + EndpointKillAllTribe = "/map/kill_all_tribe.txt.gz" + EndpointKillAllTribeNotGzipped = "/map/kill_all_tribe.txt" + EndpointConquer = "/map/conquer.txt.gz" + EndpointConquerNotGzipped = "/map/conquer.txt" + EndpointGetConquer = "/interface.php?func=get_conquer&since=%d" + EndpointGetServers = "/backend/get_servers.php" +) diff --git a/tw/twdataloader/helpers.go b/tw/twdataloader/helpers.go new file mode 100644 index 0000000..4f616af --- /dev/null +++ b/tw/twdataloader/helpers.go @@ -0,0 +1,12 @@ +package twdataloader + +import ( + "net/http" + "time" +) + +func getDefaultHTTPClient() *http.Client { + return &http.Client{ + Timeout: 5 * time.Second, + } +} diff --git a/tw/dataloader/dataloader.go b/tw/twdataloader/server_data_loader.go similarity index 56% rename from tw/dataloader/dataloader.go rename to tw/twdataloader/server_data_loader.go index c35f7f4..c5729e2 100644 --- a/tw/dataloader/dataloader.go +++ b/tw/twdataloader/server_data_loader.go @@ -1,4 +1,4 @@ -package dataloader +package twdataloader import ( "compress/gzip" @@ -14,69 +14,43 @@ import ( "time" "github.com/pkg/errors" - "github.com/tribalwarshelp/shared/models" + + "github.com/tribalwarshelp/shared/tw/twmodel" ) -const ( - EndpointConfig = "/interface.php?func=get_config" - EndpointUnitConfig = "/interface.php?func=get_unit_info" - EndpointBuildingConfig = "/interface.php?func=get_building_info" - EndpointPlayer = "/map/player.txt.gz" - EndpointPlayerNotGzipped = "/map/player.txt" - EndpointTribe = "/map/ally.txt.gz" - EndpointTribeNotGzipped = "/map/ally.txt" - EndpointVillage = "/map/village.txt.gz" - EndpointVillageNotGzipped = "/map/village.txt" - EndpointKillAtt = "/map/kill_att.txt.gz" - EndpointKillAttNotGzipped = "/map/kill_att.txt" - EndpointKillDef = "/map/kill_def.txt.gz" - EndpointKillDefNotGzipped = "/map/kill_def.txt" - EndpointKillSup = "/map/kill_sup.txt.gz" - EndpointKillSupNotGzipped = "/map/kill_sup.txt" - EndpointKillAll = "/map/kill_all.txt.gz" - EndpointKillAllNotGzipped = "/map/kill_all.txt" - EndpointKillAttTribe = "/map/kill_att_tribe.txt.gz" - EndpointKillAttTribeNotGzipped = "/map/kill_att_tribe.txt" - EndpointKillDefTribe = "/map/kill_def_tribe.txt.gz" - EndpointKillDefTribeNotGzipped = "/map/kill_def_tribe.txt" - EndpointKillAllTribe = "/map/kill_all_tribe.txt.gz" - EndpointKillAllTribeNotGzipped = "/map/kill_all_tribe.txt" - EndpointConquer = "/map/conquer.txt.gz" - EndpointConquerNotGzipped = "/map/conquer.txt" - EndpointGetConquer = "/interface.php?func=get_conquer&since=%d" -) - -type DataLoader interface { - LoadOD(tribe bool) (map[int]*models.OpponentsDefeated, error) - LoadPlayers() ([]*models.Player, error) - LoadTribes() ([]*models.Tribe, error) - LoadVillages() ([]*models.Village, error) - LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*models.Ennoblement, error) - GetConfig() (*models.ServerConfig, error) - GetBuildingConfig() (*models.BuildingConfig, error) - GetUnitConfig() (*models.UnitConfig, error) -} - -type Config struct { +type ServerDataLoaderConfig struct { BaseURL string Client *http.Client } -type dataLoader struct { +func (cfg *ServerDataLoaderConfig) Init() { + if cfg.Client == nil { + cfg.Client = getDefaultHTTPClient() + } +} + +type ServerDataLoader interface { + LoadOD(tribe bool) (map[int]*twmodel.OpponentsDefeated, error) + LoadPlayers() ([]*twmodel.Player, error) + LoadTribes() ([]*twmodel.Tribe, error) + LoadVillages() ([]*twmodel.Village, error) + LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*twmodel.Ennoblement, error) + GetConfig() (*twmodel.ServerConfig, error) + GetBuildingConfig() (*twmodel.BuildingConfig, error) + GetUnitConfig() (*twmodel.UnitConfig, error) +} + +type serverDataLoader struct { baseURL string client *http.Client } -func New(cfg *Config) DataLoader { +func NewServerDataLoader(cfg *ServerDataLoaderConfig) ServerDataLoader { if cfg == nil { - cfg = &Config{} + cfg = &ServerDataLoaderConfig{} } - if cfg.Client == nil { - cfg.Client = &http.Client{ - Timeout: 5 * time.Second, - } - } - return &dataLoader{ + cfg.Init() + return &serverDataLoader{ cfg.BaseURL, cfg.Client, } @@ -88,9 +62,9 @@ type parsedODLine struct { Score int } -func (d *dataLoader) parseODLine(line []string) (*parsedODLine, error) { +func (d *serverDataLoader) parseODLine(line []string) (*parsedODLine, error) { if len(line) != 3 { - return nil, fmt.Errorf("Invalid line format (should be rank,id,score)") + return nil, errors.New("invalid line format (should be rank,id,score)") } p := &parsedODLine{} var err error @@ -109,53 +83,53 @@ func (d *dataLoader) parseODLine(line []string) (*parsedODLine, error) { return p, nil } -func (d *dataLoader) LoadOD(tribe bool) (map[int]*models.OpponentsDefeated, error) { - m := make(map[int]*models.OpponentsDefeated) - urls := []string{ +func (d *serverDataLoader) LoadOD(tribe bool) (map[int]*twmodel.OpponentsDefeated, error) { + m := make(map[int]*twmodel.OpponentsDefeated) + formattedURLs := []string{ fmt.Sprintf("%s%s", d.baseURL, EndpointKillAll), fmt.Sprintf("%s%s", d.baseURL, EndpointKillAtt), fmt.Sprintf("%s%s", d.baseURL, EndpointKillDef), fmt.Sprintf("%s%s", d.baseURL, EndpointKillSup), } if tribe { - urls = []string{ + formattedURLs = []string{ fmt.Sprintf("%s%s", d.baseURL, EndpointKillAllTribe), fmt.Sprintf("%s%s", d.baseURL, EndpointKillAttTribe), fmt.Sprintf("%s%s", d.baseURL, EndpointKillDefTribe), "", } } - for _, url := range urls { - if url == "" { + for _, formattedURL := range formattedURLs { + if formattedURL == "" { continue } - lines, err := d.getCSVData(url, true) + lines, err := d.getCSVData(formattedURL, true) if err != nil { //fallback to not gzipped file - lines, err = d.getCSVData(strings.ReplaceAll(url, ".gz", ""), false) + lines, err = d.getCSVData(strings.ReplaceAll(formattedURL, ".gz", ""), false) if err != nil { - return nil, errors.Wrapf(err, "cannot get data, url %s", url) + return nil, errors.Wrapf(err, "couldn't load data, formattedURL %s", formattedURL) } } for _, line := range lines { parsed, err := d.parseODLine(line) if err != nil { - return nil, errors.Wrapf(err, "cannot parse line, url %s, line %s", url, strings.Join(line, ",")) + return nil, errors.Wrapf(err, "couldn't parse the line, url %s, line %s", formattedURL, strings.Join(line, ",")) } if _, ok := m[parsed.ID]; !ok { - m[parsed.ID] = &models.OpponentsDefeated{} + m[parsed.ID] = &twmodel.OpponentsDefeated{} } - switch url { - case urls[0]: + switch formattedURL { + case formattedURLs[0]: m[parsed.ID].RankTotal = parsed.Rank m[parsed.ID].ScoreTotal = parsed.Score - case urls[1]: + case formattedURLs[1]: m[parsed.ID].RankAtt = parsed.Rank m[parsed.ID].ScoreAtt = parsed.Score - case urls[2]: + case formattedURLs[2]: m[parsed.ID].RankDef = parsed.Rank m[parsed.ID].ScoreDef = parsed.Score - case urls[3]: + case formattedURLs[3]: m[parsed.ID].RankSup = parsed.Rank m[parsed.ID].ScoreSup = parsed.Score } @@ -164,14 +138,14 @@ func (d *dataLoader) LoadOD(tribe bool) (map[int]*models.OpponentsDefeated, erro return m, nil } -func (d *dataLoader) parsePlayerLine(line []string) (*models.Player, error) { +func (d *serverDataLoader) parsePlayerLine(line []string) (*twmodel.Player, error) { if len(line) != 6 { - return nil, fmt.Errorf("Invalid line format (should be id,name,tribeid,villages,points,rank)") + return nil, errors.New("Invalid line format (should be id,name,tribeid,villages,points,rank)") } var err error ex := true - player := &models.Player{ + player := &twmodel.Player{ Exists: &ex, } player.ID, err = strconv.Atoi(line[0]) @@ -202,21 +176,21 @@ func (d *dataLoader) parsePlayerLine(line []string) (*models.Player, error) { return player, nil } -func (d *dataLoader) LoadPlayers() ([]*models.Player, error) { - url := d.baseURL + EndpointPlayer - lines, err := d.getCSVData(url, true) +func (d *serverDataLoader) LoadPlayers() ([]*twmodel.Player, error) { + formattedURL := d.baseURL + EndpointPlayer + lines, err := d.getCSVData(formattedURL, true) if err != nil { lines, err = d.getCSVData(d.baseURL+EndpointPlayerNotGzipped, false) if err != nil { - return nil, errors.Wrapf(err, "cannot get data, url %s", url) + return nil, errors.Wrapf(err, "couldn't load data, url %s", formattedURL) } } - players := []*models.Player{} + var players []*twmodel.Player for _, line := range lines { player, err := d.parsePlayerLine(line) if err != nil { - return nil, errors.Wrapf(err, "cannot parse line, url %s, line %s", url, strings.Join(line, ",")) + return nil, errors.Wrapf(err, "couldn't parse the line, url %s, line %s", formattedURL, strings.Join(line, ",")) } players = append(players, player) } @@ -224,14 +198,14 @@ func (d *dataLoader) LoadPlayers() ([]*models.Player, error) { return players, nil } -func (d *dataLoader) parseTribeLine(line []string) (*models.Tribe, error) { +func (d *serverDataLoader) parseTribeLine(line []string) (*twmodel.Tribe, error) { if len(line) != 8 { - return nil, fmt.Errorf("Invalid line format (should be id,name,tag,members,villages,points,allpoints,rank)") + return nil, errors.New("invalid line format (should be id,name,tag,members,villages,points,allpoints,rank)") } var err error ex := true - tribe := &models.Tribe{ + tribe := &twmodel.Tribe{ Exists: &ex, } tribe.ID, err = strconv.Atoi(line[0]) @@ -270,32 +244,32 @@ func (d *dataLoader) parseTribeLine(line []string) (*models.Tribe, error) { return tribe, nil } -func (d *dataLoader) LoadTribes() ([]*models.Tribe, error) { - url := d.baseURL + EndpointTribe - lines, err := d.getCSVData(url, true) +func (d *serverDataLoader) LoadTribes() ([]*twmodel.Tribe, error) { + formattedURL := d.baseURL + EndpointTribe + lines, err := d.getCSVData(formattedURL, true) if err != nil { lines, err = d.getCSVData(d.baseURL+EndpointTribeNotGzipped, false) if err != nil { - return nil, errors.Wrapf(err, "cannot to get data, url %s", url) + return nil, errors.Wrapf(err, "cannot to get data, url %s", formattedURL) } } - tribes := []*models.Tribe{} + var tribes []*twmodel.Tribe for _, line := range lines { tribe, err := d.parseTribeLine(line) if err != nil { - return nil, errors.Wrapf(err, "cannot parse line, url %s, line %s", url, strings.Join(line, ",")) + return nil, errors.Wrapf(err, "couldn't parse the line, url %s, line %s", formattedURL, strings.Join(line, ",")) } tribes = append(tribes, tribe) } return tribes, nil } -func (d *dataLoader) parseVillageLine(line []string) (*models.Village, error) { +func (d *serverDataLoader) parseVillageLine(line []string) (*twmodel.Village, error) { if len(line) != 7 { - return nil, fmt.Errorf("Invalid line format (should be id,name,x,y,playerID,points,bonus)") + return nil, errors.New("invalid line format (should be id,name,x,y,playerID,points,bonus)") } var err error - village := &models.Village{} + village := &twmodel.Village{} village.ID, err = strconv.Atoi(line[0]) if err != nil { return nil, errors.Wrap(err, "village.ID") @@ -327,32 +301,32 @@ func (d *dataLoader) parseVillageLine(line []string) (*models.Village, error) { return village, nil } -func (d *dataLoader) LoadVillages() ([]*models.Village, error) { - url := d.baseURL + EndpointVillage - lines, err := d.getCSVData(url, true) +func (d *serverDataLoader) LoadVillages() ([]*twmodel.Village, error) { + formattedURL := d.baseURL + EndpointVillage + lines, err := d.getCSVData(formattedURL, true) if err != nil { lines, err = d.getCSVData(d.baseURL+EndpointVillageNotGzipped, false) if err != nil { - return nil, errors.Wrapf(err, "cannot get data, url %s", url) + return nil, errors.Wrapf(err, "couldn't load data, formattedURL %s", formattedURL) } } - villages := []*models.Village{} + var villages []*twmodel.Village for _, line := range lines { village, err := d.parseVillageLine(line) if err != nil { - return nil, errors.Wrapf(err, "cannot parse line, url %s, line %s", url, strings.Join(line, ",")) + return nil, errors.Wrapf(err, "couldn't parse the line, formattedURL %s, line %s", formattedURL, strings.Join(line, ",")) } villages = append(villages, village) } return villages, nil } -func (d *dataLoader) parseEnnoblementLine(line []string) (*models.Ennoblement, error) { +func (d *serverDataLoader) parseEnnoblementLine(line []string) (*twmodel.Ennoblement, error) { if len(line) != 4 { - return nil, fmt.Errorf("Invalid line format (should be village_id,timestamp,new_owner_id,old_owner_id)") + return nil, errors.New("invalid line format (should be village_id,timestamp,new_owner_id,old_owner_id)") } var err error - ennoblement := &models.Ennoblement{} + ennoblement := &twmodel.Ennoblement{} ennoblement.VillageID, err = strconv.Atoi(line[0]) if err != nil { return nil, errors.Wrap(err, "ennoblement.VillageID") @@ -378,30 +352,30 @@ type LoadEnnoblementsConfig struct { EnnobledAtGT time.Time } -func (d *dataLoader) LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*models.Ennoblement, error) { +func (d *serverDataLoader) LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*twmodel.Ennoblement, error) { if cfg == nil { cfg = &LoadEnnoblementsConfig{} } yesterdaysDate := time.Now().Add(-23 * time.Hour) - url := d.baseURL + EndpointConquer + formattedURL := d.baseURL + EndpointConquer compressed := true if cfg.EnnobledAtGT.After(yesterdaysDate) || cfg.EnnobledAtGT.Equal(yesterdaysDate) { - url = d.baseURL + fmt.Sprintf(EndpointGetConquer, cfg.EnnobledAtGT.Unix()) + formattedURL = d.baseURL + fmt.Sprintf(EndpointGetConquer, cfg.EnnobledAtGT.Unix()) compressed = false } - lines, err := d.getCSVData(url, compressed) + lines, err := d.getCSVData(formattedURL, compressed) if err != nil && compressed { lines, err = d.getCSVData(d.baseURL+EndpointConquerNotGzipped, false) } if err != nil { - return nil, errors.Wrapf(err, "cannot get data, url %s", url) + return nil, errors.Wrapf(err, "couldn't load data, formattedURL %s", formattedURL) } - ennoblements := []*models.Ennoblement{} + var ennoblements []*twmodel.Ennoblement for _, line := range lines { ennoblement, err := d.parseEnnoblementLine(line) if err != nil { - return nil, errors.Wrapf(err, "cannot parse line, url %s, line %s", url, strings.Join(line, ",")) + return nil, errors.Wrapf(err, "couldn't parse the line, formattedURL %s, line %s", formattedURL, strings.Join(line, ",")) } if ennoblement.EnnobledAt.After(cfg.EnnobledAtGT) { ennoblements = append(ennoblements, ennoblement) @@ -410,37 +384,37 @@ func (d *dataLoader) LoadEnnoblements(cfg *LoadEnnoblementsConfig) ([]*models.En return ennoblements, nil } -func (d *dataLoader) GetConfig() (*models.ServerConfig, error) { - url := d.baseURL + EndpointConfig - cfg := &models.ServerConfig{} - err := d.getXML(url, cfg) +func (d *serverDataLoader) GetConfig() (*twmodel.ServerConfig, error) { + formattedURL := d.baseURL + EndpointConfig + cfg := &twmodel.ServerConfig{} + err := d.getXML(formattedURL, cfg) if err != nil { return nil, errors.Wrap(err, "getConfig") } return cfg, nil } -func (d *dataLoader) GetBuildingConfig() (*models.BuildingConfig, error) { - url := d.baseURL + EndpointBuildingConfig - cfg := &models.BuildingConfig{} - err := d.getXML(url, cfg) +func (d *serverDataLoader) GetBuildingConfig() (*twmodel.BuildingConfig, error) { + formattedURL := d.baseURL + EndpointBuildingConfig + cfg := &twmodel.BuildingConfig{} + err := d.getXML(formattedURL, cfg) if err != nil { return nil, errors.Wrap(err, "getBuildingConfig") } return cfg, nil } -func (d *dataLoader) GetUnitConfig() (*models.UnitConfig, error) { - url := d.baseURL + EndpointUnitConfig - cfg := &models.UnitConfig{} - err := d.getXML(url, cfg) +func (d *serverDataLoader) GetUnitConfig() (*twmodel.UnitConfig, error) { + formattedURL := d.baseURL + EndpointUnitConfig + cfg := &twmodel.UnitConfig{} + err := d.getXML(formattedURL, cfg) if err != nil { return nil, errors.Wrap(err, "getUnitConfig") } return cfg, nil } -func (d *dataLoader) getCSVData(url string, compressed bool) ([][]string, error) { +func (d *serverDataLoader) getCSVData(url string, compressed bool) ([][]string, error) { resp, err := d.client.Get(url) if err != nil { return nil, err @@ -452,7 +426,7 @@ func (d *dataLoader) getCSVData(url string, compressed bool) ([][]string, error) return uncompressAndReadCsvLines(resp.Body) } -func (d *dataLoader) getXML(url string, decode interface{}) error { +func (d *serverDataLoader) getXML(url string, decode interface{}) error { resp, err := d.client.Get(url) if err != nil { return err diff --git a/tw/twdataloader/version_data_loader.go b/tw/twdataloader/version_data_loader.go new file mode 100644 index 0000000..ee3e1fd --- /dev/null +++ b/tw/twdataloader/version_data_loader.go @@ -0,0 +1,75 @@ +package twdataloader + +import ( + "fmt" + phpserialize "github.com/Kichiyaki/go-php-serialize" + "github.com/pkg/errors" + "io/ioutil" + "net/http" +) + +type Server struct { + Key string + URL string +} + +type VersionDataLoaderConfig struct { + Host string + Client *http.Client +} + +func (cfg *VersionDataLoaderConfig) Init() { + if cfg.Client == nil { + cfg.Client = getDefaultHTTPClient() + } +} + +type VersionDataLoader interface { + LoadServers() ([]*Server, error) +} + +type versionDataLoader struct { + host string + client *http.Client +} + +func NewVersionDataLoader(cfg *VersionDataLoaderConfig) VersionDataLoader { + if cfg == nil { + cfg = &VersionDataLoaderConfig{} + } + cfg.Init() + return &versionDataLoader{ + host: cfg.Host, + client: cfg.Client, + } +} + +func (d *versionDataLoader) LoadServers() ([]*Server, error) { + resp, err := d.client.Get(fmt.Sprintf("https://%s%s", d.host, EndpointGetServers)) + if err != nil { + return nil, errors.Wrap(err, "couldn't load servers") + } + defer resp.Body.Close() + + bodyBytes, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, errors.Wrap(err, "couldn't read the response body") + } + body, err := phpserialize.Decode(string(bodyBytes)) + if err != nil { + return nil, errors.Wrap(err, "couldn't decode the response body into the go value") + } + + var servers []*Server + for serverKey, url := range body.(map[interface{}]interface{}) { + serverKeyStr := serverKey.(string) + urlStr := url.(string) + if serverKeyStr != "" && urlStr != "" { + servers = append(servers, &Server{ + Key: serverKeyStr, + URL: urlStr, + }) + } + } + return servers, nil +} diff --git a/models/building_config.go b/tw/twmodel/building_config.go similarity index 99% rename from models/building_config.go rename to tw/twmodel/building_config.go index fb409dc..daa93c2 100644 --- a/models/building_config.go +++ b/tw/twmodel/building_config.go @@ -1,4 +1,4 @@ -package models +package twmodel import "encoding/xml" diff --git a/tw/twmodel/coords.go b/tw/twmodel/coords.go new file mode 100644 index 0000000..f1e32d4 --- /dev/null +++ b/tw/twmodel/coords.go @@ -0,0 +1,30 @@ +package twmodel + +import ( + "github.com/pkg/errors" + "strconv" + "strings" +) + +const CoordsSeparator = "|" + +type Coords struct { + X int + Y int +} + +func ParseCoords(coords string) (*Coords, error) { + parts := strings.Split(coords, CoordsSeparator) + if len(parts) != 2 { + return nil, errors.Errorf("%s: invalid format (should be number|number)", coords) + } + x, err := strconv.Atoi(parts[0]) + if err != nil { + return nil, errors.Wrapf(err, "%s: the part before | isn't a number", coords) + } + y, err := strconv.Atoi(parts[1]) + if err != nil { + return nil, errors.Wrapf(err, "%s: the part after | isn't a number", coords) + } + return &Coords{x, y}, nil +} diff --git a/models/daily_player_stats.go b/tw/twmodel/daily_player_stats.go similarity index 56% rename from models/daily_player_stats.go rename to tw/twmodel/daily_player_stats.go index 82c3979..ceaf890 100644 --- a/models/daily_player_stats.go +++ b/tw/twmodel/daily_player_stats.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -34,27 +35,31 @@ type DailyPlayerStatsFilter struct { } func (f *DailyPlayerStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLTE) } if !isZero(f.PlayerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerID)) } if !isZero(f.PlayerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerIDNEQ)) } return q, nil @@ -64,41 +69,29 @@ func (f *DailyPlayerStatsFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "daily_player_stats") } -type DailyPlayerStatsRelationshipAndSortAppender struct { - Filter *DailyPlayerStatsFilter - Sort []string -} +func (f *DailyPlayerStatsFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } -func (a *DailyPlayerStatsRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - playerRequired := findStringWithPrefix(a.Sort, "player.") != "" - playerTribeRequired := findStringWithPrefix(a.Sort, "player.tribe.") != "" - if a.Filter.PlayerFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "player") - if err != nil { - return q, err - } - playerRequired = true - if a.Filter.PlayerFilter.TribeFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - playerTribeRequired = true + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "daily_player_stats", + }, + } + if f.PlayerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter, + relationName: "Player", + }) + if f.PlayerFilter.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter.TribeFilter, + relationName: "Player.Tribe", + }) } } - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if playerRequired { - q = q.Relation("Player._") - } - - if playerTribeRequired { - q = q.Join("LEFT JOIN ?SERVER.tribes AS tribe ON tribe.id = player.tribe_id") - } - - return q, nil + return appendFilters(q, filtersToAppend...) } diff --git a/models/daily_tribe_stats.go b/tw/twmodel/daily_tribe_stats.go similarity index 63% rename from models/daily_tribe_stats.go rename to tw/twmodel/daily_tribe_stats.go index eca35ea..9726b5c 100644 --- a/models/daily_tribe_stats.go +++ b/tw/twmodel/daily_tribe_stats.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -37,27 +38,31 @@ type DailyTribeStatsFilter struct { } func (f *DailyTribeStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLTE) } if !isZero(f.TribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("tribe_id", alias), pg.Array(f.TribeID)) } if !isZero(f.TribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("tribe_id", alias), pg.Array(f.TribeIDNEQ)) } return q, nil @@ -67,29 +72,23 @@ func (f *DailyTribeStatsFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "daily_tribe_stats") } -type DailyTribeStatsRelationshipAndSortAppender struct { - Filter *DailyTribeStatsFilter - Sort []string -} - -func (a *DailyTribeStatsRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - tribeRequired := findStringWithPrefix(a.Sort, "tribe.") != "" - if a.Filter.TribeFilter != nil { - q, err = a.Filter.TribeFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - tribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if tribeRequired { - q = q.Relation("Tribe._") - } - - return q, nil +func (f *DailyTribeStatsFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "daily_tribe_stats", + }, + } + if f.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.TribeFilter, + relationName: "Tribe", + }) + } + + return appendFilters(q, filtersToAppend...) } diff --git a/models/ennoblement.go b/tw/twmodel/ennoblement.go similarity index 54% rename from models/ennoblement.go rename to tw/twmodel/ennoblement.go index 30514c9..58b5240 100644 --- a/models/ennoblement.go +++ b/tw/twmodel/ennoblement.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -32,21 +33,23 @@ type EnnoblementFilterOr struct { } func (f *EnnoblementFilterOr) WhereWithAlias(q *orm.Query, alias string) *orm.Query { - q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { - if !isZero(f.NewOwnerID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerID)) - } - if !isZero(f.NewOwnerTribeID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeID)) - } - if !isZero(f.OldOwnerID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerID)) - } - if !isZero(f.OldOwnerTribeID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeID)) - } - return q, nil - }) + if f != nil { + q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + if !isZero(f.NewOwnerID) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("new_owner_id", alias), pg.Array(f.NewOwnerID)) + } + if !isZero(f.NewOwnerTribeID) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("new_owner_tribe_id", alias), pg.Array(f.NewOwnerTribeID)) + } + if !isZero(f.OldOwnerID) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("old_owner_id", alias), pg.Array(f.OldOwnerID)) + } + if !isZero(f.OldOwnerTribeID) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("old_owner_tribe_id", alias), pg.Array(f.OldOwnerTribeID)) + } + return q, nil + }) + } return q } @@ -79,53 +82,57 @@ type EnnoblementFilter struct { } func (f *EnnoblementFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.EnnobledAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAt) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("ennobled_at", alias), f.EnnobledAt) } if !isZero(f.EnnobledAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAtGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("ennobled_at", alias), f.EnnobledAtGT) } if !isZero(f.EnnobledAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAtGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("ennobled_at", alias), f.EnnobledAtGTE) } if !isZero(f.EnnobledAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAtLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("ennobled_at", alias), f.EnnobledAtLT) } if !isZero(f.EnnobledAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("ennobled_at", alias)), f.EnnobledAtLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("ennobled_at", alias), f.EnnobledAtLTE) } if !isZero(f.VillageID) { - q = q.Where(buildConditionArray(addAliasToColumnName("village_id", alias)), pg.Array(f.VillageID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("village_id", alias), pg.Array(f.VillageID)) } if !isZero(f.VillageIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("village_id", alias)), pg.Array(f.VillageIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("village_id", alias), pg.Array(f.VillageIDNEQ)) } if !isZero(f.NewOwnerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("new_owner_id", alias), pg.Array(f.NewOwnerID)) } if !isZero(f.NewOwnerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("new_owner_id", alias)), pg.Array(f.NewOwnerIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("new_owner_id", alias), pg.Array(f.NewOwnerIDNEQ)) } if !isZero(f.NewOwnerTribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("new_owner_tribe_id", alias), pg.Array(f.NewOwnerTribeID)) } if !isZero(f.NewOwnerTribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("new_owner_tribe_id", alias)), pg.Array(f.NewOwnerTribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("new_owner_tribe_id", alias), pg.Array(f.NewOwnerTribeIDNEQ)) } if !isZero(f.OldOwnerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("old_owner_id", alias), pg.Array(f.OldOwnerID)) } if !isZero(f.OldOwnerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("old_owner_id", alias)), pg.Array(f.OldOwnerIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("old_owner_id", alias), pg.Array(f.OldOwnerIDNEQ)) } if !isZero(f.OldOwnerTribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("old_owner_tribe_id", alias), pg.Array(f.OldOwnerTribeID)) } if !isZero(f.OldOwnerTribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("old_owner_tribe_id", alias)), pg.Array(f.OldOwnerTribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("old_owner_tribe_id", alias), pg.Array(f.OldOwnerTribeIDNEQ)) } if f.Or != nil { @@ -139,75 +146,47 @@ func (f *EnnoblementFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "ennoblement") } -type EnnoblementRelationshipAndSortAppender struct { - Filter *EnnoblementFilter - Sort []string -} - -func (a *EnnoblementRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - villageRequired := findStringWithPrefix(a.Sort, "village.") != "" - if a.Filter.VillageFilter != nil { - q, err = a.Filter.VillageFilter.WhereWithAlias(q, "village") - if err != nil { - return q, err - } - villageRequired = true - } - - oldOwnerRequired := findStringWithPrefix(a.Sort, "old_owner.") != "" - if a.Filter.OldOwnerFilter != nil { - q, err = a.Filter.OldOwnerFilter.WhereWithAlias(q, "old_owner") - if err != nil { - return q, err - } - oldOwnerRequired = true - } - oldOwnerTribeRequired := findStringWithPrefix(a.Sort, "old_owner_tribe.") != "" - if a.Filter.OldOwnerTribeFilter != nil { - q, err = a.Filter.OldOwnerTribeFilter.WhereWithAlias(q, "old_owner_tribe") - if err != nil { - return q, err - } - oldOwnerTribeRequired = true - } - - newOwnerRequired := findStringWithPrefix(a.Sort, "new_owner.") != "" - if a.Filter.NewOwnerFilter != nil { - q, err = a.Filter.NewOwnerFilter.WhereWithAlias(q, "new_owner") - if err != nil { - return q, err - } - newOwnerRequired = true - } - newOwnerTribeRequired := findStringWithPrefix(a.Sort, "new_owner_tribe.") != "" - if a.Filter.NewOwnerTribeFilter != nil { - q, err = a.Filter.NewOwnerTribeFilter.WhereWithAlias(q, "new_owner_tribe") - if err != nil { - return q, err - } - newOwnerTribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if villageRequired { - q = q.Relation("Village._") - } - if oldOwnerRequired { - q = q.Relation("OldOwner._") - } - if oldOwnerTribeRequired { - q = q.Relation("OldOwnerTribe._") - } - if newOwnerRequired { - q = q.Relation("NewOwner._") - } - if newOwnerTribeRequired { - q = q.Relation("NewOwnerTribe._") - } - - return q, nil +func (f *EnnoblementFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "ennoblement", + }, + } + if f.VillageFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.VillageFilter, + relationName: "Village", + }) + } + if f.OldOwnerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.OldOwnerFilter, + relationName: "OldOwner", + }) + } + if f.OldOwnerTribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.OldOwnerTribeFilter, + relationName: "OldOwnerTribe", + }) + } + if f.NewOwnerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.NewOwnerFilter, + relationName: "NewOwner", + }) + } + if f.NewOwnerTribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.NewOwnerTribeFilter, + relationName: "NewOwnerTribe", + }) + } + + return appendFilters(q, filtersToAppend...) } diff --git a/tw/twmodel/helpers.go b/tw/twmodel/helpers.go new file mode 100644 index 0000000..368163a --- /dev/null +++ b/tw/twmodel/helpers.go @@ -0,0 +1,49 @@ +package twmodel + +import ( + "github.com/Kichiyaki/gopgutil/v10" + "github.com/go-pg/pg/v10/orm" + "github.com/pkg/errors" + "reflect" +) + +func isZero(v interface{}) bool { + return reflect.ValueOf(v).IsZero() +} + +type filter interface { + WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) +} + +type filterToAppend struct { + filter filter + alias string + relationName string +} + +func appendFilters(q *orm.Query, filtersToAppend ...filterToAppend) (*orm.Query, error) { + tableModel := q.TableModel() + var err error + for _, f := range filtersToAppend { + if f.relationName != "" && tableModel != nil { + alias, err := gopgutil.BuildAliasFromRelationName(tableModel, f.relationName) + if err != nil { + return q, errors.Wrapf(err, "Couldn't build an alias from the relation name '%s'", f.relationName) + } + if join := tableModel.GetJoin(f.relationName); join == nil { + q = q.Relation(f.relationName + "._") + } + q, err = f.filter.WhereWithAlias(q, alias) + if err != nil { + return q, errors.Wrapf(err, "Couldn't append the filter for the relation '%s'", f.relationName) + } + continue + } + q, err = f.filter.WhereWithAlias(q, f.alias) + if err != nil { + return q, err + } + } + + return q, nil +} diff --git a/tw/twmodel/opponents_defeated.go b/tw/twmodel/opponents_defeated.go new file mode 100644 index 0000000..f085552 --- /dev/null +++ b/tw/twmodel/opponents_defeated.go @@ -0,0 +1,195 @@ +package twmodel + +import ( + "github.com/Kichiyaki/gopgutil/v10" + "github.com/go-pg/pg/v10/orm" +) + +type OpponentsDefeated struct { + RankAtt int `json:"rankAtt" pg:",use_zero" gqlgen:"rankAtt"` + ScoreAtt int `pg:",use_zero" json:"scoreAtt" gqlgen:"scoreAtt"` + RankDef int `pg:",use_zero" json:"rankDef" gqlgen:"rankDef"` + ScoreDef int `pg:",use_zero" json:"scoreDef" gqlgen:"scoreDef"` + RankSup int `pg:",use_zero" json:"rankSup,omitempty" gqlgen:"rankSup"` + ScoreSup int `pg:",use_zero" json:"scoreSup,omitempty" gqlgen:"scoreSup"` + RankTotal int `pg:",use_zero" json:"rankTotal" gqlgen:"rankTotal"` + ScoreTotal int `pg:",use_zero" json:"scoreTotal" gqlgen:"scoreTotal"` +} + +type OpponentsDefeatedFilter struct { + RankAtt int `json:"rankAtt" gqlgen:"rankAtt"` + RankAttGT int `json:"rankAttGT" gqlgen:"rankAttGT"` + RankAttGTE int `json:"rankAttGTE" gqlgen:"rankAttGTE"` + RankAttLT int `json:"rankAttLT" gqlgen:"rankAttLT"` + RankAttLTE int `json:"rankAttLTE" gqlgen:"rankAttLTE"` + ScoreAtt int `json:"scoreAtt" gqlgen:"scoreAtt"` + ScoreAttGT int `json:"scoreAttGT" gqlgen:"scoreAttGT"` + ScoreAttGTE int `json:"scoreAttGTE" gqlgen:"scoreAttGTE"` + ScoreAttLT int `json:"scoreAttLT" gqlgen:"scoreAttLT"` + ScoreAttLTE int `json:"scoreAttLTE" gqlgen:"scoreAttLTE"` + + RankDef int `json:"rankDef" gqlgen:"rankDef"` + RankDefGT int `json:"rankDefGT" gqlgen:"rankDefGT"` + RankDefGTE int `json:"rankDefGTE" gqlgen:"rankDefGTE"` + RankDefLT int `json:"rankDefLT" gqlgen:"rankDefLT"` + RankDefLTE int `json:"rankDefLTE" gqlgen:"rankDefLTE"` + ScoreDef int `json:"scoreDef" gqlgen:"scoreDef"` + ScoreDefGT int `json:"scoreDefGT" gqlgen:"scoreDefGT"` + ScoreDefGTE int `json:"scoreDefGTE" gqlgen:"scoreDefGTE"` + ScoreDefLT int `json:"scoreDefLT" gqlgen:"scoreDefLT"` + ScoreDefLTE int `json:"scoreDefLTE" gqlgen:"scoreDefLTE"` + + RankSup int `json:"rankSup,omitempty" gqlgen:"rankSup"` + RankSupGT int `json:"rankSupGT,omitempty" gqlgen:"rankSupGT"` + RankSupGTE int `json:"rankSupGTE,omitempty" gqlgen:"rankSupGTE"` + RankSupLT int `json:"rankSupLT,omitempty" gqlgen:"rankSupLT"` + RankSupLTE int `json:"rankSupLTE,omitempty" gqlgen:"rankSupLTE"` + ScoreSup int `json:"scoreSup,omitempty" gqlgen:"scoreSup"` + ScoreSupGT int `json:"scoreSupGT,omitempty" gqlgen:"scoreSupGT"` + ScoreSupGTE int `json:"scoreSupGTE,omitempty" gqlgen:"scoreSupGTE"` + ScoreSupLT int `json:"scoreSupLT,omitempty" gqlgen:"scoreSupLT"` + ScoreSupLTE int `json:"scoreSupLTE,omitempty" gqlgen:"scoreSupLTE"` + + RankTotal int `json:"rankTotal" gqlgen:"rankTotal"` + RankTotalGT int `json:"rankTotalGT" gqlgen:"rankTotalGT"` + RankTotalGTE int `json:"rankTotalGTE" gqlgen:"rankTotalGTE"` + RankTotalLT int `json:"rankTotalLT" gqlgen:"rankTotalLT"` + RankTotalLTE int `json:"rankTotalLTE" gqlgen:"rankTotalLTE"` + ScoreTotal int `json:"scoreTotal" gqlgen:"scoreTotal"` + ScoreTotalGT int `json:"scoreTotalGT" gqlgen:"scoreTotalGT"` + ScoreTotalGTE int `json:"scoreTotalGTE" gqlgen:"scoreTotalGTE"` + ScoreTotalLT int `json:"scoreTotalLT" gqlgen:"scoreTotalLT"` + ScoreTotalLTE int `json:"scoreTotalLTE" gqlgen:"scoreTotalLTE"` +} + +func (f *OpponentsDefeatedFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + + if !isZero(f.RankAtt) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("rank_att", alias), f.RankAtt) + } + if !isZero(f.RankAttGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("rank_att", alias), f.RankAttGT) + } + if !isZero(f.RankAttGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("rank_att", alias), f.RankAttGTE) + } + if !isZero(f.RankAttLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("rank_att", alias), f.RankAttLT) + } + if !isZero(f.RankAttLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("rank_att", alias), f.RankAttLTE) + } + if !isZero(f.ScoreAtt) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("score_att", alias), f.ScoreAtt) + } + if !isZero(f.ScoreAttGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("score_att", alias), f.ScoreAttGT) + } + if !isZero(f.ScoreAttGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("score_att", alias), f.ScoreAttGTE) + } + if !isZero(f.ScoreAttLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("score_att", alias), f.ScoreAttLT) + } + if !isZero(f.ScoreAttLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("score_att", alias), f.ScoreAttLTE) + } + + if !isZero(f.RankDef) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("rank_def", alias), f.RankDef) + } + if !isZero(f.RankDefGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("rank_def", alias), f.RankDefGT) + } + if !isZero(f.RankDefGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("rank_def", alias), f.RankDefGTE) + } + if !isZero(f.RankDefLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("rank_def", alias), f.RankDefLT) + } + if !isZero(f.RankDefLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("rank_def", alias), f.RankDefLTE) + } + if !isZero(f.ScoreDef) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("score_def", alias), f.ScoreDef) + } + if !isZero(f.ScoreDefGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("score_def", alias), f.ScoreDefGT) + } + if !isZero(f.ScoreDefGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("score_def", alias), f.ScoreDefGTE) + } + if !isZero(f.ScoreDefLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("score_def", alias), f.ScoreDefLT) + } + if !isZero(f.ScoreDefLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("score_def", alias), f.ScoreDefLTE) + } + + if !isZero(f.RankSup) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("rank_sup", alias), f.RankSup) + } + if !isZero(f.RankSupGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("rank_sup", alias), f.RankSupGT) + } + if !isZero(f.RankSupGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("rank_sup", alias), f.RankSupGTE) + } + if !isZero(f.RankSupLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("rank_sup", alias), f.RankSupLT) + } + if !isZero(f.RankSupLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("rank_sup", alias), f.RankSupLTE) + } + if !isZero(f.ScoreSup) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("score_sup", alias), f.ScoreSup) + } + if !isZero(f.ScoreSupGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("score_sup", alias), f.ScoreSupGT) + } + if !isZero(f.ScoreSupGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("score_sup", alias), f.ScoreSupGTE) + } + if !isZero(f.ScoreSupLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("score_sup", alias), f.ScoreSupLT) + } + if !isZero(f.ScoreSupLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("score_sup", alias), f.ScoreSupLTE) + } + + if !isZero(f.RankTotal) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("rank_total", alias), f.RankTotal) + } + if !isZero(f.RankTotalGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("rank_total", alias), f.RankTotalGT) + } + if !isZero(f.RankTotalGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("rank_total", alias), f.RankTotalGTE) + } + if !isZero(f.RankTotalLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("rank_total", alias), f.RankTotalLT) + } + if !isZero(f.RankTotalLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("rank_total", alias), f.RankTotalLTE) + } + if !isZero(f.ScoreTotal) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("score_total", alias), f.ScoreTotal) + } + if !isZero(f.ScoreTotalGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("score_total", alias), f.ScoreTotalGT) + } + if !isZero(f.ScoreTotalGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("score_total", alias), f.ScoreTotalGTE) + } + if !isZero(f.ScoreTotalLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("score_total", alias), f.ScoreTotalLT) + } + if !isZero(f.ScoreTotalLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("score_total", alias), f.ScoreTotalLTE) + } + + return q, nil +} diff --git a/models/player.go b/tw/twmodel/player.go similarity index 58% rename from models/player.go rename to tw/twmodel/player.go index e951fae..7d433f0 100644 --- a/models/player.go +++ b/tw/twmodel/player.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -8,7 +9,7 @@ import ( ) type Player struct { - tableName struct{} `pg:"?SERVER.players,alias:player" json:"tableName" xml:"tableName" gqlgen:"tableName"` + tableName struct{} `pg:"?SERVER.players,alias:player"` ID int `json:"id" pg:"type:bigint,pk" gqlgen:"id" xml:"id"` Name string `json:"name" gqlgen:"name" xml:"name"` @@ -93,147 +94,151 @@ type PlayerFilter struct { } func (f *PlayerFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.ID) { - q = q.Where(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.ID)) } if !isZero(f.IDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.IDNEQ)) } if !isZero(f.Exists) { - q = q.Where(buildConditionEquals(addAliasToColumnName("exists", alias)), f.Exists) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("exists", alias), f.Exists) } if !isZero(f.Name) { - q = q.Where(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.Name)) } if !isZero(f.NameNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.NameNEQ)) } if !isZero(f.NameMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("name", alias)), f.NameMATCH) + q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameMATCH) } if !isZero(f.NameIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ) + q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameIEQ) } if !isZero(f.TotalVillages) { - q = q.Where(buildConditionEquals(addAliasToColumnName("total_villages", alias)), f.TotalVillages) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillages) } if !isZero(f.TotalVillagesGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("total_villages", alias)), f.TotalVillagesGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillagesGT) } if !isZero(f.TotalVillagesGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("total_villages", alias)), f.TotalVillagesGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillagesGTE) } if !isZero(f.TotalVillagesLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("total_villages", alias)), f.TotalVillagesLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillagesLT) } if !isZero(f.TotalVillagesLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("total_villages", alias)), f.TotalVillagesLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillagesLTE) } if !isZero(f.Points) { - q = q.Where(buildConditionEquals(addAliasToColumnName("points", alias)), f.Points) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("points", alias), f.Points) } if !isZero(f.PointsGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("points", alias)), f.PointsGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsGT) } if !isZero(f.PointsGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("points", alias)), f.PointsGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsGTE) } if !isZero(f.PointsLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("points", alias)), f.PointsLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsLT) } if !isZero(f.PointsLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("points", alias)), f.PointsLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsLTE) } if !isZero(f.Rank) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank", alias)), f.Rank) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("rank", alias), f.Rank) } if !isZero(f.RankGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank", alias)), f.RankGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("rank", alias), f.RankGT) } if !isZero(f.RankGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank", alias)), f.RankGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("rank", alias), f.RankGTE) } if !isZero(f.RankLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank", alias)), f.RankLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("rank", alias), f.RankLT) } if !isZero(f.RankLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank", alias)), f.RankLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("rank", alias), f.RankLTE) } if !isZero(f.DailyGrowth) { - q = q.Where(buildConditionEquals(addAliasToColumnName("daily_growth", alias)), f.DailyGrowth) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("daily_growth", alias), f.DailyGrowth) } if !isZero(f.DailyGrowthGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("daily_growth", alias)), f.DailyGrowthGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("daily_growth", alias), f.DailyGrowthGT) } if !isZero(f.DailyGrowthGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("daily_growth", alias)), f.DailyGrowthGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("daily_growth", alias), f.DailyGrowthGTE) } if !isZero(f.DailyGrowthLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("daily_growth", alias)), f.DailyGrowthLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("daily_growth", alias), f.DailyGrowthLT) } if !isZero(f.DailyGrowthLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("daily_growth", alias)), f.DailyGrowthLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("daily_growth", alias), f.DailyGrowthLTE) } if !isZero(f.JoinedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("joined_at", alias)), f.JoinedAt) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("joined_at", alias), f.JoinedAt) } if !isZero(f.JoinedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("joined_at", alias)), f.JoinedAtGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("joined_at", alias), f.JoinedAtGT) } if !isZero(f.JoinedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("joined_at", alias)), f.JoinedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("joined_at", alias), f.JoinedAtGTE) } if !isZero(f.JoinedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("joined_at", alias)), f.JoinedAtLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("joined_at", alias), f.JoinedAtLT) } if !isZero(f.JoinedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("joined_at", alias)), f.JoinedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("joined_at", alias), f.JoinedAtLTE) } if !isZero(f.LastActivityAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAt) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("last_activity_at", alias), f.LastActivityAt) } if !isZero(f.LastActivityAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAtGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("last_activity_at", alias), f.LastActivityAtGT) } if !isZero(f.LastActivityAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAtGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("last_activity_at", alias), f.LastActivityAtGTE) } if !isZero(f.LastActivityAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAtLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("last_activity_at", alias), f.LastActivityAtLT) } if !isZero(f.LastActivityAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("last_activity_at", alias)), f.LastActivityAtLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("last_activity_at", alias), f.LastActivityAtLTE) } if !isZero(f.DeletedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("deleted_at", alias)), f.DeletedAt) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAt) } if !isZero(f.DeletedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("deleted_at", alias)), f.DeletedAtGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAtGT) } if !isZero(f.DeletedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("deleted_at", alias)), f.DeletedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAtGTE) } if !isZero(f.DeletedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("deleted_at", alias)), f.DeletedAtLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAtLT) } if !isZero(f.DeletedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("deleted_at", alias)), f.DeletedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAtLTE) } if !isZero(f.TribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("tribe_id", alias), pg.Array(f.TribeID)) } if !isZero(f.TribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("tribe_id", alias), pg.Array(f.TribeIDNEQ)) } return f.OpponentsDefeatedFilter.WhereWithAlias(q, alias) @@ -243,31 +248,25 @@ func (f *PlayerFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "player") } -type PlayerRelationshipAndSortAppender struct { - Filter *PlayerFilter - Sort []string -} - -func (a *PlayerRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - tribeRequired := findStringWithPrefix(a.Sort, "tribe.") != "" - if a.Filter.TribeFilter != nil { - q, err = a.Filter.TribeFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - tribeRequired = true +func (f *PlayerFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil } - if !isZero(a.Sort) { - q = q.Order(a.Sort...) + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "player", + }, + } + if f.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.TribeFilter, + relationName: "Tribe", + }) } - if tribeRequired { - q = q.Relation("Tribe._") - } - - return q, nil + return appendFilters(q, filtersToAppend...) } type FoundPlayer struct { diff --git a/models/player_history.go b/tw/twmodel/player_history.go similarity index 58% rename from models/player_history.go rename to tw/twmodel/player_history.go index 4c7275f..5bf3693 100644 --- a/models/player_history.go +++ b/tw/twmodel/player_history.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -36,27 +37,31 @@ type PlayerHistoryFilter struct { } func (f *PlayerHistoryFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLTE) } if !isZero(f.PlayerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerID)) } if !isZero(f.PlayerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerIDNEQ)) } return q, nil @@ -66,41 +71,29 @@ func (f *PlayerHistoryFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "player_history") } -type PlayerHistoryRelationshipAndSortAppender struct { - Filter *PlayerHistoryFilter - Sort []string -} +func (f *PlayerHistoryFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } -func (a *PlayerHistoryRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - playerRequired := findStringWithPrefix(a.Sort, "player.") != "" - playerTribeRequired := findStringWithPrefix(a.Sort, "player.tribe.") != "" - if a.Filter.PlayerFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "player") - if err != nil { - return q, err - } - playerRequired = true - if a.Filter.PlayerFilter.TribeFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - playerTribeRequired = true + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "player_history", + }, + } + if f.PlayerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter, + relationName: "Player", + }) + if f.PlayerFilter.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter.TribeFilter, + relationName: "Player.Tribe", + }) } } - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if playerRequired { - q = q.Relation("Player._") - } - - if playerTribeRequired { - q = q.Join("LEFT JOIN ?SERVER.tribes AS tribe ON tribe.id = player.tribe_id") - } - - return q, nil + return appendFilters(q, filtersToAppend...) } diff --git a/models/player_name_change.go b/tw/twmodel/player_name_change.go similarity index 97% rename from models/player_name_change.go rename to tw/twmodel/player_name_change.go index 0813e73..3ea9703 100644 --- a/models/player_name_change.go +++ b/tw/twmodel/player_name_change.go @@ -1,4 +1,4 @@ -package models +package twmodel import "time" diff --git a/models/player_to_server.go b/tw/twmodel/player_to_server.go similarity index 95% rename from models/player_to_server.go rename to tw/twmodel/player_to_server.go index 44445b9..1fcd014 100644 --- a/models/player_to_server.go +++ b/tw/twmodel/player_to_server.go @@ -1,4 +1,4 @@ -package models +package twmodel type PlayerToServer struct { ID int `json:"id" gqlgen:"id" xml:"id"` diff --git a/models/server.go b/tw/twmodel/server.go similarity index 75% rename from models/server.go rename to tw/twmodel/server.go index 33cdba0..4eec0f9 100644 --- a/models/server.go +++ b/tw/twmodel/server.go @@ -1,7 +1,8 @@ -package models +package twmodel import ( "fmt" + "github.com/Kichiyaki/gopgutil/v10" "io" "strconv" "strings" @@ -83,31 +84,35 @@ type ServerFilter struct { } func (f *ServerFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.Key) { - q = q.Where(buildConditionArray(addAliasToColumnName("key", alias)), pg.Array(f.Key)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("key", alias), pg.Array(f.Key)) } if !isZero(f.KeyNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("key", alias)), pg.Array(f.KeyNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("key", alias), pg.Array(f.KeyNEQ)) } if !isZero(f.KeyMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("key", alias)), f.KeyMATCH) + q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("key", alias), f.KeyMATCH) } if !isZero(f.KeyIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("key", alias)), f.KeyIEQ) + q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("key", alias), f.KeyIEQ) } if !isZero(f.Status) { - q = q.Where(buildConditionArray(addAliasToColumnName("status", alias)), pg.Array(f.Status)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("status", alias), pg.Array(f.Status)) } if !isZero(f.StatusNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("status", alias)), pg.Array(f.StatusNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("status", alias), pg.Array(f.StatusNEQ)) } if !isZero(f.VersionCode) { - q = q.Where(buildConditionArray(addAliasToColumnName("version_code", alias)), pg.Array(f.VersionCode)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("version_code", alias), pg.Array(f.VersionCode)) } if !isZero(f.VersionCodeNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("version_code", alias)), pg.Array(f.VersionCodeNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("version_code", alias), pg.Array(f.VersionCodeNEQ)) } return q, nil diff --git a/models/server_config.go b/tw/twmodel/server_config.go similarity index 99% rename from models/server_config.go rename to tw/twmodel/server_config.go index bbe0511..dc36b02 100644 --- a/models/server_config.go +++ b/tw/twmodel/server_config.go @@ -1,4 +1,4 @@ -package models +package twmodel import "encoding/xml" diff --git a/models/server_stats.go b/tw/twmodel/server_stats.go similarity index 78% rename from models/server_stats.go rename to tw/twmodel/server_stats.go index d3068ee..6d3fef9 100644 --- a/models/server_stats.go +++ b/tw/twmodel/server_stats.go @@ -1,7 +1,8 @@ -package models +package twmodel import ( "context" + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10/orm" @@ -41,20 +42,24 @@ type ServerStatsFilter struct { } func (f *ServerStatsFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLTE) } return q, nil diff --git a/models/special_server.go b/tw/twmodel/special_server.go similarity index 97% rename from models/special_server.go rename to tw/twmodel/special_server.go index 506fc16..15cc37e 100644 --- a/models/special_server.go +++ b/tw/twmodel/special_server.go @@ -1,4 +1,4 @@ -package models +package twmodel type SpecialServer struct { tableName struct{} `pg:"special_servers,alias:special_server"` diff --git a/models/tribe.go b/tw/twmodel/tribe.go similarity index 55% rename from models/tribe.go rename to tw/twmodel/tribe.go index ae0cc48..90c8735 100644 --- a/models/tribe.go +++ b/tw/twmodel/tribe.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -41,24 +42,26 @@ type TribeFilterOr struct { } func (f *TribeFilterOr) WhereWithAlias(q *orm.Query, alias string) *orm.Query { - q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { - if !isZero(f.ID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID)) - } - if !isZero(f.Tag) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("tag", alias)), pg.Array(f.Tag)) - } - if !isZero(f.TagIEQ) { - q = q.WhereOr(buildConditionIEQ(addAliasToColumnName("tag", alias)), f.TagIEQ) - } - if !isZero(f.Name) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name)) - } - if !isZero(f.NameIEQ) { - q = q.WhereOr(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ) - } - return q, nil - }) + if f != nil { + q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + if !isZero(f.ID) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.ID)) + } + if !isZero(f.Tag) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("tag", alias), pg.Array(f.Tag)) + } + if !isZero(f.TagIEQ) { + q = q.WhereOr(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("tag", alias), f.TagIEQ) + } + if !isZero(f.Name) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.Name)) + } + if !isZero(f.NameIEQ) { + q = q.WhereOr(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameIEQ) + } + return q, nil + }) + } return q } @@ -131,169 +134,173 @@ type TribeFilter struct { } func (f *TribeFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.ID) { - q = q.Where(buildConditionArray(addAliasToColumnName("id", alias)), pg.Array(f.ID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.ID)) } if !isZero(f.IDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("id", alias)), pg.Array(f.IDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.IDNEQ)) } if !isZero(f.Exists) { - q = q.Where(buildConditionEquals(addAliasToColumnName("exists", alias)), f.Exists) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("exists", alias), f.Exists) } if !isZero(f.Tag) { - q = q.Where(buildConditionArray(addAliasToColumnName("tag", alias)), pg.Array(f.Tag)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("tag", alias), pg.Array(f.Tag)) } if !isZero(f.TagNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("tag", alias)), pg.Array(f.TagNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("tag", alias), pg.Array(f.TagNEQ)) } if !isZero(f.TagMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("tag", alias)), f.TagMATCH) + q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("tag", alias), f.TagMATCH) } if !isZero(f.TagIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("tag", alias)), f.TagIEQ) + q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("tag", alias), f.TagIEQ) } if !isZero(f.Name) { - q = q.Where(buildConditionArray(addAliasToColumnName("name", alias)), pg.Array(f.Name)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.Name)) } if !isZero(f.NameNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("name", alias)), pg.Array(f.NameNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.NameNEQ)) } if !isZero(f.NameMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("name", alias)), f.NameMATCH) + q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameMATCH) } if !isZero(f.NameIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("name", alias)), f.NameIEQ) + q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameIEQ) } if !isZero(f.TotalMembers) { - q = q.Where(buildConditionEquals(addAliasToColumnName("total_members", alias)), f.TotalMembers) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("total_members", alias), f.TotalMembers) } if !isZero(f.TotalMembersGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("total_members", alias)), f.TotalMembersGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("total_members", alias), f.TotalMembersGT) } if !isZero(f.TotalMembersGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("total_members", alias)), f.TotalMembersGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("total_members", alias), f.TotalMembersGTE) } if !isZero(f.TotalMembersLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("total_members", alias)), f.TotalMembersLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("total_members", alias), f.TotalMembersLT) } if !isZero(f.TotalMembersLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("total_members", alias)), f.TotalMembersLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("total_members", alias), f.TotalMembersLTE) } if !isZero(f.TotalVillages) { - q = q.Where(buildConditionEquals(addAliasToColumnName("total_villages", alias)), f.TotalVillages) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillages) } if !isZero(f.TotalVillagesGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("total_villages", alias)), f.TotalVillagesGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillagesGT) } if !isZero(f.TotalVillagesGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("total_villages", alias)), f.TotalVillagesGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillagesGTE) } if !isZero(f.TotalVillagesLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("total_villages", alias)), f.TotalVillagesLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillagesLT) } if !isZero(f.TotalVillagesLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("total_villages", alias)), f.TotalVillagesLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("total_villages", alias), f.TotalVillagesLTE) } if !isZero(f.Points) { - q = q.Where(buildConditionEquals(addAliasToColumnName("points", alias)), f.Points) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("points", alias), f.Points) } if !isZero(f.PointsGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("points", alias)), f.PointsGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsGT) } if !isZero(f.PointsGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("points", alias)), f.PointsGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsGTE) } if !isZero(f.PointsLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("points", alias)), f.PointsLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsLT) } if !isZero(f.PointsLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("points", alias)), f.PointsLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsLTE) } if !isZero(f.AllPoints) { - q = q.Where(buildConditionEquals(addAliasToColumnName("all_points", alias)), f.AllPoints) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("all_points", alias), f.AllPoints) } if !isZero(f.AllPointsGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("all_points", alias)), f.AllPointsGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("all_points", alias), f.AllPointsGT) } if !isZero(f.AllPointsGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("all_points", alias)), f.AllPointsGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("all_points", alias), f.AllPointsGTE) } if !isZero(f.AllPointsLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("all_points", alias)), f.AllPointsLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("all_points", alias), f.AllPointsLT) } if !isZero(f.AllPointsLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("all_points", alias)), f.AllPointsLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("all_points", alias), f.AllPointsLTE) } if !isZero(f.Rank) { - q = q.Where(buildConditionEquals(addAliasToColumnName("rank", alias)), f.Rank) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("rank", alias), f.Rank) } if !isZero(f.RankGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("rank", alias)), f.RankGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("rank", alias), f.RankGT) } if !isZero(f.RankGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("rank", alias)), f.RankGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("rank", alias), f.RankGTE) } if !isZero(f.RankLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("rank", alias)), f.RankLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("rank", alias), f.RankLT) } if !isZero(f.RankLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("rank", alias)), f.RankLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("rank", alias), f.RankLTE) } if !isZero(f.Dominance) { - q = q.Where(buildConditionEquals(addAliasToColumnName("dominance", alias)), f.Dominance) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("dominance", alias), f.Dominance) } if !isZero(f.DominanceGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("dominance", alias)), f.DominanceGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("dominance", alias), f.DominanceGT) } if !isZero(f.DominanceGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("dominance", alias)), f.DominanceGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("dominance", alias), f.DominanceGTE) } if !isZero(f.DominanceLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("dominance", alias)), f.DominanceLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("dominance", alias), f.DominanceLT) } if !isZero(f.DominanceLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("dominance", alias)), f.DominanceLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("dominance", alias), f.DominanceLTE) } if !isZero(f.CreatedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("created_at", alias)), f.CreatedAt) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAt) } if !isZero(f.CreatedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("created_at", alias)), f.CreatedAtGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGT) } if !isZero(f.CreatedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("created_at", alias)), f.CreatedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGTE) } if !isZero(f.CreatedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("created_at", alias)), f.CreatedAtLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLT) } if !isZero(f.CreatedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("created_at", alias)), f.CreatedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLTE) } if !isZero(f.DeletedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("deleted_at", alias)), f.DeletedAt) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAt) } if !isZero(f.DeletedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("deleted_at", alias)), f.DeletedAtGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAtGT) } if !isZero(f.DeletedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("deleted_at", alias)), f.DeletedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAtGTE) } if !isZero(f.DeletedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("deleted_at", alias)), f.DeletedAtLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAtLT) } if !isZero(f.DeletedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("deleted_at", alias)), f.DeletedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("deleted_at", alias), f.DeletedAtLTE) } if f.Or != nil { diff --git a/models/tribe_change.go b/tw/twmodel/tribe_change.go similarity index 55% rename from models/tribe_change.go rename to tw/twmodel/tribe_change.go index 09d88d4..44ef843 100644 --- a/models/tribe_change.go +++ b/tw/twmodel/tribe_change.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -26,15 +27,17 @@ type TribeChangeFilterOr struct { } func (f *TribeChangeFilterOr) WhereWithAlias(q *orm.Query, alias string) *orm.Query { - q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { - if !isZero(f.OldTribeID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("old_tribe_id", alias)), pg.Array(f.OldTribeID)) - } - if !isZero(f.NewTribeID) { - q = q.WhereOr(buildConditionArray(addAliasToColumnName("new_tribe_id", alias)), pg.Array(f.NewTribeID)) - } - return q, nil - }) + if f != nil { + q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + if !isZero(f.OldTribeID) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("old_tribe_id", alias), pg.Array(f.OldTribeID)) + } + if !isZero(f.NewTribeID) { + q = q.WhereOr(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("new_tribe_id", alias), pg.Array(f.NewTribeID)) + } + return q, nil + }) + } return q } @@ -61,41 +64,45 @@ type TribeChangeFilter struct { } func (f *TribeChangeFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.PlayerID) { - q = q.Where(buildConditionArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerID)) } if !isZero(f.PlayerIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("player_id", alias)), pg.Array(f.PlayerIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerIDNEQ)) } if !isZero(f.OldTribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("old_tribe_id", alias)), pg.Array(f.OldTribeID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("old_tribe_id", alias), pg.Array(f.OldTribeID)) } if !isZero(f.OldTribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("old_tribe_id", alias)), pg.Array(f.OldTribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("old_tribe_id", alias), pg.Array(f.OldTribeIDNEQ)) } if !isZero(f.NewTribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("new_tribe_id", alias)), pg.Array(f.NewTribeID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("new_tribe_id", alias), pg.Array(f.NewTribeID)) } if !isZero(f.NewTribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("new_tribe_id", alias)), pg.Array(f.NewTribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("new_tribe_id", alias), pg.Array(f.NewTribeIDNEQ)) } if !isZero(f.CreatedAt) { - q = q.Where(buildConditionEquals(addAliasToColumnName("created_at", alias)), f.CreatedAt) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAt) } if !isZero(f.CreatedAtGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("created_at", alias)), f.CreatedAtGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGT) } if !isZero(f.CreatedAtGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("created_at", alias)), f.CreatedAtGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtGTE) } if !isZero(f.CreatedAtLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("created_at", alias)), f.CreatedAtLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLT) } if !isZero(f.CreatedAtLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("created_at", alias)), f.CreatedAtLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("created_at", alias), f.CreatedAtLTE) } if f.Or != nil { @@ -109,53 +116,35 @@ func (f *TribeChangeFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "tribe_change") } -type TribeChangeRelationshipAndSortAppender struct { - Filter *TribeChangeFilter - Sort []string -} - -func (a *TribeChangeRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - playerRequired := findStringWithPrefix(a.Sort, "player.") != "" - if a.Filter.PlayerFilter != nil { - q, err = a.Filter.PlayerFilter.WhereWithAlias(q, "player") - if err != nil { - return q, err - } - playerRequired = true - } - - oldTribeRequired := findStringWithPrefix(a.Sort, "old_tribe.") != "" - if a.Filter.OldTribeFilter != nil { - q, err = a.Filter.OldTribeFilter.WhereWithAlias(q, "old_tribe") - if err != nil { - return q, err - } - oldTribeRequired = true - } - - newTribeRequired := findStringWithPrefix(a.Sort, "new_tribe.") != "" - if a.Filter.NewTribeFilter != nil { - q, err = a.Filter.NewTribeFilter.WhereWithAlias(q, "new_tribe") - if err != nil { - return q, err - } - newTribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if playerRequired { - q = q.Relation("Tribe._") - } - if oldTribeRequired { - q = q.Relation("OldTribe._") - } - if newTribeRequired { - q = q.Relation("NewTribe._") - } - - return q, nil +func (f *TribeChangeFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "tribe_change", + }, + } + if f.PlayerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter, + relationName: "Player", + }) + } + if f.OldTribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.OldTribeFilter, + relationName: "OldTribe", + }) + } + if f.NewTribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.NewTribeFilter, + relationName: "NewTribe", + }) + } + + return appendFilters(q, filtersToAppend...) } diff --git a/models/tribe_history.go b/tw/twmodel/tribe_history.go similarity index 61% rename from models/tribe_history.go rename to tw/twmodel/tribe_history.go index 196b7d8..086a7de 100644 --- a/models/tribe_history.go +++ b/tw/twmodel/tribe_history.go @@ -1,6 +1,7 @@ -package models +package twmodel import ( + "github.com/Kichiyaki/gopgutil/v10" "time" "github.com/go-pg/pg/v10" @@ -37,27 +38,34 @@ type TribeHistoryFilter struct { } func (f *TribeHistoryFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.CreateDate) { - q = q.Where(buildConditionEquals(addAliasToColumnName("create_date", alias)), f.CreateDate) + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDate) } if !isZero(f.CreateDateGT) { - q = q.Where(buildConditionGT(addAliasToColumnName("create_date", alias)), f.CreateDateGT) + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGT) } if !isZero(f.CreateDateGTE) { - q = q.Where(buildConditionGTE(addAliasToColumnName("create_date", alias)), f.CreateDateGTE) + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateGTE) } if !isZero(f.CreateDateLT) { - q = q.Where(buildConditionLT(addAliasToColumnName("create_date", alias)), f.CreateDateLT) + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLT) } if !isZero(f.CreateDateLTE) { - q = q.Where(buildConditionLTE(addAliasToColumnName("create_date", alias)), f.CreateDateLTE) + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("create_date", alias), f.CreateDateLTE) } if !isZero(f.TribeID) { - q = q.Where(buildConditionArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeID)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("tribe_id", alias), pg.Array(f.TribeID)) } if !isZero(f.TribeIDNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("tribe_id", alias)), pg.Array(f.TribeIDNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("tribe_id", alias), pg.Array(f.TribeIDNEQ)) + } + if f.TribeFilter != nil { + return f.TribeFilter.WhereWithAlias(q.Relation("Tribe"), "tribe") } return q, nil @@ -67,29 +75,23 @@ func (f *TribeHistoryFilter) Where(q *orm.Query) (*orm.Query, error) { return f.WhereWithAlias(q, "tribe_history") } -type TribeHistoryRelationshipAndSortAppender struct { - Filter *TribeHistoryFilter - Sort []string -} - -func (a *TribeHistoryRelationshipAndSortAppender) Append(q *orm.Query) (*orm.Query, error) { - var err error - tribeRequired := findStringWithPrefix(a.Sort, "tribe.") != "" - if a.Filter.TribeFilter != nil { - q, err = a.Filter.TribeFilter.WhereWithAlias(q, "tribe") - if err != nil { - return q, err - } - tribeRequired = true - } - - if !isZero(a.Sort) { - q = q.Order(a.Sort...) - } - - if tribeRequired { - q = q.Relation("Tribe._") - } - - return q, nil +func (f *TribeHistoryFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "tribe_history", + }, + } + if f.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.TribeFilter, + relationName: "Tribe", + }) + } + + return appendFilters(q, filtersToAppend...) } diff --git a/tw/twmodel/twmodel.go b/tw/twmodel/twmodel.go new file mode 100644 index 0000000..2a127f2 --- /dev/null +++ b/tw/twmodel/twmodel.go @@ -0,0 +1,31 @@ +package twmodel + +import "github.com/go-pg/pg/v10/orm" + +func init() { + registerModels() +} + +func registerModels() { + models := []interface{}{ + (*SpecialServer)(nil), + (*Server)(nil), + (*Version)(nil), + (*PlayerToServer)(nil), + (*PlayerNameChange)(nil), + (*Tribe)(nil), + (*Player)(nil), + (*Village)(nil), + (*Ennoblement)(nil), + (*ServerStats)(nil), + (*TribeHistory)(nil), + (*PlayerHistory)(nil), + (*TribeChange)(nil), + (*DailyPlayerStats)(nil), + (*DailyTribeStats)(nil), + } + + for _, model := range models { + orm.RegisterTable(model) + } +} diff --git a/models/unit_config.go b/tw/twmodel/unit_config.go similarity index 99% rename from models/unit_config.go rename to tw/twmodel/unit_config.go index 9e3dbe6..e627d74 100644 --- a/models/unit_config.go +++ b/tw/twmodel/unit_config.go @@ -1,4 +1,4 @@ -package models +package twmodel import "encoding/xml" diff --git a/models/version.go b/tw/twmodel/version.go similarity index 75% rename from models/version.go rename to tw/twmodel/version.go index 507cef0..8317391 100644 --- a/models/version.go +++ b/tw/twmodel/version.go @@ -1,7 +1,8 @@ -package models +package twmodel import ( "fmt" + "github.com/Kichiyaki/gopgutil/v10" "io" "strconv" "strings" @@ -34,6 +35,13 @@ const ( VersionCodeSK VersionCode = "sk" ) +func VersionCodeFromServerKey(key string) VersionCode { + if len(key) < 2 { + return "" + } + return VersionCode(key[0:2]) +} + func (vc VersionCode) IsValid() bool { switch vc { case VersionCodePL, @@ -102,24 +110,28 @@ type VersionFilter struct { } func (f *VersionFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + if !isZero(f.Code) { - q = q.Where(buildConditionArray(addAliasToColumnName("code", alias)), pg.Array(f.Code)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("code", alias), pg.Array(f.Code)) } if !isZero(f.CodeNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("code", alias)), pg.Array(f.CodeNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("code", alias), pg.Array(f.CodeNEQ)) } if !isZero(f.Host) { - q = q.Where(buildConditionArray(addAliasToColumnName("host", alias)), pg.Array(f.Host)) + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("host", alias), pg.Array(f.Host)) } if !isZero(f.HostNEQ) { - q = q.Where(buildConditionNotInArray(addAliasToColumnName("host", alias)), pg.Array(f.HostNEQ)) + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("host", alias), pg.Array(f.HostNEQ)) } if !isZero(f.HostMATCH) { - q = q.Where(buildConditionMatch(addAliasToColumnName("host", alias)), f.HostMATCH) + q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("host", alias), f.HostMATCH) } if !isZero(f.HostIEQ) { - q = q.Where(buildConditionIEQ(addAliasToColumnName("host", alias)), f.HostIEQ) + q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("host", alias), f.HostIEQ) } return q, nil diff --git a/tw/twmodel/village.go b/tw/twmodel/village.go new file mode 100644 index 0000000..4cfadf9 --- /dev/null +++ b/tw/twmodel/village.go @@ -0,0 +1,217 @@ +package twmodel + +import ( + "fmt" + "github.com/Kichiyaki/gopgutil/v10" + "github.com/go-pg/pg/v10" + "github.com/go-pg/pg/v10/orm" + "strconv" +) + +type Village struct { + tableName struct{} `pg:"?SERVER.villages,alias:village"` + + ID int `json:"id" pg:"type:bigint,pk" gqlgen:"id"` + Name string `json:"name" gqlgen:"name"` + Points int `json:"points" pg:",use_zero" gqlgen:"points"` + X int `json:"x" pg:",use_zero" gqlgen:"x"` + Y int `json:"y" pg:",use_zero" gqlgen:"y"` + Bonus int `json:"bonus" pg:",use_zero" gqlgen:"bonus"` + + PlayerID int `json:"-" pg:",use_zero" gqlgen:"playerID"` + Player *Player `json:"player,omitempty" gqlgen:"-" pg:"rel:has-one"` +} + +func (v *Village) Continent() string { + if v == nil { + return "" + } + return fmt.Sprintf("K%c%c", strconv.FormatInt(int64(v.Y), 10)[0], strconv.FormatInt(int64(v.X), 10)[0]) +} + +func (v *Village) FullName() string { + return fmt.Sprintf("%s (%d|%d) %s", + v.Name, + v.X, + v.Y, + v.Continent()) +} + +type VillageFilter struct { + ID []int `json:"id" gqlgen:"id"` + IDNEQ []int `json:"idNEQ" gqlgen:"idNEQ"` + + Name []string `json:"name" gqlgen:"name"` + NameNEQ []string `json:"nameNEQ" gqlgen:"nameNEQ"` + NameMATCH string `json:"nameMATCH" gqlgen:"nameMATCH"` + NameIEQ string `json:"nameIEQ" gqlgen:"nameIEQ"` + + XGT int `json:"xGT" gqlgen:"xGT"` + XGTE int `json:"xGTE" gqlgen:"xGTE"` + XLT int `json:"xLT" gqlgen:"xLT"` + XLTE int `json:"xLTE" gqlgen:"xLTE"` + YGT int `json:"yGT" gqlgen:"yGT"` + YGTE int `json:"yGTE" gqlgen:"yGTE"` + YLT int `json:"yLT" gqlgen:"yLT"` + YLTE int `json:"yLTE" gqlgen:"yLTE"` + XY []string `json:"xy" gqlgen:"xy"` + + Points int `json:"points" gqlgen:"points"` + PointsGT int `json:"pointsGT" gqlgen:"pointsGT"` + PointsGTE int `json:"pointsGTE" gqlgen:"pointsGTE"` + PointsLT int `json:"pointsLT" gqlgen:"pointsLT"` + PointsLTE int `json:"pointsLTE" gqlgen:"pointsLTE"` + + Bonus int `json:"bonus" gqlgen:"bonus"` + BonusGT int `json:"bonusGT" gqlgen:"bonusGT"` + BonusGTE int `json:"bonusGTE" gqlgen:"bonusGTE"` + BonusLT int `json:"bonusLT" gqlgen:"bonusLT"` + BonusLTE int `json:"bonusLTE" gqlgen:"bonusLTE"` + + PlayerID []int `json:"playerID" gqlgen:"playerID"` + PlayerIDNEQ []int `json:"playerIDNEQ" gqlgen:"playerIDNEQ"` + PlayerFilter *PlayerFilter `json:"playerFilter" gqlgen:"playerFilter"` +} + +func (f *VillageFilter) WhereWithAlias(q *orm.Query, alias string) (*orm.Query, error) { + if f == nil { + return q, nil + } + + if !isZero(f.ID) { + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.ID)) + } + if !isZero(f.IDNEQ) { + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("id", alias), pg.Array(f.IDNEQ)) + } + + if !isZero(f.Name) { + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.Name)) + } + if !isZero(f.NameNEQ) { + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("name", alias), pg.Array(f.NameNEQ)) + } + if !isZero(f.NameMATCH) { + q = q.Where(gopgutil.BuildConditionMatch("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameMATCH) + } + if !isZero(f.NameIEQ) { + q = q.Where(gopgutil.BuildConditionIEQ("?"), gopgutil.AddAliasToColumnName("name", alias), f.NameIEQ) + } + + if !isZero(f.XGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("x", alias), f.XGT) + } + if !isZero(f.XGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("x", alias), f.XGTE) + } + if !isZero(f.XLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("x", alias), f.XLT) + } + if !isZero(f.XLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("x", alias), f.XLTE) + } + + if !isZero(f.YGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("y", alias), f.YGT) + } + if !isZero(f.YGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("y", alias), f.YGTE) + } + if !isZero(f.YLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("y", alias), f.YLT) + } + if !isZero(f.YLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("y", alias), f.YLTE) + } + + if !isZero(f.XY) { + q = q.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + for _, xy := range f.XY { + coords, err := ParseCoords(xy) + if err != nil { + continue + } + q = q.WhereOrGroup(func(q *orm.Query) (*orm.Query, error) { + q = q. + Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("x", alias), coords.X). + Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("y", alias), coords.Y) + return q, nil + }) + } + return q, nil + }) + } + + if !isZero(f.Points) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("points", alias), f.Points) + } + if !isZero(f.PointsGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsGT) + } + if !isZero(f.PointsGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsGTE) + } + if !isZero(f.PointsLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsLT) + } + if !isZero(f.PointsLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("points", alias), f.PointsLTE) + } + + if !isZero(f.Bonus) { + q = q.Where(gopgutil.BuildConditionEquals("?"), gopgutil.AddAliasToColumnName("bonus", alias), f.Bonus) + } + if !isZero(f.BonusGT) { + q = q.Where(gopgutil.BuildConditionGT("?"), gopgutil.AddAliasToColumnName("bonus", alias), f.BonusGT) + } + if !isZero(f.BonusGTE) { + q = q.Where(gopgutil.BuildConditionGTE("?"), gopgutil.AddAliasToColumnName("bonus", alias), f.BonusGTE) + } + if !isZero(f.BonusLT) { + q = q.Where(gopgutil.BuildConditionLT("?"), gopgutil.AddAliasToColumnName("bonus", alias), f.BonusLT) + } + if !isZero(f.BonusLTE) { + q = q.Where(gopgutil.BuildConditionLTE("?"), gopgutil.AddAliasToColumnName("bonus", alias), f.BonusLTE) + } + + if !isZero(f.PlayerID) { + q = q.Where(gopgutil.BuildConditionArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerID)) + } + if !isZero(f.PlayerIDNEQ) { + q = q.Where(gopgutil.BuildConditionNotInArray("?"), gopgutil.AddAliasToColumnName("player_id", alias), pg.Array(f.PlayerIDNEQ)) + } + + return q, nil +} + +func (f *VillageFilter) Where(q *orm.Query) (*orm.Query, error) { + return f.WhereWithAlias(q, "village") +} + +func (f *VillageFilter) WhereWithRelations(q *orm.Query) (*orm.Query, error) { + if f == nil { + return q, nil + } + + filtersToAppend := []filterToAppend{ + { + filter: f, + alias: "village", + }, + } + if f.PlayerFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter, + relationName: "Player", + }) + + if f.PlayerFilter.TribeFilter != nil { + filtersToAppend = append(filtersToAppend, filterToAppend{ + filter: f.PlayerFilter.TribeFilter, + relationName: "Player.Tribe", + }) + } + } + + return appendFilters(q, filtersToAppend...) +} diff --git a/tw/urls.go b/tw/twurlbuilder/build_url.go similarity index 52% rename from tw/urls.go rename to tw/twurlbuilder/build_url.go index 3304245..fcbb354 100644 --- a/tw/urls.go +++ b/tw/twurlbuilder/build_url.go @@ -1,4 +1,4 @@ -package tw +package twurlbuilder import "fmt" @@ -8,14 +8,18 @@ const ( EndpointVillageProfile = "/game.php?screen=info_village&id=%d" ) -func BuildVillageURL(server, host string, id int) string { - return fmt.Sprintf("https://%s.%s"+EndpointVillageProfile, server, host, id) -} - -func BuildTribeURL(server, host string, id int) string { - return fmt.Sprintf("https://%s.%s"+EndpointTribeProfile, server, host, id) +func BuildServerURL(server, host string) string { + return fmt.Sprintf("https://%s.%s", server, host) } func BuildPlayerURL(server, host string, id int) string { - return fmt.Sprintf("https://%s.%s"+EndpointPlayerProfile, server, host, id) + return BuildServerURL(server, host) + fmt.Sprintf(EndpointPlayerProfile, id) +} + +func BuildVillageURL(server, host string, id int) string { + return BuildServerURL(server, host) + fmt.Sprintf(EndpointVillageProfile, id) +} + +func BuildTribeURL(server, host string, id int) string { + return BuildServerURL(server, host) + fmt.Sprintf(EndpointTribeProfile, id) } diff --git a/tw/version_code_from_server_key.go b/tw/version_code_from_server_key.go deleted file mode 100644 index ec0d73a..0000000 --- a/tw/version_code_from_server_key.go +++ /dev/null @@ -1,12 +0,0 @@ -package tw - -import ( - "github.com/tribalwarshelp/shared/models" -) - -func VersionCodeFromServerKey(key string) models.VersionCode { - if len(key) < 2 { - return "" - } - return models.VersionCode(key[0:2]) -} diff --git a/utils/track_execution_time.go b/utils/track_execution_time.go deleted file mode 100644 index 99a05af..0000000 --- a/utils/track_execution_time.go +++ /dev/null @@ -1,21 +0,0 @@ -package utils - -import ( - "time" - - "github.com/sirupsen/logrus" -) - -func TrackExecutionTime(log *logrus.Entry, fn func(), fnName string) func() { - return func() { - now := time.Now() - log := log.WithField("fnName", fnName) - log.Infof("%s: called", fnName) - - fn() - - log. - WithField("executionTime", time.Since(now).String()). - Infof("%s: finished executing", fnName) - } -}