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