github.com/kyma-project/kyma-environment-broker@v0.0.1/common/pagination/pagination.go (about) 1 package pagination 2 3 import ( 4 "fmt" 5 "net/http" 6 "strconv" 7 ) 8 9 func ConvertPageSizeAndOrderedColumnToSQL(pageSize, page int, orderedColumn string) (string, error) { 10 err := ValidatePageParameters(pageSize, page) 11 if err != nil { 12 return "", fmt.Errorf("while validating page parameters: %w", err) 13 } 14 15 return fmt.Sprintf(`ORDER BY %s LIMIT %d OFFSET %d`, orderedColumn, pageSize, (page-1)*pageSize), nil 16 } 17 18 func ValidatePageParameters(pageSize, page int) error { 19 if page < 1 { 20 return fmt.Errorf("page cannot be smaller than 1") 21 } 22 23 if pageSize < 1 { 24 return fmt.Errorf("page size cannot be smaller than 1") 25 } 26 return nil 27 } 28 29 func ConvertPageAndPageSizeToOffset(pageSize, page int) int { 30 if page < 2 { 31 return 0 32 } else { 33 return page*pageSize - 1 34 } 35 } 36 37 const ( 38 PageSizeParam = "page_size" 39 PageParam = "page" 40 ) 41 42 func ExtractPaginationConfigFromRequest(req *http.Request, maxPage int) (int, int, error) { 43 var pageSize int 44 var page int 45 var err error 46 47 params := req.URL.Query() 48 pageSizeArr, ok := params[PageSizeParam] 49 if len(pageSizeArr) > 1 { 50 return 0, 0, fmt.Errorf("pageSize has to be one parameter") 51 } 52 53 if !ok { 54 pageSize = maxPage 55 } else { 56 pageSize, err = strconv.Atoi(pageSizeArr[0]) 57 if err != nil { 58 return 0, 0, fmt.Errorf("pageSize has to be an integer") 59 } 60 } 61 62 if pageSize > maxPage { 63 return 0, 0, fmt.Errorf(fmt.Sprintf("pageSize is bigger than maxPage(%d)", maxPage)) 64 } 65 if pageSize < 1 { 66 return 0, 0, fmt.Errorf("pageSize cannot be smaller than 1") 67 } 68 69 pageArr, ok := params[PageParam] 70 if len(pageArr) > 1 { 71 return 0, 0, fmt.Errorf("page has to be one parameter") 72 } 73 if !ok { 74 page = 1 75 } else { 76 page, err = strconv.Atoi(pageArr[0]) 77 if err != nil { 78 return 0, 0, fmt.Errorf("page has to be an integer") 79 } 80 if page < 1 { 81 return 0, 0, fmt.Errorf("page cannot be smaller than 1") 82 } 83 } 84 85 return pageSize, page, nil 86 }