sort.go 1.3 KB

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