page.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package qs
  2. import (
  3. "net/http"
  4. "net/url"
  5. )
  6. // Page represents a combination of pagination, filter and sort parameters for, most likely, a database query.
  7. type Page struct {
  8. Pagination *Pagination `json:"pagination"`
  9. Filters Filters `json:"filters,omitempty"`
  10. Sorts Sorts `json:"sorts,omitempty"`
  11. Joins Joins `json:"joins,omitempty"`
  12. }
  13. // ReadPageOptions configures the behaviour of ReadPage.
  14. type ReadPageOptions struct {
  15. Pagination *ReadPaginationOptions
  16. Filter *ReadFiltersOptions
  17. Sort *ReadSortsOptions
  18. Join *ReadJoinsOptions
  19. }
  20. // ReadPage parses URL values into a convenient Page struct.
  21. func ReadPage(values url.Values, opt *ReadPageOptions) (*Page, error) {
  22. opt = initPageOptions(opt)
  23. pag, err := ReadPagination(values, opt.Pagination)
  24. if err != nil {
  25. return nil, err
  26. }
  27. filters, err := ReadFilters(values, opt.Filter)
  28. if err != nil {
  29. return nil, err
  30. }
  31. sorts, err := ReadSorts(values, opt.Sort)
  32. if err != nil {
  33. return nil, err
  34. }
  35. joins, err := ReadJoins(values, opt.Join)
  36. if err != nil {
  37. return nil, err
  38. }
  39. page := &Page{
  40. Pagination: pag,
  41. Filters: filters,
  42. Sorts: sorts,
  43. Joins: joins,
  44. }
  45. return page, nil
  46. }
  47. // ReadRequestPage parses a request's query string into a convenient Page struct.
  48. // This function always returns a value if it does not encounter an error.
  49. func ReadRequestPage(req *http.Request, opt *ReadPageOptions) (*Page, error) {
  50. return ReadPage(req.URL.Query(), opt)
  51. }
  52. // ReadStringPage parses a query string literal into a convenient Page struct.
  53. // This function always returns a value if it does not encounter an error.
  54. func ReadStringPage(qs string, opt *ReadPageOptions) (*Page, error) {
  55. values, err := url.ParseQuery(qs)
  56. if err != nil {
  57. return nil, err
  58. }
  59. return ReadPage(values, opt)
  60. }
  61. func initPageOptions(opt *ReadPageOptions) *ReadPageOptions {
  62. def := &ReadPageOptions{}
  63. if opt != nil {
  64. def.Pagination = initPaginationOptions(opt.Pagination)
  65. def.Filter = initFiltersOptions(opt.Filter)
  66. def.Sort = initSortsOptions(opt.Sort)
  67. }
  68. return def
  69. }