diff --git a/go.mod b/go.mod index 03effef..16e24ad 100644 --- a/go.mod +++ b/go.mod @@ -7,12 +7,13 @@ require ( github.com/gin-gonic/gin v1.6.3 github.com/go-pg/pg/v10 v10.0.0-beta.1 github.com/go-playground/validator/v10 v10.3.0 // indirect + github.com/go-redis/redis/v8 v8.0.0-beta.2 // indirect github.com/joho/godotenv v1.3.0 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.1 // indirect github.com/pkg/errors v0.9.1 github.com/segmentio/encoding v0.1.13 // indirect - github.com/tribalwarshelp/shared v0.0.0-20200603143626-e91530ae0889 + github.com/tribalwarshelp/shared v0.0.0-20200603152200-61e5804c01ae github.com/vektah/gqlparser/v2 v2.0.1 golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34 // indirect diff --git a/go.sum b/go.sum index b2293c8..74ac222 100644 --- a/go.sum +++ b/go.sum @@ -162,6 +162,8 @@ github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYm github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= github.com/tribalwarshelp/shared v0.0.0-20200603143626-e91530ae0889 h1:6wXJ4Hdh7NlLlTiAtQknHIZYoTZfYtU8nBXQvhUMRik= github.com/tribalwarshelp/shared v0.0.0-20200603143626-e91530ae0889/go.mod h1:Ej+yG8aDKHPLRUVYxn7bT9zA0sdZZoGGgVJAAPGCK/o= +github.com/tribalwarshelp/shared v0.0.0-20200603152200-61e5804c01ae h1:1fMU6i/EIDZafe1Ae93rt+gbVkNf/xX/REU015CtUOI= +github.com/tribalwarshelp/shared v0.0.0-20200603152200-61e5804c01ae/go.mod h1:tf+2yTHasV6jAF3V2deZ9slNoCyBzC0fMdTjI7clf6Y= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= diff --git a/langversion/usecase/langversion_usecase.go b/langversion/usecase/langversion_usecase.go index cd3b176..451d359 100644 --- a/langversion/usecase/langversion_usecase.go +++ b/langversion/usecase/langversion_usecase.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "github.com/tribalwarshelp/api/utils" + "github.com/tribalwarshelp/api/langversion" "github.com/tribalwarshelp/shared/models" ) @@ -25,6 +27,7 @@ func (ucase *usecase) Fetch(ctx context.Context, filter *models.LangVersionFilte if filter.Limit > langversion.PaginationLimit || filter.Limit <= 0 { filter.Limit = langversion.PaginationLimit } + filter.Sort = utils.SanitizeSort(filter.Sort) return ucase.repo.Fetch(ctx, filter) } diff --git a/player/usecase/player_usecase.go b/player/usecase/player_usecase.go index b193ebc..9c178a8 100644 --- a/player/usecase/player_usecase.go +++ b/player/usecase/player_usecase.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/tribalwarshelp/api/player" + "github.com/tribalwarshelp/api/utils" "github.com/tribalwarshelp/shared/models" ) @@ -23,6 +24,7 @@ func (ucase *usecase) Fetch(ctx context.Context, server string, filter *models.P if filter.Limit > player.PaginationLimit || filter.Limit <= 0 { filter.Limit = player.PaginationLimit } + filter.Sort = utils.SanitizeSort(filter.Sort) return ucase.repo.Fetch(ctx, server, filter) } diff --git a/server/usecase/server_usecase.go b/server/usecase/server_usecase.go index 199af8c..02b6746 100644 --- a/server/usecase/server_usecase.go +++ b/server/usecase/server_usecase.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/tribalwarshelp/api/server" + "github.com/tribalwarshelp/api/utils" "github.com/tribalwarshelp/shared/models" ) @@ -23,6 +24,7 @@ func (ucase *usecase) Fetch(ctx context.Context, filter *models.ServerFilter) ([ if filter.Limit > server.PaginationLimit || filter.Limit <= 0 { filter.Limit = server.PaginationLimit } + filter.Sort = utils.SanitizeSort(filter.Sort) return ucase.repo.Fetch(ctx, filter) } diff --git a/tribe/usecase/tribe_usecase.go b/tribe/usecase/tribe_usecase.go index 929e160..45584e1 100644 --- a/tribe/usecase/tribe_usecase.go +++ b/tribe/usecase/tribe_usecase.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/tribalwarshelp/api/tribe" + "github.com/tribalwarshelp/api/utils" "github.com/tribalwarshelp/shared/models" ) @@ -23,6 +24,7 @@ func (ucase *usecase) Fetch(ctx context.Context, server string, filter *models.T if filter.Limit > tribe.PaginationLimit || filter.Limit <= 0 { filter.Limit = tribe.PaginationLimit } + filter.Sort = utils.SanitizeSort(filter.Sort) return ucase.repo.Fetch(ctx, server, filter) } diff --git a/utils/sanitize_sort.go b/utils/sanitize_sort.go new file mode 100644 index 0000000..8e64456 --- /dev/null +++ b/utils/sanitize_sort.go @@ -0,0 +1,17 @@ +package utils + +import "strings" + +func SanitizeSort(sort string) string { + trimmed := strings.TrimSpace(sort) + splitted := strings.Split(trimmed, " ") + length := len(splitted) + if length < 1 { + return "" + } + keyword := "ASC" + if length == 2 && strings.ToUpper(splitted[1]) == "DESC" { + keyword = "DESC" + } + return strings.ToLower(Underscore(splitted[0])) + " " + keyword +} diff --git a/utils/underscore.go b/utils/underscore.go new file mode 100644 index 0000000..ee0b574 --- /dev/null +++ b/utils/underscore.go @@ -0,0 +1,61 @@ +package utils + +import ( + "unicode" + "unicode/utf8" +) + +type buffer struct { + r []byte + runeBytes [utf8.UTFMax]byte +} + +func (b *buffer) write(r rune) { + if r < utf8.RuneSelf { + b.r = append(b.r, byte(r)) + return + } + n := utf8.EncodeRune(b.runeBytes[0:], r) + b.r = append(b.r, b.runeBytes[0:n]...) +} + +func (b *buffer) indent() { + if len(b.r) > 0 { + b.r = append(b.r, '_') + } +} + +func Underscore(s string) string { + b := buffer{ + r: make([]byte, 0, len(s)), + } + var m rune + var w bool + for _, ch := range s { + if unicode.IsUpper(ch) { + if m != 0 { + if !w { + b.indent() + w = true + } + b.write(m) + } + m = unicode.ToLower(ch) + } else { + if m != 0 { + b.indent() + b.write(m) + m = 0 + w = false + } + b.write(ch) + } + } + if m != 0 { + if !w { + b.indent() + } + b.write(m) + } + return string(b.r) +} diff --git a/village/constants.go b/village/constants.go index 0de83fb..6da6f56 100644 --- a/village/constants.go +++ b/village/constants.go @@ -1,5 +1,5 @@ package village const ( - PaginationLimit = 100 + PaginationLimit = 1000 ) diff --git a/village/usecase/village_usecase.go b/village/usecase/village_usecase.go index 11dec80..aaaf381 100644 --- a/village/usecase/village_usecase.go +++ b/village/usecase/village_usecase.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/tribalwarshelp/api/utils" "github.com/tribalwarshelp/api/village" "github.com/tribalwarshelp/shared/models" ) @@ -23,6 +24,7 @@ func (ucase *usecase) Fetch(ctx context.Context, server string, filter *models.V if filter.Limit > village.PaginationLimit || filter.Limit <= 0 { filter.Limit = village.PaginationLimit } + filter.Sort = utils.SanitizeSort(filter.Sort) return ucase.repo.Fetch(ctx, server, filter) }