list.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. tableName := c.table
  45. if c.table == "" {
  46. stmt := &gorm.Statement{DB: model.UseDB()}
  47. err := stmt.Parse(&dbModel)
  48. if err != nil {
  49. logger.Error(err)
  50. return nil, false
  51. }
  52. tableName = stmt.Schema.Table
  53. }
  54. result = result.Unscoped().Where(tableName + ".deleted_at IS NOT NULL")
  55. }
  56. result = result.Model(&dbModel)
  57. if c.table != "" {
  58. result = result.Table(c.table, c.tableArgs...)
  59. }
  60. c.combineStdSelectorRequest()
  61. if len(c.gormScopes) > 0 {
  62. result = result.Scopes(c.gormScopes...)
  63. }
  64. return result, true
  65. }
  66. func (c *Ctx[T]) ListAllData() (data any, ok bool) {
  67. result, ok := c.result()
  68. if !ok {
  69. return nil, false
  70. }
  71. result = result.Scopes(c.SortOrder())
  72. if c.scan == nil {
  73. models := make([]*T, 0)
  74. result.Find(&models)
  75. if c.transformer != nil {
  76. transformed := make([]any, 0)
  77. for k := range models {
  78. transformed = append(transformed, c.transformer(models[k]))
  79. }
  80. data = transformed
  81. } else {
  82. data = models
  83. }
  84. } else {
  85. data = c.scan(result)
  86. }
  87. return data, true
  88. }
  89. func (c *Ctx[T]) PagingListData() (*model.DataList, bool) {
  90. result, ok := c.result()
  91. if !ok {
  92. return nil, false
  93. }
  94. scopesResult := result.Scopes(c.OrderAndPaginate())
  95. data := &model.DataList{}
  96. if c.scan == nil {
  97. models := make([]*T, 0)
  98. scopesResult.Find(&models)
  99. if c.transformer != nil {
  100. transformed := make([]any, 0)
  101. for k := range models {
  102. transformed = append(transformed, c.transformer(models[k]))
  103. }
  104. data.Data = transformed
  105. } else {
  106. data.Data = models
  107. }
  108. } else {
  109. data.Data = c.scan(scopesResult)
  110. }
  111. var totalRecords int64
  112. delete(result.Statement.Clauses, "ORDER BY")
  113. delete(result.Statement.Clauses, "LIMIT")
  114. result.Count(&totalRecords)
  115. page := cast.ToInt(c.ctx.Query("page"))
  116. if page == 0 {
  117. page = 1
  118. }
  119. pageSize := settings.ServerSettings.PageSize
  120. if reqPageSize := c.ctx.Query("page_size"); reqPageSize != "" {
  121. pageSize = cast.ToInt(reqPageSize)
  122. }
  123. data.Pagination = model.Pagination{
  124. Total: totalRecords,
  125. PerPage: pageSize,
  126. CurrentPage: page,
  127. TotalPages: model.TotalPage(totalRecords, pageSize),
  128. }
  129. return data, true
  130. }
  131. func (c *Ctx[T]) PagingList() {
  132. data, ok := c.PagingListData()
  133. if ok {
  134. c.ctx.JSON(http.StatusOK, data)
  135. }
  136. }
  137. // EmptyPagingList return empty list
  138. func (c *Ctx[T]) EmptyPagingList() {
  139. pageSize := settings.ServerSettings.PageSize
  140. if reqPageSize := c.ctx.Query("page_size"); reqPageSize != "" {
  141. pageSize = cast.ToInt(reqPageSize)
  142. }
  143. data := &model.DataList{Data: make([]any, 0)}
  144. data.Pagination.PerPage = pageSize
  145. c.ctx.JSON(http.StatusOK, data)
  146. }