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