model.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package model
  2. import (
  3. "fmt"
  4. "github.com/0xJacky/Nginx-UI/internal/logger"
  5. "github.com/0xJacky/Nginx-UI/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 UseDB() *gorm.DB {
  45. return db
  46. }
  47. func Init() *gorm.DB {
  48. dbPath := path.Join(path.Dir(settings.ConfPath), fmt.Sprintf("%s.db", settings.ServerSettings.Database))
  49. var err error
  50. db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
  51. Logger: logMode(),
  52. PrepareStmt: true,
  53. DisableForeignKeyConstraintWhenMigrating: true,
  54. })
  55. if err != nil {
  56. logger.Fatal(err.Error())
  57. }
  58. // Migrate the schema
  59. err = db.AutoMigrate(GenerateAllModel()...)
  60. if err != nil {
  61. logger.Fatal(err.Error())
  62. }
  63. return db
  64. }
  65. func orderAndPaginate(c *gin.Context) func(db *gorm.DB) *gorm.DB {
  66. return func(db *gorm.DB) *gorm.DB {
  67. sort := c.DefaultQuery("sort", "desc")
  68. order := c.DefaultQuery("order_by", "id") +
  69. " " + sort
  70. page := cast.ToInt(c.Query("page"))
  71. if page == 0 {
  72. page = 1
  73. }
  74. pageSize := settings.ServerSettings.PageSize
  75. reqPageSize := c.Query("page_size")
  76. if reqPageSize != "" {
  77. pageSize = cast.ToInt(reqPageSize)
  78. }
  79. offset := (page - 1) * pageSize
  80. return db.Order(order).Offset(offset).Limit(pageSize)
  81. }
  82. }
  83. func totalPage(total int64, pageSize int) int64 {
  84. n := total / int64(pageSize)
  85. if total%int64(pageSize) > 0 {
  86. n++
  87. }
  88. return n
  89. }
  90. type Pagination struct {
  91. Total int64 `json:"total"`
  92. PerPage int `json:"per_page"`
  93. CurrentPage int `json:"current_page"`
  94. TotalPages int64 `json:"total_pages"`
  95. }
  96. type DataList struct {
  97. Data interface{} `json:"data"`
  98. Pagination Pagination `json:"pagination,omitempty"`
  99. }
  100. func GetListWithPagination(models interface{},
  101. c *gin.Context, totalRecords int64) (result DataList) {
  102. page := cast.ToInt(c.Query("page"))
  103. if page == 0 {
  104. page = 1
  105. }
  106. result = DataList{}
  107. result.Data = models
  108. pageSize := settings.ServerSettings.PageSize
  109. reqPageSize := c.Query("page_size")
  110. if reqPageSize != "" {
  111. pageSize = cast.ToInt(reqPageSize)
  112. }
  113. result.Pagination = Pagination{
  114. Total: totalRecords,
  115. PerPage: pageSize,
  116. CurrentPage: page,
  117. TotalPages: totalPage(totalRecords, pageSize),
  118. }
  119. return
  120. }
  121. type Method interface {
  122. // FirstByID Where("id=@id")
  123. FirstByID(id int) (*gen.T, error)
  124. // DeleteByID update @@table set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=@id
  125. DeleteByID(id int) error
  126. }