admin lists: server-side pagination + filters for accounts/users/cdks/showcase/banned-words (limit/offset/total; stats over full set; /showcase/admin flat paginated view; dead=1 accounts filter for bulk dead-delete)

This commit is contained in:
Linda
2026-07-16 10:48:35 +08:00
committed by chiyi
parent 86559eb7fc
commit a65f52b7f4
12 changed files with 398 additions and 149 deletions
@@ -0,0 +1,33 @@
package handler
import "github.com/gin-gonic/gin"
// pageParams reads limit/offset query params with the given default page size.
// A limit of 0 (or negative) is treated as "return everything" so callers that
// need the full filtered set (e.g. bulk actions) can pass ?limit=0.
func pageParams(c *gin.Context, defLimit int) (limit, offset int) {
limit = parseInt(c.Query("limit"), defLimit)
if limit < 0 {
limit = 0
}
offset = parseInt(c.Query("offset"), 0)
if offset < 0 {
offset = 0
}
return limit, offset
}
// pageSlice returns items[offset : offset+limit], clamped to the slice bounds.
// limit <= 0 means "from offset to the end". Always returns a non-nil slice so
// it JSON-encodes as [] rather than null.
func pageSlice[T any](items []T, limit, offset int) []T {
n := len(items)
if offset >= n {
return []T{}
}
end := n
if limit > 0 && offset+limit < n {
end = offset + limit
}
return items[offset:end]
}