UNPKG

nestjs-paginate

Version:

Pagination and filtering helper method for TypeORM repositories or query builders using Nest.js framework.

185 lines (180 loc) 7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ApiPaginationQuery = void 0; exports.SortBy = SortBy; exports.Limit = Limit; exports.Select = Select; exports.Where = Where; exports.Page = Page; exports.Search = Search; exports.SearchBy = SearchBy; exports.WithDeleted = WithDeleted; const common_1 = require("@nestjs/common"); const swagger_1 = require("@nestjs/swagger"); const filter_1 = require("../filter"); const paginate_1 = require("../paginate"); const global_config_1 = require("../global-config"); const helper_1 = require("../helper"); const DEFAULT_VALUE_KEY = 'Default Value'; const allFilterSuffixes = Object.values(paginate_1.FilterSuffix).map((v) => v.toString()); function p(key, value) { return ` **${key}:** ${value} `; } function li(key, values) { return `**${key}** ${values.map((v) => `- ${v}`).join('\n\n')}`; } function SortBy(paginationConfig) { const sortableColumnNotAvailable = (0, helper_1.isNil)(paginationConfig.sortableColumns) || paginationConfig.sortableColumns.length === 0; if ((0, helper_1.isNil)(paginationConfig.defaultSortBy) && sortableColumnNotAvailable) { // no sorting allowed or predefined return undefined; } const defaultSortMessage = paginationConfig.defaultSortBy ? paginationConfig.defaultSortBy.map(([col, order]) => `${col}:${order}`).join(',') : 'No default sorting specified, the result order is not guaranteed if not provided'; const sortBy = paginationConfig.sortableColumns.reduce((prev, curr) => { return [...prev, `${curr}:ASC`, `${curr}:DESC`]; }, []); const exampleValue = sortableColumnNotAvailable ? 'Allowed sortable columns are not provided, only default sorting will be used' : paginationConfig.sortableColumns .slice(0, 2) .map((col) => `sortBy=${col}:DESC`) .join('&'); return (0, swagger_1.ApiQuery)({ name: 'sortBy', isArray: true, enum: sortBy, description: `Parameter to sort by. To sort by multiple fields, just provide query param multiple types. The order in url defines an order of sorting ${p('Format', '{fieldName}:{DIRECTION}')} ${p('Example', exampleValue)} ${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', global_config_1.default.defaultLimit.toString())} ${p(DEFAULT_VALUE_KEY, ((_a = paginationConfig === null || paginationConfig === void 0 ? void 0 : paginationConfig.defaultLimit) === null || _a === void 0 ? void 0 : _a.toString()) || global_config_1.default.defaultLimit.toString())} ${p('Max Value', ((_b = paginationConfig.maxLimit) === null || _b === void 0 ? void 0 : _b.toString()) || global_config_1.default.defaultMaxLimit.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, 5).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(paginate_1.FilterOperator), ...Object.values(paginate_1.FilterSuffix)] : filterOperations.map((fo) => fo.toString()); const operationsForExample = operations .filter((v) => !allFilterSuffixes.includes(v)) .sort() .slice(0, 2) || []; return (0, swagger_1.ApiQuery)({ name: `filter.${fieldName}`, description: `Filter by ${fieldName} query param. ${p('Format', `filter.${fieldName}={$not}:OPERATION:VALUE`)} ${p('Example', operationsForExample.length === 0 ? 'No filtering allowed' : operationsForExample.map((v) => `filter.${fieldName}=${v}:John Doe`).join('&'))} ${li('Available Operations', [...operations, ...Object.values(filter_1.FilterComparator)])}`, 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', }); } function WithDeleted(paginateConfig) { if (!paginateConfig.allowWithDeletedInQuery) return; return (0, swagger_1.ApiQuery)({ name: 'withDeleted', description: `Retrieve records including soft deleted ones`, required: false, type: 'boolean', }); } const ApiPaginationQuery = (paginationConfig) => { return (0, common_1.applyDecorators)(...[ Page(), Limit(paginationConfig), Where(paginationConfig), SortBy(paginationConfig), Search(paginationConfig), SearchBy(paginationConfig), Select(paginationConfig), WithDeleted(paginationConfig), ].filter((v) => v !== undefined)); }; exports.ApiPaginationQuery = ApiPaginationQuery; //# sourceMappingURL=api-paginated-query.decorator.js.map