@digicms/cms
Version:
An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite
126 lines (101 loc) • 3.3 kB
JavaScript
;
const { has, toNumber, isUndefined } = require('lodash/fp');
const { ValidationError } = require('@strapi/utils').errors;
/**
* Default limit values from config
* @return {{maxLimit: number, defaultLimit: number}}
*/
const getLimitConfigDefaults = () => ({
defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),
maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,
});
/**
* Should maxLimit be used as the limit or not
* @param {number} limit - limit you want to cap
* @param {number?} maxLimit - maxlimit used has capping
* @returns {boolean}
*/
const shouldApplyMaxLimit = (limit, maxLimit = null, { isPagedPagination = false } = {}) =>
(!isPagedPagination && limit === -1) || (maxLimit && limit > maxLimit);
const shouldCount = (params) => {
if (has('pagination.withCount', params)) {
const { withCount } = params.pagination;
if (typeof withCount === 'boolean') {
return withCount;
}
if (['true', 't', '1', 1].includes(withCount)) {
return true;
}
if (['false', 'f', '0', 0].includes(withCount)) {
return false;
}
throw new ValidationError(
'Invalid withCount parameter. Expected "t","1","true","false","0","f"'
);
}
return Boolean(strapi.config.get('api.rest.withCount', true));
};
const isOffsetPagination = (pagination) => has('start', pagination) || has('limit', pagination);
const isPagedPagination = (pagination) => has('page', pagination) || has('pageSize', pagination);
const getPaginationInfo = (params) => {
const { defaultLimit, maxLimit } = getLimitConfigDefaults();
const { pagination } = params;
const isPaged = isPagedPagination(pagination);
const isOffset = isOffsetPagination(pagination);
if (!isPaged && !isOffset) {
return {
page: 1,
pageSize: defaultLimit,
};
}
if (isOffset && isPaged) {
throw new ValidationError(
'Invalid pagination parameters. Expected either start/limit or page/pageSize'
);
}
if (isPagedPagination(pagination)) {
const pageSize = isUndefined(pagination.pageSize)
? defaultLimit
: Math.max(1, toNumber(pagination.pageSize));
return {
page: Math.max(1, toNumber(pagination.page || 1)),
pageSize: shouldApplyMaxLimit(pageSize, maxLimit, { isPagedPagination: true })
? maxLimit
: Math.max(1, pageSize),
};
}
const limit = isUndefined(pagination.limit) ? defaultLimit : toNumber(pagination.limit);
return {
start: Math.max(0, toNumber(pagination.start || 0)),
limit: shouldApplyMaxLimit(limit, maxLimit) ? maxLimit || -1 : Math.max(1, limit),
};
};
const convertPagedToStartLimit = (pagination) => {
if (isPagedPagination(pagination)) {
const { page, pageSize } = pagination;
return {
start: (page - 1) * pageSize,
limit: pageSize,
};
}
return pagination;
};
const transformPaginationResponse = (paginationInfo, count) => {
if (paginationInfo.page) {
return {
...paginationInfo,
pageCount: Math.ceil(count / paginationInfo.pageSize),
total: count,
};
}
return {
...paginationInfo,
total: count,
};
};
module.exports = {
getPaginationInfo,
convertPagedToStartLimit,
transformPaginationResponse,
shouldCount,
};