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, }) }