1
0

model.go 6.1 KB

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