mirror of
https://github.com/EZ-Api/ez-api.git
synced 2026-01-13 17:47:51 +00:00
feat(api): add model delete, pagination, and cors config
This commit is contained in:
88
internal/api/list_query.go
Normal file
88
internal/api/list_query.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type listQuery struct {
|
||||
Page int
|
||||
Limit int
|
||||
Offset int
|
||||
Search string
|
||||
Enabled bool
|
||||
}
|
||||
|
||||
func parseListQuery(c *gin.Context) listQuery {
|
||||
var q listQuery
|
||||
if c == nil {
|
||||
return q
|
||||
}
|
||||
if raw := strings.TrimSpace(c.Query("search")); raw != "" {
|
||||
q.Search = raw
|
||||
q.Enabled = true
|
||||
}
|
||||
if raw := strings.TrimSpace(c.Query("page")); raw != "" {
|
||||
if v, err := strconv.Atoi(raw); err == nil && v > 0 {
|
||||
q.Page = v
|
||||
}
|
||||
q.Enabled = true
|
||||
}
|
||||
if raw := strings.TrimSpace(c.Query("limit")); raw != "" {
|
||||
if v, err := strconv.Atoi(raw); err == nil && v > 0 {
|
||||
q.Limit = v
|
||||
}
|
||||
q.Enabled = true
|
||||
}
|
||||
if q.Enabled {
|
||||
if q.Limit <= 0 {
|
||||
q.Limit = 50
|
||||
}
|
||||
if q.Limit > 200 {
|
||||
q.Limit = 200
|
||||
}
|
||||
if q.Page <= 0 {
|
||||
q.Page = 1
|
||||
}
|
||||
q.Offset = (q.Page - 1) * q.Limit
|
||||
}
|
||||
return q
|
||||
}
|
||||
|
||||
func applyListSearch(q *gorm.DB, search string, fields ...string) *gorm.DB {
|
||||
if q == nil {
|
||||
return q
|
||||
}
|
||||
search = strings.TrimSpace(search)
|
||||
if search == "" || len(fields) == 0 {
|
||||
return q
|
||||
}
|
||||
pattern := "%" + strings.ToLower(search) + "%"
|
||||
clauses := make([]string, 0, len(fields))
|
||||
args := make([]any, 0, len(fields))
|
||||
for _, field := range fields {
|
||||
field = strings.TrimSpace(field)
|
||||
if field == "" {
|
||||
continue
|
||||
}
|
||||
clauses = append(clauses, "LOWER("+field+") LIKE ?")
|
||||
args = append(args, pattern)
|
||||
}
|
||||
if len(clauses) == 0 {
|
||||
return q
|
||||
}
|
||||
return q.Where(strings.Join(clauses, " OR "), args...)
|
||||
}
|
||||
|
||||
func applyListPagination(q *gorm.DB, query listQuery) *gorm.DB {
|
||||
if q == nil {
|
||||
return q
|
||||
}
|
||||
if !query.Enabled {
|
||||
return q
|
||||
}
|
||||
return q.Limit(query.Limit).Offset(query.Offset)
|
||||
}
|
||||
Reference in New Issue
Block a user