sort.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package cosy
  2. import (
  3. "fmt"
  4. "github.com/0xJacky/Nginx-UI/internal/logger"
  5. "gorm.io/gorm"
  6. "gorm.io/gorm/schema"
  7. "sync"
  8. )
  9. func (c *Ctx[T]) SortOrder() func(db *gorm.DB) *gorm.DB {
  10. return func(db *gorm.DB) *gorm.DB {
  11. sort := c.ctx.DefaultQuery("order", "desc")
  12. if sort != "desc" && sort != "asc" {
  13. sort = "desc"
  14. }
  15. order := c.itemKey
  16. if value, ok := c.ctx.Get("order"); ok {
  17. // check if the order field is valid
  18. // todo: maybe we can use more generic way to check if the sort_by is valid
  19. s, _ := schema.Parse(c.Model, &sync.Map{}, schema.NamingStrategy{})
  20. if _, ok := s.FieldsByDBName[value.(string)]; ok {
  21. order = value.(string)
  22. } else {
  23. logger.Error("invalid order field:", order)
  24. }
  25. } else if value, ok := c.ctx.Get("sort_by"); ok {
  26. order = value.(string)
  27. }
  28. order = fmt.Sprintf("%s %s", order, sort)
  29. return db.Order(order)
  30. }
  31. }
  32. func (c *Ctx[T]) OrderAndPaginate() func(db *gorm.DB) *gorm.DB {
  33. return func(db *gorm.DB) *gorm.DB {
  34. db = c.SortOrder()(db)
  35. _, offset, pageSize := GetPagingParams(c.ctx)
  36. return db.Offset(offset).Limit(pageSize)
  37. }
  38. }