list.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. StdSelectorInitID := c.ctx.QueryArray("id[]")
  26. if len(StdSelectorInitID) > 0 {
  27. c.GormScope(func(tx *gorm.DB) *gorm.DB {
  28. return tx.Where(c.itemKey+" IN ?", StdSelectorInitID)
  29. })
  30. }
  31. }
  32. func (c *Ctx[T]) result() (*gorm.DB, bool) {
  33. for _, v := range c.preloads {
  34. t := v
  35. c.GormScope(func(tx *gorm.DB) *gorm.DB {
  36. tx = tx.Preload(t)
  37. return tx
  38. })
  39. }
  40. c.beforeExecuteHook()
  41. var dbModel T
  42. result := model.UseDB()
  43. if cast.ToBool(c.ctx.Query("trash")) {
  44. stmt := &gorm.Statement{DB: model.UseDB()}
  45. err := stmt.Parse(&dbModel)
  46. if err != nil {
  47. logger.Error(err)
  48. return nil, false
  49. }
  50. result = result.Unscoped().Where(stmt.Schema.Table + ".deleted_at IS NOT NULL")
  51. }
  52. result = result.Model(&dbModel)
  53. if c.table != "" {
  54. result = result.Table(c.table, c.tableArgs...)
  55. }
  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() (data any, ok bool) {
  63. result, ok := c.result()
  64. if !ok {
  65. return nil, false
  66. }
  67. result = result.Scopes(c.SortOrder())
  68. if c.scan == nil {
  69. models := make([]*T, 0)
  70. result.Find(&models)
  71. if c.transformer != nil {
  72. transformed := make([]any, 0)
  73. for k := range models {
  74. transformed = append(transformed, c.transformer(models[k]))
  75. }
  76. data = transformed
  77. } else {
  78. data = models
  79. }
  80. } else {
  81. data = c.scan(result)
  82. }
  83. return data, true
  84. }
  85. func (c *Ctx[T]) PagingListData() (*model.DataList, bool) {
  86. result, ok := c.result()
  87. if !ok {
  88. return nil, false
  89. }
  90. scopesResult := result.Scopes(c.OrderAndPaginate())
  91. data := &model.DataList{}
  92. if c.scan == nil {
  93. models := make([]*T, 0)
  94. scopesResult.Find(&models)
  95. if c.transformer != nil {
  96. transformed := make([]any, 0)
  97. for k := range models {
  98. transformed = append(transformed, c.transformer(models[k]))
  99. }
  100. data.Data = transformed
  101. } else {
  102. data.Data = models
  103. }
  104. } else {
  105. data.Data = c.scan(scopesResult)
  106. }
  107. var totalRecords int64
  108. delete(result.Statement.Clauses, "ORDER BY")
  109. delete(result.Statement.Clauses, "LIMIT")
  110. result.Count(&totalRecords)
  111. page := cast.ToInt(c.ctx.Query("page"))
  112. if page == 0 {
  113. page = 1
  114. }
  115. pageSize := settings.ServerSettings.PageSize
  116. if reqPageSize := c.ctx.Query("page_size"); reqPageSize != "" {
  117. pageSize = cast.ToInt(reqPageSize)
  118. }
  119. data.Pagination = model.Pagination{
  120. Total: totalRecords,
  121. PerPage: pageSize,
  122. CurrentPage: page,
  123. TotalPages: model.TotalPage(totalRecords, pageSize),
  124. }
  125. return data, true
  126. }
  127. func (c *Ctx[T]) PagingList() {
  128. data, ok := c.PagingListData()
  129. if ok {
  130. c.ctx.JSON(http.StatusOK, data)
  131. }
  132. }
  133. // EmptyPagingList return empty list
  134. func (c *Ctx[T]) EmptyPagingList() {
  135. pageSize := settings.ServerSettings.PageSize
  136. if reqPageSize := c.ctx.Query("page_size"); reqPageSize != "" {
  137. pageSize = cast.ToInt(reqPageSize)
  138. }
  139. data := &model.DataList{Data: make([]any, 0)}
  140. data.Pagination.PerPage = pageSize
  141. c.ctx.JSON(http.StatusOK, data)
  142. }