63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
|
|
package criteria
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"github.com/navidrome/navidrome/log"
|
||
|
|
)
|
||
|
|
|
||
|
|
type SortField struct {
|
||
|
|
Field string
|
||
|
|
Desc bool
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c Criteria) OrderByFields() []SortField {
|
||
|
|
sortValue := c.Sort
|
||
|
|
if sortValue == "" {
|
||
|
|
sortValue = "title"
|
||
|
|
}
|
||
|
|
|
||
|
|
order := strings.ToLower(strings.TrimSpace(c.Order))
|
||
|
|
if order != "" && order != "asc" && order != "desc" {
|
||
|
|
log.Error("Invalid value in 'order' field. Valid values: 'asc', 'desc'", "order", c.Order)
|
||
|
|
order = ""
|
||
|
|
}
|
||
|
|
|
||
|
|
parts := strings.Split(sortValue, ",")
|
||
|
|
fields := make([]SortField, 0, len(parts))
|
||
|
|
for _, part := range parts {
|
||
|
|
part = strings.TrimSpace(part)
|
||
|
|
if part == "" {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
desc := false
|
||
|
|
if strings.HasPrefix(part, "+") || strings.HasPrefix(part, "-") {
|
||
|
|
desc = strings.HasPrefix(part, "-")
|
||
|
|
part = strings.TrimSpace(part[1:])
|
||
|
|
}
|
||
|
|
info, ok := LookupField(part)
|
||
|
|
if !ok {
|
||
|
|
log.Error("Invalid field in 'sort' field", "sort", part)
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
if order == "desc" {
|
||
|
|
desc = !desc
|
||
|
|
}
|
||
|
|
fields = append(fields, SortField{Field: info.Name, Desc: desc})
|
||
|
|
}
|
||
|
|
if len(fields) == 0 {
|
||
|
|
log.Warn("No valid sort fields found in 'sort', falling back to 'title'", "sort", sortValue)
|
||
|
|
return []SortField{{Field: "title", Desc: false}}
|
||
|
|
}
|
||
|
|
return fields
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c Criteria) SortFieldNames() []string {
|
||
|
|
sortFields := c.OrderByFields()
|
||
|
|
names := make([]string, len(sortFields))
|
||
|
|
for i, sf := range sortFields {
|
||
|
|
names[i] = sf.Field
|
||
|
|
}
|
||
|
|
return names
|
||
|
|
}
|