53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
|
package common
|
||
|
|
||
|
import "strings"
|
||
|
|
||
|
// SortConfiguration is the configuration of Sort.
|
||
|
type SortConfiguration struct {
|
||
|
Allowed []string // Allowed parameters
|
||
|
Default string
|
||
|
DefaultSorting string // if empty, DESC
|
||
|
Table string
|
||
|
}
|
||
|
|
||
|
// Sort allows the request to modify how the query is sorted.
|
||
|
func Sort(md MethodData, config SortConfiguration) string {
|
||
|
if config.DefaultSorting == "" {
|
||
|
config.DefaultSorting = "DESC"
|
||
|
}
|
||
|
if config.Table != "" {
|
||
|
config.Table += "."
|
||
|
}
|
||
|
var sortBy string
|
||
|
for _, s := range md.C.Request.URL.Query()["sort"] {
|
||
|
sortParts := strings.Split(strings.ToLower(s), ",")
|
||
|
if contains(config.Allowed, sortParts[0]) {
|
||
|
if sortBy != "" {
|
||
|
sortBy += ", "
|
||
|
}
|
||
|
sortBy += config.Table + sortParts[0] + " "
|
||
|
if len(sortParts) > 1 && contains([]string{"asc", "desc"}, sortParts[1]) {
|
||
|
sortBy += sortParts[1]
|
||
|
} else {
|
||
|
sortBy += config.DefaultSorting
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if sortBy == "" {
|
||
|
sortBy = config.Default
|
||
|
}
|
||
|
if sortBy == "" {
|
||
|
return ""
|
||
|
}
|
||
|
return "ORDER BY " + sortBy
|
||
|
}
|
||
|
|
||
|
func contains(a []string, s string) bool {
|
||
|
for _, el := range a {
|
||
|
if s == el {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|