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  }