list.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. if err := c.ctx.ShouldBindJSON(&StdSelectorInitParams); err != nil {
  29. logger.Error(err)
  30. return
  31. }
  32. c.GormScope(func(tx *gorm.DB) *gorm.DB {
  33. return tx.Where(c.itemKey+" IN ?", StdSelectorInitParams.ID)
  34. })
  35. }
  36. func (c *Ctx[T]) result() (*gorm.DB, bool) {
  37. for _, v := range c.preloads {
  38. t := v
  39. c.GormScope(func(tx *gorm.DB) *gorm.DB {
  40. tx = tx.Preload(t)
  41. return tx
  42. })
  43. }
  44. c.beforeExecuteHook()
  45. var dbModel T
  46. result := model.UseDB()
  47. if cast.ToBool(c.ctx.Query("trash")) {
  48. stmt := &gorm.Statement{DB: model.UseDB()}
  49. err := stmt.Parse(&dbModel)
  50. if err != nil {
  51. logger.Error(err)
  52. return nil, false
  53. }
  54. result = result.Unscoped().Where(stmt.Schema.Table + ".deleted_at IS NOT NULL")
  55. }
  56. result = result.Model(&dbModel)
  57. c.combineStdSelectorRequest()
  58. if len(c.gormScopes) > 0 {
  59. result = result.Scopes(c.gormScopes...)
  60. }
  61. return result, true
  62. }
  63. func (c *Ctx[T]) ListAllData() ([]*T, bool) {
  64. result, ok := c.result()
  65. if !ok {
  66. return nil, false
  67. }
  68. result = result.Scopes(c.SortOrder())
  69. models := make([]*T, 0)
  70. result.Find(&models)
  71. return models, true
  72. }
  73. func (c *Ctx[T]) PagingListData() (*model.DataList, bool) {
  74. result, ok := c.result()
  75. if !ok {
  76. return nil, false
  77. }
  78. result = result.Scopes(c.OrderAndPaginate())
  79. data := &model.DataList{}
  80. if c.scan == nil {
  81. models := make([]*T, 0)
  82. result.Find(&models)
  83. if c.transformer != nil {
  84. transformed := make([]any, 0)
  85. for k := range models {
  86. transformed = append(transformed, c.transformer(models[k]))
  87. }
  88. data.Data = transformed
  89. } else {
  90. data.Data = models
  91. }
  92. } else {
  93. data.Data = c.scan(result)
  94. }
  95. page := cast.ToInt(c.ctx.Query("page"))
  96. if page == 0 {
  97. page = 1
  98. }
  99. pageSize := settings.ServerSettings.PageSize
  100. if reqPageSize := c.ctx.Query("page_size"); reqPageSize != "" {
  101. pageSize = cast.ToInt(reqPageSize)
  102. }
  103. var totalRecords int64
  104. result.Session(&gorm.Session{}).Count(&totalRecords)
  105. data.Pagination = model.Pagination{
  106. Total: totalRecords,
  107. PerPage: pageSize,
  108. CurrentPage: page,
  109. TotalPages: model.TotalPage(totalRecords, pageSize),
  110. }
  111. return data, true
  112. }
  113. func (c *Ctx[T]) PagingList() {
  114. data, ok := c.PagingListData()
  115. if ok {
  116. c.ctx.JSON(http.StatusOK, data)
  117. }
  118. }