// Package httputil provides HTTP utility functions for the KnowFoolery application. package httputil import ( "strconv" "github.com/gofiber/fiber/v3" "knowfoolery/backend/shared/domain/types" ) // PaginationFromQuery extracts pagination parameters from query string. func PaginationFromQuery(c fiber.Ctx) types.Pagination { page := c.Query("page", "1") pageSize := c.Query("page_size", strconv.Itoa(types.DefaultPageSize)) pageNum, err := strconv.Atoi(page) if err != nil || pageNum < 1 { pageNum = 1 } pageSizeNum, err := strconv.Atoi(pageSize) if err != nil || pageSizeNum < 1 { pageSizeNum = types.DefaultPageSize } if pageSizeNum > types.MaxPageSize { pageSizeNum = types.MaxPageSize } return types.Pagination{ Page: pageNum, PageSize: pageSizeNum, } } // SortingParams holds sorting parameters. type SortingParams struct { Field string Direction string // "asc" or "desc" } // DefaultSorting returns default sorting parameters. func DefaultSorting(defaultField string) SortingParams { return SortingParams{ Field: defaultField, Direction: "asc", } } // SortingFromQuery extracts sorting parameters from query string. func SortingFromQuery(c fiber.Ctx, defaultField string, allowedFields []string) SortingParams { sort := c.Query("sort", defaultField) direction := c.Query("direction", "asc") // Validate sort field isAllowed := false for _, field := range allowedFields { if field == sort { isAllowed = true break } } if !isAllowed { sort = defaultField } // Validate direction if direction != "asc" && direction != "desc" { direction = "asc" } return SortingParams{ Field: sort, Direction: direction, } } // FilterParams holds common filter parameters. type FilterParams struct { Search string Status string DateFrom string DateTo string Custom map[string]string } // FiltersFromQuery extracts common filter parameters from query string. func FiltersFromQuery(c fiber.Ctx) FilterParams { return FilterParams{ Search: c.Query("search"), Status: c.Query("status"), DateFrom: c.Query("date_from"), DateTo: c.Query("date_to"), Custom: make(map[string]string), } } // WithCustomFilter adds a custom filter parameter. func (f *FilterParams) WithCustomFilter(c fiber.Ctx, name string) *FilterParams { if value := c.Query(name); value != "" { f.Custom[name] = value } return f } // QueryParams holds all common query parameters. type QueryParams struct { Pagination types.Pagination Sorting SortingParams Filters FilterParams } // QueryParamsFromContext extracts all common query parameters. func QueryParamsFromContext(c fiber.Ctx, defaultSortField string, allowedSortFields []string) QueryParams { return QueryParams{ Pagination: PaginationFromQuery(c), Sorting: SortingFromQuery(c, defaultSortField, allowedSortFields), Filters: FiltersFromQuery(c), } }