sort.go 953 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package cosy
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/logger"
  4. "gorm.io/gorm"
  5. "gorm.io/gorm/schema"
  6. "strings"
  7. "sync"
  8. )
  9. func (c *Ctx[T]) SortOrder() func(db *gorm.DB) *gorm.DB {
  10. return func(db *gorm.DB) *gorm.DB {
  11. order := c.ctx.DefaultQuery("order", "desc")
  12. if order != "desc" && order != "asc" {
  13. order = "desc"
  14. }
  15. sortBy := c.ctx.DefaultQuery("sort_by", c.itemKey)
  16. s, _ := schema.Parse(c.Model, &sync.Map{}, schema.NamingStrategy{})
  17. if _, ok := s.FieldsByDBName[sortBy]; !ok && sortBy != c.itemKey {
  18. logger.Error("invalid order field:", sortBy)
  19. return db
  20. }
  21. var sb strings.Builder
  22. sb.WriteString(sortBy)
  23. sb.WriteString(" ")
  24. sb.WriteString(order)
  25. return db.Order(sb.String())
  26. }
  27. }
  28. func (c *Ctx[T]) OrderAndPaginate() func(db *gorm.DB) *gorm.DB {
  29. return func(db *gorm.DB) *gorm.DB {
  30. db = c.SortOrder()(db)
  31. _, offset, pageSize := GetPagingParams(c.ctx)
  32. return db.Offset(offset).Limit(pageSize)
  33. }
  34. }