model.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package model
  2. import (
  3. "fmt"
  4. "github.com/0xJacky/Nginx-UI/server/settings"
  5. "github.com/gin-gonic/gin"
  6. "github.com/spf13/cast"
  7. "gorm.io/driver/sqlite"
  8. "gorm.io/gorm"
  9. "gorm.io/gorm/logger"
  10. "log"
  11. "path"
  12. "time"
  13. )
  14. var db *gorm.DB
  15. type Model struct {
  16. ID uint `gorm:"primary_key" json:"id"`
  17. CreatedAt time.Time `json:"created_at"`
  18. UpdatedAt time.Time `json:"updated_at"`
  19. DeletedAt *time.Time `gorm:"index" json:"deleted_at"`
  20. }
  21. func Init() {
  22. dbPath := path.Join(path.Dir(settings.ConfPath), fmt.Sprintf("%s.db", settings.ServerSettings.Database))
  23. var err error
  24. db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
  25. Logger: logger.Default.LogMode(logger.Info),
  26. PrepareStmt: true,
  27. })
  28. if err != nil {
  29. log.Println(err)
  30. }
  31. // Migrate the schema
  32. AutoMigrate(&ConfigBackup{})
  33. AutoMigrate(&Auth{})
  34. AutoMigrate(&AuthToken{})
  35. AutoMigrate(&Cert{})
  36. }
  37. func AutoMigrate(model interface{}) {
  38. err := db.AutoMigrate(model)
  39. if err != nil {
  40. log.Fatal(err)
  41. }
  42. }
  43. func orderAndPaginate(c *gin.Context) func(db *gorm.DB) *gorm.DB {
  44. return func(db *gorm.DB) *gorm.DB {
  45. sort := c.DefaultQuery("sort", "desc")
  46. order := c.DefaultQuery("order_by", "id") +
  47. " " + sort
  48. page := cast.ToInt(c.Query("page"))
  49. if page == 0 {
  50. page = 1
  51. }
  52. pageSize := settings.ServerSettings.PageSize
  53. reqPageSize := c.Query("page_size")
  54. if reqPageSize != "" {
  55. pageSize = cast.ToInt(reqPageSize)
  56. }
  57. offset := (page - 1) * pageSize
  58. return db.Order(order).Offset(offset).Limit(pageSize)
  59. }
  60. }
  61. func totalPage(total int64, pageSize int) int64 {
  62. n := total / int64(pageSize)
  63. if total%int64(pageSize) > 0 {
  64. n++
  65. }
  66. return n
  67. }
  68. type Pagination struct {
  69. Total int64 `json:"total"`
  70. PerPage int `json:"per_page"`
  71. CurrentPage int `json:"current_page"`
  72. TotalPages int64 `json:"total_pages"`
  73. }
  74. type DataList struct {
  75. Data interface{} `json:"data"`
  76. Pagination Pagination `json:"pagination,omitempty"`
  77. }
  78. func GetListWithPagination(models interface{},
  79. c *gin.Context, totalRecords int64) (result DataList) {
  80. page := cast.ToInt(c.Query("page"))
  81. if page == 0 {
  82. page = 1
  83. }
  84. result = DataList{}
  85. result.Data = models
  86. pageSize := settings.ServerSettings.PageSize
  87. reqPageSize := c.Query("page_size")
  88. if reqPageSize != "" {
  89. pageSize = cast.ToInt(reqPageSize)
  90. }
  91. result.Pagination = Pagination{
  92. Total: totalRecords,
  93. PerPage: pageSize,
  94. CurrentPage: page,
  95. TotalPages: totalPage(totalRecords, pageSize),
  96. }
  97. return
  98. }