model.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package model
  2. import (
  3. "fmt"
  4. "github.com/0xJacky/Nginx-UI/server/internal/logger"
  5. "github.com/0xJacky/Nginx-UI/server/settings"
  6. "github.com/gin-gonic/gin"
  7. "github.com/spf13/cast"
  8. "gorm.io/driver/sqlite"
  9. "gorm.io/gen"
  10. "gorm.io/gorm"
  11. gormlogger "gorm.io/gorm/logger"
  12. "path"
  13. "time"
  14. )
  15. var db *gorm.DB
  16. type Model struct {
  17. ID int `gorm:"primary_key" json:"id"`
  18. CreatedAt time.Time `json:"created_at"`
  19. UpdatedAt time.Time `json:"updated_at"`
  20. DeletedAt *gorm.DeletedAt `gorm:"index" json:"deleted_at"`
  21. }
  22. func GenerateAllModel() []any {
  23. return []any{
  24. ConfigBackup{},
  25. Auth{},
  26. AuthToken{},
  27. Cert{},
  28. ChatGPTLog{},
  29. Site{},
  30. DnsCredential{},
  31. Environment{},
  32. }
  33. }
  34. func logMode() gormlogger.Interface {
  35. switch settings.ServerSettings.RunMode {
  36. case gin.ReleaseMode:
  37. return gormlogger.Default.LogMode(gormlogger.Warn)
  38. default:
  39. fallthrough
  40. case gin.DebugMode:
  41. return gormlogger.Default.LogMode(gormlogger.Info)
  42. }
  43. }
  44. func Init() *gorm.DB {
  45. dbPath := path.Join(path.Dir(settings.ConfPath), fmt.Sprintf("%s.db", settings.ServerSettings.Database))
  46. var err error
  47. db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
  48. Logger: logMode(),
  49. PrepareStmt: true,
  50. DisableForeignKeyConstraintWhenMigrating: true,
  51. })
  52. if err != nil {
  53. logger.Fatal(err.Error())
  54. }
  55. // Migrate the schema
  56. err = db.AutoMigrate(GenerateAllModel()...)
  57. if err != nil {
  58. logger.Fatal(err.Error())
  59. }
  60. return db
  61. }
  62. func orderAndPaginate(c *gin.Context) func(db *gorm.DB) *gorm.DB {
  63. return func(db *gorm.DB) *gorm.DB {
  64. sort := c.DefaultQuery("sort", "desc")
  65. order := c.DefaultQuery("order_by", "id") +
  66. " " + sort
  67. page := cast.ToInt(c.Query("page"))
  68. if page == 0 {
  69. page = 1
  70. }
  71. pageSize := settings.ServerSettings.PageSize
  72. reqPageSize := c.Query("page_size")
  73. if reqPageSize != "" {
  74. pageSize = cast.ToInt(reqPageSize)
  75. }
  76. offset := (page - 1) * pageSize
  77. return db.Order(order).Offset(offset).Limit(pageSize)
  78. }
  79. }
  80. func totalPage(total int64, pageSize int) int64 {
  81. n := total / int64(pageSize)
  82. if total%int64(pageSize) > 0 {
  83. n++
  84. }
  85. return n
  86. }
  87. type Pagination struct {
  88. Total int64 `json:"total"`
  89. PerPage int `json:"per_page"`
  90. CurrentPage int `json:"current_page"`
  91. TotalPages int64 `json:"total_pages"`
  92. }
  93. type DataList struct {
  94. Data interface{} `json:"data"`
  95. Pagination Pagination `json:"pagination,omitempty"`
  96. }
  97. func GetListWithPagination(models interface{},
  98. c *gin.Context, totalRecords int64) (result DataList) {
  99. page := cast.ToInt(c.Query("page"))
  100. if page == 0 {
  101. page = 1
  102. }
  103. result = DataList{}
  104. result.Data = models
  105. pageSize := settings.ServerSettings.PageSize
  106. reqPageSize := c.Query("page_size")
  107. if reqPageSize != "" {
  108. pageSize = cast.ToInt(reqPageSize)
  109. }
  110. result.Pagination = Pagination{
  111. Total: totalRecords,
  112. PerPage: pageSize,
  113. CurrentPage: page,
  114. TotalPages: totalPage(totalRecords, pageSize),
  115. }
  116. return
  117. }
  118. type Method interface {
  119. // FirstByID Where("id=@id")
  120. FirstByID(id int) (*gen.T, error)
  121. // DeleteByID update @@table set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=@id
  122. DeleteByID(id int) error
  123. }