Name

global.RestApiPaginationUtil

Description

No description available

Script

/**
   Utility function to calculate headers to support Pagination for REST APIs
   Header fields:
       Link: Comma separated links for prev, next, first, last pages. Link type are described by "rel"
  	 X-Total-Content: total number of records
**/
var RestApiPaginationUtil = Class.create();
RestApiPaginationUtil.prototype = {
  REL_FIRST : 'rel="first"',
  REL_PREV : 'rel="prev"',
  REL_NEXT : 'rel="next"',
  REL_LAST : 'rel="last"',
  initialize: function(request) {
  	//Check if there is a property that defines limit
  	this.limit = CSMBaseConstants.API_RESPONSE_LIMIT_DEFAULT;
  	this.offset = 0;
  	this.totalCount = 0;
  	this.baseURL = request.url;
  	this.queryParams = request.queryParams;
  	this.queryStringSansOffset = '';
  	this._setQueryParams(request.queryParams);
  },
  _setQueryParams: function(queryParams) {
  	this.queryParams = queryParams;

  	if(queryParams.sysparm_limit != undefined)
  		this.limit = parseInt(queryParams.sysparm_limit);
  	else if(queryParams.limit != undefined)
  		this.limit = parseInt(queryParams.limit);
  	var maxPageSize = CSMBaseConstants.API_RESPONSE_LIMIT_MAX;
  	this.limit = Math.min(this.limit,maxPageSize);
  	
  	if(queryParams.sysparm_offset != undefined)
  		this.offset = parseInt(queryParams.sysparm_offset);
  	else if(queryParams.offset != undefined)
  		this.offset = parseInt(queryParams.offset);

  	for(var param in queryParams) {
  		if(param != 'sysparm_offset' && param!= 'api' && param!="sysparm_limit" && param !='offset' && param!= 'limit')
  			this.queryStringSansOffset += param + '=' + queryParams[param] + '&';
  		if(param=="sysparm_limit" || param =="limit")
  			this.queryStringSansOffset += param + '=' + this.limit + '&';
  	}

  	if(this.queryStringSansOffset.endsWith('&'))
  		this.queryStringSansOffset = this.queryStringSansOffset.substring(0, this.queryStringSansOffset.length-1);
  },
  _constructHeaderLink: function(offsetVal, relation) {
  	var headerLink = '<' + this.baseURL + '?';
  	var queryString = this.queryStringSansOffset + '&sysparm_offset=' + offsetVal;
  	headerLink += queryString + '>';
  	headerLink += ';' + relation;

  	return headerLink;
  },
  setTotalCount: function(totalRecords) {
  	this.totalCount = totalRecords;
  },
  getLinkInfo: function() {
  	var next = this.offset + this.limit;
  	var prev = this.offset - this.limit;
  	var pages = Math.ceil(this.totalCount/this.limit);
  	if(pages == 1)
  		return '';
  	var last = this.limit * (pages-1);
  	var linkInfo = '';

  	//First page
  	linkInfo += this._constructHeaderLink(0, this.REL_FIRST);
  	linkInfo += ', ';

  	//Prev page
  	if(prev >= 0 && prev<=last) {
  		linkInfo += this._constructHeaderLink(prev, this.REL_PREV);
  		linkInfo += ', ';
  	}

  	//Next page
  	if(next <= last) {
  		linkInfo += this._constructHeaderLink(next, this.REL_NEXT);
  		linkInfo += ', ';
  	}

  	//Last page
  	linkInfo += this._constructHeaderLink(last, this.REL_LAST);

  	return linkInfo;

  },
  getHeaderPaginationInfo: function() {
  	return {
  		'Link': this.getLinkInfo(),
  		'X-Total-Count': '' + this.totalCount
  	};
  },
  type: 'RestApiPaginationUtil'
};

Sys ID

0b0a1b345332030097a2ddeeff7b12b8

Offical Documentation

Official Docs: