package store import ( "net/http" "strconv" "strings" "time" ) type PaginatedFeedQuery struct { Limit int `json:"limit" validate:"gte=1,lte=20"` Offset int `json:"offset" validate:"gte=0"` Sort string `json:"sort" validate:"oneof=asc desc"` Tags []string `json:"tags" validate:"max=5"` Search string `json:"search" validate:"max=100"` Since string `json:"since"` Until string `json:"until"` } func (fq PaginatedFeedQuery) Parse(r *http.Request) (PaginatedFeedQuery, error) { qs := r.URL.Query() limit := qs.Get("limit") if limit != "" { l, err := strconv.Atoi(limit) if err != nil { return fq, err } fq.Limit = l } offset := qs.Get("offset") if offset != "" { o, err := strconv.Atoi(offset) if err != nil { return PaginatedFeedQuery{}, err } fq.Offset = o } sort := qs.Get("sort") if sort != "" { fq.Sort = sort } tags := qs.Get("tags") if tags != "" { fq.Tags = strings.Split(tags, ",") } search := qs.Get("search") if search != "" { fq.Search = search } since := qs.Get("since") if since != "" { fq.Since = parseTime(since) } until := qs.Get("until") if until != "" { fq.Until = parseTime(until) } return fq, nil } func parseTime(s string) string { t, err := time.Parse(time.DateTime, s) if err != nil { return "" } return t.Format(time.DateTime) }