nestjs-paginate
Version:
Pagination and filtering helper method for TypeORM repositories or query builders using Nest.js framework.
79 lines • 3.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Paginate = void 0;
const common_1 = require("@nestjs/common");
const lodash_1 = require("lodash");
function isRecord(data) {
return data !== null && typeof data === 'object' && !Array.isArray(data);
}
function isExpressRequest(request) {
return isRecord(request) && typeof request.get === 'function';
}
const singleSplit = (param, res) => res.push(param);
const multipleSplit = (param, res) => {
const items = param.split(':');
if (items.length === 2) {
res.push(items);
}
};
const multipleAndCommaSplit = (param, res) => {
const set = new Set(param.split(','));
set.forEach((item) => res.push(item));
};
function parseParam(queryParam, parserLogic) {
const res = [];
if (queryParam) {
const params = !Array.isArray(queryParam) ? [queryParam] : queryParam;
for (const param of params) {
if ((0, lodash_1.isString)(param)) {
parserLogic(param, res);
}
}
}
return res.length ? res : undefined;
}
exports.Paginate = (0, common_1.createParamDecorator)((_data, ctx) => {
let path;
let query;
switch (ctx.getType()) {
case 'http':
const request = ctx.switchToHttp().getRequest();
query = request.query;
// Determine if Express or Fastify to rebuild the original url and reduce down to protocol, host and base url
let originalUrl;
if (isExpressRequest(request)) {
originalUrl = request.protocol + '://' + request.get('host') + request.originalUrl;
}
else {
originalUrl = request.protocol + '://' + request.hostname + request.url;
}
const urlParts = new URL(originalUrl);
path = urlParts.protocol + '//' + urlParts.host + urlParts.pathname;
break;
case 'ws':
query = ctx.switchToWs().getData();
path = null;
break;
case 'rpc':
query = ctx.switchToRpc().getData();
path = null;
break;
}
const searchBy = parseParam(query.searchBy, singleSplit);
const sortBy = parseParam(query.sortBy, multipleSplit);
const select = parseParam(query.select, multipleAndCommaSplit);
const filter = (0, lodash_1.mapKeys)((0, lodash_1.pickBy)(query, (param, name) => name.includes('filter.') &&
((0, lodash_1.isString)(param) || (Array.isArray(param) && param.every((p) => (0, lodash_1.isString)(p))))), (_param, name) => name.replace('filter.', ''));
return {
page: query.page ? parseInt(query.page.toString(), 10) : undefined,
limit: query.limit ? parseInt(query.limit.toString(), 10) : undefined,
sortBy,
search: query.search ? query.search.toString() : undefined,
searchBy,
filter: Object.keys(filter).length ? filter : undefined,
select,
cursor: query.cursor ? query.cursor.toString() : undefined,
path,
};
});
//# sourceMappingURL=decorator.js.map