nestjs-paginate
Version:
Pagination and filtering helper method for TypeORM repositories or query builders using Nest.js framework.
146 lines (145 loc) • 5.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ApiPaginationQuery = void 0;
exports.SortBy = SortBy;
const common_1 = require("@nestjs/common");
const swagger_1 = require("@nestjs/swagger");
const filter_1 = require("../filter");
const paginate_1 = require("../paginate");
const DEFAULT_VALUE_KEY = 'Default Value';
function p(key, value) {
return `<p>
<b>${key}: </b> ${value}
</p>`;
}
function li(key, values) {
return `<h4>${key}</h4><ul>${values.map((v) => `<li>${v}</li>`).join('\n')}</ul>`;
}
function SortBy(paginationConfig) {
const defaultSortMessage = paginationConfig.defaultSortBy
? paginationConfig.defaultSortBy.map(([col, order]) => `${col}:${order}`).join(',')
: 'No default sorting specified, the result order is not guaranteed';
const sortBy = paginationConfig.sortableColumns.reduce((prev, curr) => {
return [...prev, `${curr}:ASC`, `${curr}:DESC`];
}, []);
return (0, swagger_1.ApiQuery)({
name: 'sortBy',
isArray: true,
enum: sortBy,
description: `Parameter to sort by.
<p>To sort by multiple fields, just provide query param multiple types. The order in url defines an order of sorting</p>
${p('Format', 'fieldName:DIRECTION')}
${p('Example', 'sortBy=id:DESC&sortBy=createdAt:ASC')}
${p('Default Value', defaultSortMessage)}
${li('Available Fields', paginationConfig.sortableColumns)}
`,
required: false,
type: 'string',
});
}
function Limit(paginationConfig) {
var _a, _b;
return (0, swagger_1.ApiQuery)({
name: 'limit',
description: `Number of records per page.
${p('Example', '20')}
${p(DEFAULT_VALUE_KEY, ((_a = paginationConfig === null || paginationConfig === void 0 ? void 0 : paginationConfig.defaultLimit) === null || _a === void 0 ? void 0 : _a.toString()) || paginate_1.PaginationLimit.DEFAULT_LIMIT.toString())}
${p('Max Value', ((_b = paginationConfig.maxLimit) === null || _b === void 0 ? void 0 : _b.toString()) || paginate_1.PaginationLimit.DEFAULT_MAX_LIMIT.toString())}
If provided value is greater than max value, max value will be applied.
`,
required: false,
type: 'number',
});
}
function Select(paginationConfig) {
if (!paginationConfig.select) {
return;
}
return (0, swagger_1.ApiQuery)({
name: 'select',
description: `List of fields to select.
${p('Example', paginationConfig.select.slice(0, Math.min(5, paginationConfig.select.length)).join(','))}
${p(DEFAULT_VALUE_KEY, 'By default all fields returns. If you want to select only some fields, provide them in query param')}
`,
required: false,
type: 'string',
});
}
function Where(paginationConfig) {
if (!paginationConfig.filterableColumns)
return;
const allColumnsDecorators = Object.entries(paginationConfig.filterableColumns)
.map(([fieldName, filterOperations]) => {
const operations = filterOperations === true || filterOperations === undefined
? [
...Object.values(filter_1.FilterComparator),
...Object.values(paginate_1.FilterSuffix),
...Object.values(paginate_1.FilterOperator),
]
: filterOperations.map((fo) => fo.toString());
return (0, swagger_1.ApiQuery)({
name: `filter.${fieldName}`,
description: `Filter by ${fieldName} query param.
${p('Format', `filter.${fieldName}={$not}:OPERATION:VALUE`)}
${p('Example', `filter.${fieldName}=$not:$like:John Doe&filter.${fieldName}=like:John`)}
${li('Available Operations', operations)}`,
required: false,
type: 'string',
isArray: true,
});
})
.filter((v) => v !== undefined);
return (0, common_1.applyDecorators)(...allColumnsDecorators);
}
function Page() {
return (0, swagger_1.ApiQuery)({
name: 'page',
description: `Page number to retrieve.If you provide invalid value the default page number will applied
${p('Example', '1')}
${p(DEFAULT_VALUE_KEY, '1')}
`,
required: false,
type: 'number',
});
}
function Search(paginateConfig) {
if (!paginateConfig.searchableColumns)
return;
return (0, swagger_1.ApiQuery)({
name: 'search',
description: `Search term to filter result values
${p('Example', 'John')}
${p(DEFAULT_VALUE_KEY, 'No default value')}
`,
required: false,
type: 'string',
});
}
function SearchBy(paginateConfig) {
if (!paginateConfig.searchableColumns)
return;
return (0, swagger_1.ApiQuery)({
name: 'searchBy',
description: `List of fields to search by term to filter result values
${p('Example', paginateConfig.searchableColumns.slice(0, Math.min(5, paginateConfig.searchableColumns.length)).join(','))}
${p(DEFAULT_VALUE_KEY, 'By default all fields mentioned below will be used to search by term')}
${li('Available Fields', paginateConfig.searchableColumns)}
`,
required: false,
isArray: true,
type: 'string',
});
}
const ApiPaginationQuery = (paginationConfig) => {
return (0, common_1.applyDecorators)(...[
Page(),
Limit(paginationConfig),
Where(paginationConfig),
SortBy(paginationConfig),
Search(paginationConfig),
SearchBy(paginationConfig),
Select(paginationConfig),
].filter((v) => v !== undefined));
};
exports.ApiPaginationQuery = ApiPaginationQuery;
//# sourceMappingURL=api-paginated-query.decorator.js.map