66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package controllers
|
|
|
|
import (
|
|
"github.com/gofiber/fiber/v3"
|
|
|
|
"server/internal/models"
|
|
)
|
|
|
|
type AdminController struct{}
|
|
|
|
func NewAdminController() *AdminController {
|
|
return &AdminController{}
|
|
}
|
|
|
|
// Typescript: interface
|
|
type ListUsersRequest struct {
|
|
Page int `json:"page" validate:"omitempty,min=1"`
|
|
PageSize int `json:"pageSize" validate:"omitempty,min=1,max=100"`
|
|
}
|
|
|
|
// ListUsers returns a paginated list of users (requires admin permissions).
|
|
func (ac *AdminController) ListUsers(c fiber.Ctx) error {
|
|
var req ListUsersRequest
|
|
if err := c.Bind().Body(&req); err != nil {
|
|
return fiber.NewError(fiber.StatusBadRequest, "invalid payload")
|
|
}
|
|
if err := validateStruct(&req); err != nil {
|
|
return err
|
|
}
|
|
if req.Page <= 0 {
|
|
req.Page = 1
|
|
}
|
|
if req.PageSize <= 0 || req.PageSize > 100 {
|
|
req.PageSize = 20
|
|
}
|
|
|
|
db, err := dbFromCtx(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var list []models.User
|
|
offset := (req.Page - 1) * req.PageSize
|
|
if err := db.Preload("Details").Preload("Preferences").
|
|
Limit(req.PageSize).
|
|
Offset(offset).
|
|
Find(&list).Error; err != nil {
|
|
return fiber.NewError(fiber.StatusInternalServerError, "failed to load users")
|
|
}
|
|
|
|
// Map to short representation
|
|
short := make([]models.UserShort, 0, len(list))
|
|
for i := range list {
|
|
short = append(short, models.ToUserShort(&list[i]))
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"data": fiber.Map{
|
|
"page": req.Page,
|
|
"pageSize": req.PageSize,
|
|
"items": short,
|
|
},
|
|
"error": nil,
|
|
})
|
|
}
|