list.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package cosy
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/logger"
  4. "github.com/0xJacky/Nginx-UI/model"
  5. "github.com/0xJacky/Nginx-UI/settings"
  6. "github.com/gin-gonic/gin"
  7. "github.com/spf13/cast"
  8. "gorm.io/gorm"
  9. "net/http"
  10. )
  11. func GetPagingParams(c *gin.Context) (page, offset, pageSize int) {
  12. page = cast.ToInt(c.Query("page"))
  13. if page == 0 {
  14. page = 1
  15. }
  16. pageSize = settings.ServerSettings.PageSize
  17. reqPageSize := c.Query("page_size")
  18. if reqPageSize != "" {
  19. pageSize = cast.ToInt(reqPageSize)
  20. }
  21. offset = (page - 1) * pageSize
  22. return
  23. }
  24. func (c *Ctx[T]) combineStdSelectorRequest() {
  25. var StdSelectorInitParams struct {
  26. ID []int `json:"id"`
  27. }
  28. _ = c.ctx.ShouldBindJSON(&StdSelectorInitParams)
  29. if len(StdSelectorInitParams.ID) > 0 {
  30. c.GormScope(func(tx *gorm.DB) *gorm.DB {
  31. return tx.Where(c.itemKey+" IN ?", StdSelectorInitParams.ID)
  32. })
  33. }
  34. }
  35. func (c *Ctx[T]) result() (*gorm.DB, bool) {
  36. for _, v := range c.preloads {
  37. t := v
  38. c.GormScope(func(tx *gorm.DB) *gorm.DB {
  39. tx = tx.Preload(t)
  40. return tx
  41. })
  42. }
  43. c.beforeExecuteHook()
  44. var dbModel T
  45. result := model.UseDB()
  46. if cast.ToBool(c.ctx.Query("trash")) {
  47. stmt := &gorm.Statement{DB: model.UseDB()}
  48. err := stmt.Parse(&dbModel)
  49. if err != nil {
  50. logger.Error(err)
  51. return nil, false
  52. }
  53. result = result.Unscoped().Where(stmt.Schema.Table + ".deleted_at IS NOT NULL")
  54. }
  55. result = result.Model(&dbModel)
  56. c.combineStdSelectorRequest()
  57. if len(c.gormScopes) > 0 {
  58. result = result.Scopes(c.gormScopes...)
  59. }
  60. return result, true
  61. }
  62. func (c *Ctx[T]) ListAllData() ([]*T, bool) {
  63. result, ok := c.result()
  64. if !ok {
  65. return nil, false
  66. }
  67. result = result.Scopes(c.SortOrder())
  68. models := make([]*T, 0)
  69. result.Find(&models)
  70. return models, true
  71. }
  72. func (c *Ctx[T]) PagingListData() (*model.DataList, bool) {
  73. result, ok := c.result()
  74. if !ok {
  75. return nil, false
  76. }
  77. result = result.Scopes(c.OrderAndPaginate())
  78. data := &model.DataList{}
  79. if c.scan == nil {
  80. models := make([]*T, 0)
  81. result.Find(&models)
  82. if c.transformer != nil {
  83. transformed := make([]any, 0)
  84. for k := range models {
  85. transformed = append(transformed, c.transformer(models[k]))
  86. }
  87. data.Data = transformed
  88. } else {
  89. data.Data = models
  90. }
  91. } else {
  92. data.Data = c.scan(result)
  93. }
  94. page := cast.ToInt(c.ctx.Query("page"))
  95. if page == 0 {
  96. page = 1
  97. }
  98. pageSize := settings.ServerSettings.PageSize
  99. if reqPageSize := c.ctx.Query("page_size"); reqPageSize != "" {
  100. pageSize = cast.ToInt(reqPageSize)
  101. }
  102. var totalRecords int64
  103. result.Session(&gorm.Session{}).Count(&totalRecords)
  104. data.Pagination = model.Pagination{
  105. Total: totalRecords,
  106. PerPage: pageSize,
  107. CurrentPage: page,
  108. TotalPages: model.TotalPage(totalRecords, pageSize),
  109. }
  110. return data, true
  111. }
  112. func (c *Ctx[T]) PagingList() {
  113. data, ok := c.PagingListData()
  114. if ok {
  115. c.ctx.JSON(http.StatusOK, data)
  116. }
  117. }