model.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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. "strings"
  14. "time"
  15. )
  16. var db *gorm.DB
  17. type Model struct {
  18. ID int `gorm:"primary_key" json:"id"`
  19. CreatedAt time.Time `json:"created_at"`
  20. UpdatedAt time.Time `json:"updated_at"`
  21. DeletedAt *gorm.DeletedAt `gorm:"index" json:"deleted_at"`
  22. }
  23. func GenerateAllModel() []any {
  24. return []any{
  25. ConfigBackup{},
  26. Auth{},
  27. AuthToken{},
  28. Cert{},
  29. ChatGPTLog{},
  30. Site{},
  31. DnsCredential{},
  32. Environment{},
  33. Notification{},
  34. }
  35. }
  36. func logMode() gormlogger.Interface {
  37. switch settings.ServerSettings.RunMode {
  38. case gin.ReleaseMode:
  39. return gormlogger.Default.LogMode(gormlogger.Warn)
  40. default:
  41. fallthrough
  42. case gin.DebugMode:
  43. return gormlogger.Default.LogMode(gormlogger.Info)
  44. }
  45. }
  46. func UseDB() *gorm.DB {
  47. return db
  48. }
  49. func Init() *gorm.DB {
  50. dbPath := path.Join(path.Dir(settings.ConfPath), fmt.Sprintf("%s.db", settings.ServerSettings.Database))
  51. var err error
  52. db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
  53. Logger: logMode(),
  54. PrepareStmt: true,
  55. DisableForeignKeyConstraintWhenMigrating: true,
  56. })
  57. if err != nil {
  58. logger.Fatal(err.Error())
  59. }
  60. // Migrate the schema
  61. err = db.AutoMigrate(GenerateAllModel()...)
  62. if err != nil {
  63. logger.Fatal(err.Error())
  64. }
  65. return db
  66. }
  67. type Pagination struct {
  68. Total int64 `json:"total"`
  69. PerPage int `json:"per_page"`
  70. CurrentPage int `json:"current_page"`
  71. TotalPages int64 `json:"total_pages"`
  72. }
  73. type DataList struct {
  74. Data interface{} `json:"data"`
  75. Pagination Pagination `json:"pagination,omitempty"`
  76. }
  77. func SortOrder(c *gin.Context) func(db *gorm.DB) *gorm.DB {
  78. return func(db *gorm.DB) *gorm.DB {
  79. sort := c.DefaultQuery("order", "desc")
  80. order := fmt.Sprintf("`%s` %s", DefaultQuery(c, "sort_by", "id"), sort)
  81. return db.Order(order)
  82. }
  83. }
  84. func OrderAndPaginate(c *gin.Context) func(db *gorm.DB) *gorm.DB {
  85. return func(db *gorm.DB) *gorm.DB {
  86. sort := c.DefaultQuery("order", "desc")
  87. order := fmt.Sprintf("`%s` %s", DefaultQuery(c, "sort_by", "id"), sort)
  88. db = db.Order(order)
  89. page := cast.ToInt(c.Query("page"))
  90. if page == 0 {
  91. page = 1
  92. }
  93. pageSize := settings.ServerSettings.PageSize
  94. reqPageSize := c.Query("page_size")
  95. if reqPageSize != "" {
  96. pageSize = cast.ToInt(reqPageSize)
  97. }
  98. offset := (page - 1) * pageSize
  99. return db.Offset(offset).Limit(pageSize)
  100. }
  101. }
  102. func QueryToInSearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
  103. for _, v := range keys {
  104. queryArray := c.QueryArray(v + "[]")
  105. if len(queryArray) == 0 {
  106. queryArray = c.QueryArray(v)
  107. }
  108. if len(queryArray) > 0 {
  109. var sb strings.Builder
  110. _, err := fmt.Fprintf(&sb, "`%s` IN ?", v)
  111. if err != nil {
  112. logger.Error(err)
  113. continue
  114. }
  115. db = db.Where(sb.String(), queryArray)
  116. }
  117. }
  118. return db
  119. }
  120. func QueryToEqualSearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
  121. for _, v := range keys {
  122. if c.Query(v) != "" {
  123. var sb strings.Builder
  124. _, err := fmt.Fprintf(&sb, "`%s` = ?", v)
  125. if err != nil {
  126. logger.Error(err)
  127. continue
  128. }
  129. db = db.Where(sb.String(), c.Query(v))
  130. }
  131. }
  132. return db
  133. }
  134. func QueryToFussySearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
  135. for _, v := range keys {
  136. if c.Query(v) != "" {
  137. var sb strings.Builder
  138. _, err := fmt.Fprintf(&sb, "`%s` LIKE ?", v)
  139. if err != nil {
  140. logger.Error(err)
  141. continue
  142. }
  143. var sbValue strings.Builder
  144. _, err = fmt.Fprintf(&sbValue, "%%%s%%", c.Query(v))
  145. if err != nil {
  146. logger.Error(err)
  147. continue
  148. }
  149. db = db.Where(sb.String(), sbValue.String())
  150. }
  151. }
  152. return db
  153. }
  154. func QueryToFussyKeysSearch(c *gin.Context, db *gorm.DB, value string, keys ...string) *gorm.DB {
  155. if c.Query(value) == "" {
  156. return db
  157. }
  158. var condition *gorm.DB
  159. for i, v := range keys {
  160. sb := v + " LIKE ?"
  161. sv := "%" + c.Query(value) + "%"
  162. switch i {
  163. case 0:
  164. condition = db.Where(db.Where(sb, sv))
  165. default:
  166. condition = condition.Or(sb, sv)
  167. }
  168. }
  169. return db.Where(condition)
  170. }
  171. func QueryToOrInSearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
  172. for _, v := range keys {
  173. queryArray := c.QueryArray(v + "[]")
  174. if len(queryArray) == 0 {
  175. queryArray = c.QueryArray(v)
  176. }
  177. if len(queryArray) > 0 {
  178. var sb strings.Builder
  179. _, err := fmt.Fprintf(&sb, "`%s` IN ?", v)
  180. if err != nil {
  181. logger.Error(err)
  182. continue
  183. }
  184. db = db.Or(sb.String(), queryArray)
  185. }
  186. }
  187. return db
  188. }
  189. func QueryToOrEqualSearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
  190. for _, v := range keys {
  191. if c.Query(v) != "" {
  192. var sb strings.Builder
  193. _, err := fmt.Fprintf(&sb, "`%s` = ?", v)
  194. if err != nil {
  195. logger.Error(err)
  196. continue
  197. }
  198. db = db.Or(sb.String(), c.Query(v))
  199. }
  200. }
  201. return db
  202. }
  203. func QueryToOrFussySearch(c *gin.Context, db *gorm.DB, keys ...string) *gorm.DB {
  204. for _, v := range keys {
  205. if c.Query(v) != "" {
  206. var sb strings.Builder
  207. _, err := fmt.Fprintf(&sb, "`%s` LIKE ?", v)
  208. if err != nil {
  209. logger.Error(err)
  210. continue
  211. }
  212. var sbValue strings.Builder
  213. _, err = fmt.Fprintf(&sbValue, "%%%s%%", c.Query(v))
  214. if err != nil {
  215. logger.Error(err)
  216. continue
  217. }
  218. db = db.Or(sb.String(), sbValue.String())
  219. }
  220. }
  221. return db
  222. }
  223. func TotalPage(total int64, pageSize int) int64 {
  224. n := total / int64(pageSize)
  225. if total%int64(pageSize) > 0 {
  226. n++
  227. }
  228. return n
  229. }
  230. func DefaultValue(c *gin.Context, key string, defaultValue any) any {
  231. if value, ok := c.Get(key); ok {
  232. return value
  233. }
  234. return defaultValue
  235. }
  236. func DefaultQuery(c *gin.Context, key string, defaultValue any) string {
  237. return c.DefaultQuery(key, DefaultValue(c, key, defaultValue).(string))
  238. }
  239. type Method interface {
  240. // FirstByID Where("id=@id")
  241. FirstByID(id int) (*gen.T, error)
  242. // DeleteByID update @@table set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=@id
  243. DeleteByID(id int) error
  244. }