Expose learning, registration controls, mentor chat, realtime WebSocket, and staff administration.
67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
"reflect"
|
|
"strconv"
|
|
)
|
|
|
|
const (
|
|
defaultPageSize = 10
|
|
maxPageSize = 100
|
|
)
|
|
|
|
type pageParams struct {
|
|
Page int
|
|
PageSize int
|
|
Offset int
|
|
}
|
|
|
|
// parsePageParams reads page + pageSize (or limit) from the query string.
|
|
// Defaults: page=1, pageSize=10. pageSize is capped at 100.
|
|
func parsePageParams(r *http.Request) pageParams {
|
|
page := 1
|
|
pageSize := defaultPageSize
|
|
|
|
if v := r.URL.Query().Get("page"); v != "" {
|
|
if n, err := strconv.Atoi(v); err == nil && n > 0 {
|
|
page = n
|
|
}
|
|
}
|
|
if v := r.URL.Query().Get("pageSize"); v != "" {
|
|
if n, err := strconv.Atoi(v); err == nil && n > 0 {
|
|
pageSize = n
|
|
}
|
|
} else if v := r.URL.Query().Get("limit"); v != "" {
|
|
if n, err := strconv.Atoi(v); err == nil && n > 0 {
|
|
pageSize = n
|
|
}
|
|
}
|
|
if pageSize > maxPageSize {
|
|
pageSize = maxPageSize
|
|
}
|
|
|
|
return pageParams{
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
Offset: (page - 1) * pageSize,
|
|
}
|
|
}
|
|
|
|
func writePage(w http.ResponseWriter, items any, total int64, p pageParams) {
|
|
if items == nil {
|
|
items = []any{}
|
|
} else {
|
|
v := reflect.ValueOf(items)
|
|
if v.Kind() == reflect.Slice && v.IsNil() {
|
|
items = reflect.MakeSlice(v.Type(), 0, 0).Interface()
|
|
}
|
|
}
|
|
writeJSON(w, http.StatusOK, map[string]any{
|
|
"items": items,
|
|
"total": total,
|
|
"page": p.Page,
|
|
"pageSize": p.PageSize,
|
|
})
|
|
}
|