nestjs-keyset-paginator
Version:
a simple pagination library made for nestjs(mongoose) by hungreebee technologies
66 lines (65 loc) • 3.34 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.paginate = void 0;
const generate_pagination_filter_1 = require("./pagination/generate-pagination-filter");
const generate_pagination_query_1 = require("./pagination/generate-pagination-query");
const generate_pagination_next_key_1 = require("./pagination/generate-pagination-next-key");
const generate_pagination_next_key_dto_arr_1 = require("./pagination/generate-pagination-next-key-dto-arr");
/**
* @param {Model<any>} model - Mongoose model
* @param {} skip=0 - Number of documents to skip
* @param {} limit=10 - Number of documents to limit
* @param {startKeyDto[]} start_key? - Key to start pagination from
* @param {string} sort_field? - Field to sort by
* @param {number} sort_order? - Ascending or descending 1 or -1
* @param {filterDto[]} filter? - Array of filters
* @param {projectionDto[]} projection? - Object of projection
*/
const paginate = (model, skip = 0, limit = 10, start_key, sort_field, sort_order, filter, projection) => __awaiter(void 0, void 0, void 0, function* () {
const model_paths = Object.keys(model.schema.paths);
let filter_fn = {};
let query_fn;
// console.log(filter)
if (filter && filter.length !== 0)
filter_fn = (0, generate_pagination_filter_1.generatePaginationFilter)(filter);
// console.log(filter);
let sort = null;
if (sort_field && sort_order && model_paths.includes(sort_field)) {
sort = [sort_field, sort_order];
}
let start_key_fn = null;
if (start_key) {
start_key_fn = (0, generate_pagination_next_key_1.generatePaginationNextKey)(start_key);
}
const { paginatedQuery, nextKeyFn } = (0, generate_pagination_query_1.generatePaginationQuery)(filter_fn, sort, start_key_fn);
// console.log("paginatedQuery: ", paginatedQuery);
// const aggregate_arr = []
if (projection) {
const select_obj = {};
for (const projectionEle of projection) {
select_obj[projectionEle.name] = projectionEle.mode;
}
// console.log('projection: ', select_obj);
query_fn = model.find(paginatedQuery, select_obj).skip(skip).limit(limit);
}
else
query_fn = model.find(paginatedQuery).skip(skip).limit(limit);
if (sort) {
query_fn = query_fn.sort([sort]);
}
// aggregate_arr.push(skip)
// aggregate_arr.push(limit)
const docs = yield query_fn.exec();
const next_key = (0, generate_pagination_next_key_dto_arr_1.generatePaginationNextKeyDtoArr)(nextKeyFn(docs));
return { docs: docs, next_key: next_key };
});
exports.paginate = paginate;