@hedhog/pagination 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/pagination.constants.d.ts +3 -0
- package/dist/constants/pagination.constants.d.ts.map +1 -0
- package/dist/constants/pagination.constants.js +6 -0
- package/dist/constants/pagination.constants.js.map +1 -0
- package/dist/decorator/pagination.decorator.d.ts +3 -0
- package/dist/decorator/pagination.decorator.d.ts.map +1 -0
- package/dist/decorator/pagination.decorator.js +54 -0
- package/dist/decorator/pagination.decorator.js.map +1 -0
- package/dist/dto/pagination.dto.d.ts +10 -0
- package/dist/dto/pagination.dto.d.ts.map +1 -0
- package/dist/dto/pagination.dto.js +52 -0
- package/dist/dto/pagination.dto.js.map +1 -0
- package/dist/enums/patination.enums.d.ts +12 -0
- package/dist/enums/patination.enums.d.ts.map +1 -0
- package/dist/enums/patination.enums.js +17 -0
- package/dist/enums/patination.enums.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/pagination.module.d.ts +3 -0
- package/dist/pagination.module.d.ts.map +1 -0
- package/dist/pagination.module.js +22 -0
- package/dist/pagination.module.js.map +1 -0
- package/dist/pagination.service.d.ts +9 -0
- package/dist/pagination.service.d.ts.map +1 -0
- package/dist/pagination.service.js +112 -0
- package/dist/pagination.service.js.map +1 -0
- package/dist/pagination.service.spec.d.ts +2 -0
- package/dist/pagination.service.spec.d.ts.map +1 -0
- package/dist/pagination.service.spec.js +17 -0
- package/dist/pagination.service.spec.js.map +1 -0
- package/dist/types/pagination.types.d.ts +33 -0
- package/dist/types/pagination.types.d.ts.map +1 -0
- package/dist/types/pagination.types.js +3 -0
- package/dist/types/pagination.types.js.map +1 -0
- package/package.json +2 -2
- package/src/decorator/pagination.decorator.ts +35 -13
- package/src/dto/pagination.dto.ts +2 -2
- package/src/enums/patination.enums.ts +2 -2
- package/src/pagination.service.ts +35 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.constants.d.ts","sourceRoot":"","sources":["../../src/constants/pagination.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,iBAAiB,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.constants.js","sourceRoot":"","sources":["../../src/constants/pagination.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,iBAAiB,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { PaginationField } from '../enums/patination.enums';
|
|
2
|
+
export declare const Pagination: (...dataOrPipes: (import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>> | PaginationField)[]) => ParameterDecorator;
|
|
3
|
+
//# sourceMappingURL=pagination.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.decorator.d.ts","sourceRoot":"","sources":["../../src/decorator/pagination.decorator.ts"],"names":[],"mappings":"AAYA,OAAO,EAAsB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGhF,eAAO,MAAM,UAAU,kMAoEtB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Pagination = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const class_transformer_1 = require("class-transformer");
|
|
6
|
+
const class_validator_1 = require("class-validator");
|
|
7
|
+
const pagination_constants_1 = require("../constants/pagination.constants");
|
|
8
|
+
const pagination_dto_1 = require("../dto/pagination.dto");
|
|
9
|
+
const patination_enums_1 = require("../enums/patination.enums");
|
|
10
|
+
exports.Pagination = (0, common_1.createParamDecorator)((data, ctx) => {
|
|
11
|
+
const request = ctx.switchToHttp().getRequest();
|
|
12
|
+
const defaultOptions = {
|
|
13
|
+
page: pagination_constants_1.DEFAULT_PAGE,
|
|
14
|
+
pageSize: pagination_constants_1.DEFAULT_PAGE_SIZE,
|
|
15
|
+
search: '',
|
|
16
|
+
sortField: 'id',
|
|
17
|
+
sortOrder: patination_enums_1.PageOrderDirection.Asc,
|
|
18
|
+
fields: '',
|
|
19
|
+
};
|
|
20
|
+
const requestData = Object.assign(Object.assign(Object.assign({}, defaultOptions), (request.body || {})), (request.query || {}));
|
|
21
|
+
const { page = defaultOptions.page, pageSize = defaultOptions.pageSize, search = defaultOptions.search, sortField = defaultOptions.sortField, sortOrder = defaultOptions.sortOrder, fields = defaultOptions.fields, } = requestData;
|
|
22
|
+
const validSortOrder = Object.values(patination_enums_1.PageOrderDirection).includes(sortOrder)
|
|
23
|
+
? sortOrder
|
|
24
|
+
: defaultOptions.sortOrder;
|
|
25
|
+
const finalData = {
|
|
26
|
+
page,
|
|
27
|
+
pageSize,
|
|
28
|
+
search,
|
|
29
|
+
sortField,
|
|
30
|
+
sortOrder: validSortOrder,
|
|
31
|
+
fields,
|
|
32
|
+
};
|
|
33
|
+
const paginationDtoInstance = (0, class_transformer_1.plainToClass)(pagination_dto_1.PaginationDTO, finalData);
|
|
34
|
+
const errors = (0, class_validator_1.validateSync)(paginationDtoInstance);
|
|
35
|
+
if (errors.length > 0) {
|
|
36
|
+
throw new common_1.BadRequestException('Pagination data is not valid according to PaginationDto: ' +
|
|
37
|
+
errors
|
|
38
|
+
.map((error) => Object.values(error.constraints).join(', '))
|
|
39
|
+
.join(', '));
|
|
40
|
+
}
|
|
41
|
+
if (data) {
|
|
42
|
+
switch (data) {
|
|
43
|
+
case patination_enums_1.PaginationField.Page:
|
|
44
|
+
case patination_enums_1.PaginationField.PageSize:
|
|
45
|
+
return finalData[data] ? +finalData[data] : defaultOptions[data];
|
|
46
|
+
case patination_enums_1.PaginationField.SortOrder:
|
|
47
|
+
return validSortOrder || defaultOptions[data];
|
|
48
|
+
default:
|
|
49
|
+
return finalData[data];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return finalData;
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=pagination.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.decorator.js","sourceRoot":"","sources":["../../src/decorator/pagination.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAIwB;AACxB,yDAAiD;AACjD,qDAA+C;AAC/C,4EAG2C;AAC3C,0DAAsD;AACtD,gEAAgF;AAGnE,QAAA,UAAU,GAAG,IAAA,6BAAoB,EAC5C,CAAC,IAAqB,EAAE,GAAqB,EAAkB,EAAE;IAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAEhD,MAAM,cAAc,GAAmB;QACrC,IAAI,EAAE,mCAAY;QAClB,QAAQ,EAAE,wCAAiB;QAC3B,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,qCAAkB,CAAC,GAAG;QACjC,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,MAAM,WAAW,iDACZ,cAAc,GACd,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,GACpB,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CACzB,CAAC;IAEF,MAAM,EACJ,IAAI,GAAG,cAAc,CAAC,IAAI,EAC1B,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAClC,MAAM,GAAG,cAAc,CAAC,MAAM,EAC9B,SAAS,GAAG,cAAc,CAAC,SAAS,EACpC,SAAS,GAAG,cAAc,CAAC,SAAS,EACpC,MAAM,GAAG,cAAc,CAAC,MAAM,GAC/B,GAAG,WAAW,CAAC;IAEhB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,qCAAkB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC1E,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC;IAE7B,MAAM,SAAS,GAAG;QAChB,IAAI;QACJ,QAAQ;QACR,MAAM;QACN,SAAS;QACT,SAAS,EAAE,cAAc;QACzB,MAAM;KACP,CAAC;IAEF,MAAM,qBAAqB,GAAG,IAAA,gCAAY,EAAC,8BAAa,EAAE,SAAS,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,qBAAqB,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,4BAAmB,CAC3B,2DAA2D;YACzD,MAAM;iBACH,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC3D,IAAI,CAAC,IAAI,CAAC,CAChB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,kCAAe,CAAC,IAAI,CAAC;YAC1B,KAAK,kCAAe,CAAC,QAAQ;gBAC3B,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACnE,KAAK,kCAAe,CAAC,SAAS;gBAC5B,OAAO,cAAc,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;YAChD;gBACE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PageOrderDirection } from '../enums/patination.enums';
|
|
2
|
+
export declare class PaginationDTO {
|
|
3
|
+
page: number;
|
|
4
|
+
pageSize: number;
|
|
5
|
+
search: string;
|
|
6
|
+
sortField: string;
|
|
7
|
+
sortOrder: PageOrderDirection;
|
|
8
|
+
fields: string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=pagination.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.dto.d.ts","sourceRoot":"","sources":["../../src/dto/pagination.dto.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,qBAAa,aAAa;IAIxB,IAAI,EAAE,MAAM,CAAC;IAKb,QAAQ,EAAE,MAAM,CAAC;IAIjB,MAAM,EAAE,MAAM,CAAC;IAIf,SAAS,EAAE,MAAM,CAAC;IAKlB,SAAS,EAAE,kBAAkB,CAAC;IAI9B,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PaginationDTO = void 0;
|
|
13
|
+
const class_transformer_1 = require("class-transformer");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const patination_enums_1 = require("../enums/patination.enums");
|
|
16
|
+
class PaginationDTO {
|
|
17
|
+
}
|
|
18
|
+
exports.PaginationDTO = PaginationDTO;
|
|
19
|
+
__decorate([
|
|
20
|
+
(0, class_validator_1.IsOptional)(),
|
|
21
|
+
(0, class_transformer_1.Transform)(({ value }) => Number(value)),
|
|
22
|
+
(0, class_validator_1.IsInt)({ message: 'page must be an integer' }),
|
|
23
|
+
__metadata("design:type", Number)
|
|
24
|
+
], PaginationDTO.prototype, "page", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
(0, class_validator_1.IsOptional)(),
|
|
27
|
+
(0, class_transformer_1.Transform)(({ value }) => Number(value)),
|
|
28
|
+
(0, class_validator_1.IsInt)({ message: 'pageSize must be an integer' }),
|
|
29
|
+
__metadata("design:type", Number)
|
|
30
|
+
], PaginationDTO.prototype, "pageSize", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, class_validator_1.IsOptional)(),
|
|
33
|
+
(0, class_validator_1.IsString)({ message: 'search must be a string' }),
|
|
34
|
+
__metadata("design:type", String)
|
|
35
|
+
], PaginationDTO.prototype, "search", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, class_validator_1.IsOptional)(),
|
|
38
|
+
(0, class_validator_1.IsString)({ message: 'field must be a string' }),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], PaginationDTO.prototype, "sortField", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, class_validator_1.IsOptional)(),
|
|
43
|
+
(0, class_validator_1.IsString)({ message: 'sortOrder must be a string' }),
|
|
44
|
+
(0, class_validator_1.IsEnum)(patination_enums_1.PageOrderDirection, { message: 'sortOrder is not valid' }),
|
|
45
|
+
__metadata("design:type", String)
|
|
46
|
+
], PaginationDTO.prototype, "sortOrder", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, class_validator_1.IsOptional)(),
|
|
49
|
+
(0, class_validator_1.IsString)({ message: 'fields must be a string' }),
|
|
50
|
+
__metadata("design:type", String)
|
|
51
|
+
], PaginationDTO.prototype, "fields", void 0);
|
|
52
|
+
//# sourceMappingURL=pagination.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.dto.js","sourceRoot":"","sources":["../../src/dto/pagination.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yDAA8C;AAC9C,qDAAsE;AACtE,gEAA+D;AAC/D,MAAa,aAAa;CA2BzB;AA3BD,sCA2BC;AAvBC;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;;2CACjC;AAKb;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC;;+CACjC;AAIjB;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;;6CAClC;AAIf;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;;gDAC9B;AAKlB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACnD,IAAA,wBAAM,EAAC,qCAAkB,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;;gDACpC;AAI9B;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;;6CAClC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare enum PageOrderDirection {
|
|
2
|
+
Asc = "asc",
|
|
3
|
+
Desc = "desc"
|
|
4
|
+
}
|
|
5
|
+
export declare enum PaginationField {
|
|
6
|
+
Page = "page",
|
|
7
|
+
PageSize = "pageSize",
|
|
8
|
+
SortField = "sortOrder",
|
|
9
|
+
SortOrder = "sortOrder",
|
|
10
|
+
Search = "search"
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=patination.enums.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patination.enums.d.ts","sourceRoot":"","sources":["../../src/enums/patination.enums.ts"],"names":[],"mappings":"AAAA,oBAAY,kBAAkB;IAC5B,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AAED,oBAAY,eAAe;IACzB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,MAAM,WAAW;CAClB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaginationField = exports.PageOrderDirection = void 0;
|
|
4
|
+
var PageOrderDirection;
|
|
5
|
+
(function (PageOrderDirection) {
|
|
6
|
+
PageOrderDirection["Asc"] = "asc";
|
|
7
|
+
PageOrderDirection["Desc"] = "desc";
|
|
8
|
+
})(PageOrderDirection || (exports.PageOrderDirection = PageOrderDirection = {}));
|
|
9
|
+
var PaginationField;
|
|
10
|
+
(function (PaginationField) {
|
|
11
|
+
PaginationField["Page"] = "page";
|
|
12
|
+
PaginationField["PageSize"] = "pageSize";
|
|
13
|
+
PaginationField["SortField"] = "sortOrder";
|
|
14
|
+
PaginationField["SortOrder"] = "sortOrder";
|
|
15
|
+
PaginationField["Search"] = "search";
|
|
16
|
+
})(PaginationField || (exports.PaginationField = PaginationField = {}));
|
|
17
|
+
//# sourceMappingURL=patination.enums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patination.enums.js","sourceRoot":"","sources":["../../src/enums/patination.enums.ts"],"names":[],"mappings":";;;AAAA,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,iCAAW,CAAA;IACX,mCAAa,CAAA;AACf,CAAC,EAHW,kBAAkB,kCAAlB,kBAAkB,QAG7B;AAED,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,gCAAa,CAAA;IACb,wCAAqB,CAAA;IACrB,0CAAuB,CAAA;IACvB,0CAAuB,CAAA;IACvB,oCAAiB,CAAA;AACnB,CAAC,EANW,eAAe,+BAAf,eAAe,QAM1B"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './constants/pagination.constants';
|
|
2
|
+
export * from './decorator/pagination.decorator';
|
|
3
|
+
export * from './dto/pagination.dto';
|
|
4
|
+
export * from './enums/patination.enums';
|
|
5
|
+
export * from './pagination.module';
|
|
6
|
+
export * from './pagination.service';
|
|
7
|
+
export type * from './types/pagination.types';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,mBAAmB,0BAA0B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./constants/pagination.constants"), exports);
|
|
18
|
+
__exportStar(require("./decorator/pagination.decorator"), exports);
|
|
19
|
+
__exportStar(require("./dto/pagination.dto"), exports);
|
|
20
|
+
__exportStar(require("./enums/patination.enums"), exports);
|
|
21
|
+
__exportStar(require("./pagination.module"), exports);
|
|
22
|
+
__exportStar(require("./pagination.service"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mEAAiD;AACjD,mEAAiD;AACjD,uDAAqC;AACrC,2DAAyC;AACzC,sDAAoC;AACpC,uDAAqC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.module.d.ts","sourceRoot":"","sources":["../src/pagination.module.ts"],"names":[],"mappings":"AAGA,qBAKa,gBAAgB;CAAG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PaginationModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const pagination_service_1 = require("./pagination.service");
|
|
12
|
+
let PaginationModule = class PaginationModule {
|
|
13
|
+
};
|
|
14
|
+
exports.PaginationModule = PaginationModule;
|
|
15
|
+
exports.PaginationModule = PaginationModule = __decorate([
|
|
16
|
+
(0, common_1.Module)({
|
|
17
|
+
imports: [],
|
|
18
|
+
providers: [pagination_service_1.PaginationService],
|
|
19
|
+
exports: [pagination_service_1.PaginationService],
|
|
20
|
+
})
|
|
21
|
+
], PaginationModule);
|
|
22
|
+
//# sourceMappingURL=pagination.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.module.js","sourceRoot":"","sources":["../src/pagination.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,6DAAyD;AAOlD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAL5B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,CAAC,sCAAiB,CAAC;QAC9B,OAAO,EAAE,CAAC,sCAAiB,CAAC;KAC7B,CAAC;GACW,gBAAgB,CAAG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BaseModel, FindManyArgs, PaginatedResult, PaginationParams } from './types/pagination.types';
|
|
2
|
+
export declare class PaginationService {
|
|
3
|
+
private readonly logger;
|
|
4
|
+
paginate<T, M extends BaseModel>(model: M, paginationParams: PaginationParams, customQuery?: FindManyArgs<M>): Promise<PaginatedResult<T>>;
|
|
5
|
+
extractFieldNames(model: Record<string, any>): string[];
|
|
6
|
+
isInvalidField(sortField: string, model: BaseModel): boolean;
|
|
7
|
+
isInvalidFields(fields: string[], model: BaseModel): boolean;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=pagination.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.service.d.ts","sourceRoot":"","sources":["../src/pagination.service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAElC,qBACa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAEvD,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,SAAS,EACnC,KAAK,EAAE,CAAC,EACR,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAuG9B,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE;IAcvD,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO;IAI5D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO;CAG7D"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var PaginationService_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.PaginationService = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const pagination_constants_1 = require("./constants/pagination.constants");
|
|
13
|
+
const patination_enums_1 = require("./enums/patination.enums");
|
|
14
|
+
let PaginationService = PaginationService_1 = class PaginationService {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.logger = new common_1.Logger(PaginationService_1.name);
|
|
17
|
+
}
|
|
18
|
+
async paginate(model, paginationParams, customQuery) {
|
|
19
|
+
try {
|
|
20
|
+
const page = Number(paginationParams.page || pagination_constants_1.DEFAULT_PAGE);
|
|
21
|
+
const pageSize = Number(paginationParams.pageSize || pagination_constants_1.DEFAULT_PAGE_SIZE);
|
|
22
|
+
const search = paginationParams.search || null;
|
|
23
|
+
const sortField = paginationParams.sortField || null;
|
|
24
|
+
const sortOrder = paginationParams.sortOrder || patination_enums_1.PageOrderDirection.Asc;
|
|
25
|
+
const fields = paginationParams.fields
|
|
26
|
+
? paginationParams.fields.split(',')
|
|
27
|
+
: null;
|
|
28
|
+
if (page < 1 || pageSize < 1) {
|
|
29
|
+
throw new common_1.BadRequestException('Page and pageSize must be greater than 0');
|
|
30
|
+
}
|
|
31
|
+
let selectCondition = undefined;
|
|
32
|
+
let sortOrderCondition = {
|
|
33
|
+
id: paginationParams.sortOrder || patination_enums_1.PageOrderDirection.Asc,
|
|
34
|
+
};
|
|
35
|
+
if (sortField) {
|
|
36
|
+
const invalid = this.isInvalidField(sortField, model);
|
|
37
|
+
if (invalid) {
|
|
38
|
+
this.logger.error(`Invalid field: ${sortField}`);
|
|
39
|
+
throw new common_1.BadRequestException(`Invalid field: ${sortField}. Valid columns are: ${this.extractFieldNames(model).join(', ')}`);
|
|
40
|
+
}
|
|
41
|
+
sortOrderCondition = { [sortField]: sortOrder };
|
|
42
|
+
}
|
|
43
|
+
if (search) {
|
|
44
|
+
if (typeof search !== 'string') {
|
|
45
|
+
this.logger.error('Search must be a string');
|
|
46
|
+
throw new common_1.BadRequestException('Search must be a string');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (fields) {
|
|
50
|
+
const invalidFields = this.isInvalidFields(fields, model);
|
|
51
|
+
if (invalidFields) {
|
|
52
|
+
this.logger.error(`Invalid fields: ${sortField}. Valid columns are: ${this.extractFieldNames(model).join(', ')}`);
|
|
53
|
+
throw new common_1.BadRequestException(`Invalid fields: ${sortField}. Valid columns are: ${this.extractFieldNames(model).join(', ')}`);
|
|
54
|
+
}
|
|
55
|
+
selectCondition = fields.reduce((acc, field) => {
|
|
56
|
+
acc[field] = true;
|
|
57
|
+
return acc;
|
|
58
|
+
}, {});
|
|
59
|
+
}
|
|
60
|
+
const skip = page > 0 ? pageSize * (page - 1) : 0;
|
|
61
|
+
const query = {
|
|
62
|
+
select: selectCondition,
|
|
63
|
+
where: (customQuery === null || customQuery === void 0 ? void 0 : customQuery.where) || {},
|
|
64
|
+
orderBy: sortOrderCondition,
|
|
65
|
+
take: pageSize,
|
|
66
|
+
skip,
|
|
67
|
+
};
|
|
68
|
+
const [total, data] = await Promise.all([
|
|
69
|
+
model.count({ where: (customQuery === null || customQuery === void 0 ? void 0 : customQuery.where) || {} }),
|
|
70
|
+
model.findMany(query),
|
|
71
|
+
]);
|
|
72
|
+
const lastPage = Math.ceil(total / pageSize);
|
|
73
|
+
return {
|
|
74
|
+
total,
|
|
75
|
+
lastPage,
|
|
76
|
+
currentPage: page,
|
|
77
|
+
pageSize,
|
|
78
|
+
prev: page > 1 ? page - 1 : null,
|
|
79
|
+
next: page < lastPage ? page + 1 : null,
|
|
80
|
+
data,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.logger.error('Pagination Error:', error);
|
|
85
|
+
if (error instanceof common_1.BadRequestException) {
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
throw new common_1.BadRequestException(`Failed to paginate: ${error}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
extractFieldNames(model) {
|
|
92
|
+
const fieldNames = [];
|
|
93
|
+
const fields = model.fields;
|
|
94
|
+
for (const key in fields) {
|
|
95
|
+
if (fields.hasOwnProperty(key)) {
|
|
96
|
+
fieldNames.push(key);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return fieldNames;
|
|
100
|
+
}
|
|
101
|
+
isInvalidField(sortField, model) {
|
|
102
|
+
return !model.fields[sortField];
|
|
103
|
+
}
|
|
104
|
+
isInvalidFields(fields, model) {
|
|
105
|
+
return !fields.every((field) => model.fields[field]);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
exports.PaginationService = PaginationService;
|
|
109
|
+
exports.PaginationService = PaginationService = PaginationService_1 = __decorate([
|
|
110
|
+
(0, common_1.Injectable)()
|
|
111
|
+
], PaginationService);
|
|
112
|
+
//# sourceMappingURL=pagination.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.service.js","sourceRoot":"","sources":["../src/pagination.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.service.spec.d.ts","sourceRoot":"","sources":["../src/pagination.service.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const testing_1 = require("@nestjs/testing");
|
|
4
|
+
const pagination_service_1 = require("./pagination.service");
|
|
5
|
+
describe('PaginationService', () => {
|
|
6
|
+
let service;
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
const module = await testing_1.Test.createTestingModule({
|
|
9
|
+
providers: [pagination_service_1.PaginationService],
|
|
10
|
+
}).compile();
|
|
11
|
+
service = module.get(pagination_service_1.PaginationService);
|
|
12
|
+
});
|
|
13
|
+
it('should be defined', () => {
|
|
14
|
+
expect(service).toBeDefined();
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=pagination.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.service.spec.js","sourceRoot":"","sources":["../src/pagination.service.spec.ts"],"names":[],"mappings":";;AAAA,6CAAsD;AACtD,6DAAyD;AAEzD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,OAA0B,CAAC;IAE/B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE,CAAC,sCAAiB,CAAC;SAC/B,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,OAAO,GAAG,MAAM,CAAC,GAAG,CAAoB,sCAAiB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { PageOrderDirection } from '../enums/patination.enums';
|
|
2
|
+
export type PaginatedResult<T> = {
|
|
3
|
+
total: number;
|
|
4
|
+
lastPage: number;
|
|
5
|
+
currentPage: number;
|
|
6
|
+
pageSize: number;
|
|
7
|
+
prev: number | null;
|
|
8
|
+
next: number | null;
|
|
9
|
+
data: T[];
|
|
10
|
+
};
|
|
11
|
+
export type PaginationType = string | number | PaginationParams;
|
|
12
|
+
export type PaginateFunction = <K, T>(model: any, args?: K, options?: PaginateOptions) => Promise<PaginatedResult<T>>;
|
|
13
|
+
export type PaginationParams = {
|
|
14
|
+
page?: number;
|
|
15
|
+
pageSize?: number;
|
|
16
|
+
search?: string;
|
|
17
|
+
sortField?: string;
|
|
18
|
+
sortOrder?: PageOrderDirection;
|
|
19
|
+
fields: string;
|
|
20
|
+
};
|
|
21
|
+
export type PaginateOptions = {
|
|
22
|
+
page?: number | string;
|
|
23
|
+
pageSize?: number | string;
|
|
24
|
+
};
|
|
25
|
+
export type BaseModel = {
|
|
26
|
+
findMany: (args: any) => Promise<any[]>;
|
|
27
|
+
count: (args: any) => Promise<number>;
|
|
28
|
+
fields?: Record<string, any>;
|
|
29
|
+
};
|
|
30
|
+
export type FindManyArgs<M> = M extends {
|
|
31
|
+
findMany: (args: infer A) => any;
|
|
32
|
+
} ? A : never;
|
|
33
|
+
//# sourceMappingURL=pagination.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.types.d.ts","sourceRoot":"","sources":["../../src/types/pagination.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,EAAE,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAClC,KAAK,EAAE,GAAG,EACV,IAAI,CAAC,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,eAAe,KACtB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,GAAG,CAAA;CAAE,GACxE,CAAC,GACD,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.types.js","sourceRoot":"","sources":["../../src/types/pagination.types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hedhog/pagination",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"build": "tsc && npm version patch",
|
|
7
|
+
"build": "tsc --project tsconfig.production.json && npm version patch",
|
|
8
8
|
"prod": "npm run build && npm publish --access public"
|
|
9
9
|
},
|
|
10
10
|
"keywords": [],
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BadRequestException,
|
|
3
|
+
createParamDecorator,
|
|
4
|
+
ExecutionContext,
|
|
5
|
+
} from '@nestjs/common';
|
|
6
|
+
import { plainToClass } from 'class-transformer';
|
|
7
|
+
import { validateSync } from 'class-validator';
|
|
2
8
|
import {
|
|
3
9
|
DEFAULT_PAGE,
|
|
4
10
|
DEFAULT_PAGE_SIZE,
|
|
5
11
|
} from '../constants/pagination.constants';
|
|
12
|
+
import { PaginationDTO } from '../dto/pagination.dto';
|
|
6
13
|
import { PageOrderDirection, PaginationField } from '../enums/patination.enums';
|
|
7
14
|
import { PaginationType } from '../types/pagination.types';
|
|
8
15
|
|
|
@@ -38,25 +45,40 @@ export const Pagination = createParamDecorator(
|
|
|
38
45
|
? sortOrder
|
|
39
46
|
: defaultOptions.sortOrder;
|
|
40
47
|
|
|
48
|
+
const finalData = {
|
|
49
|
+
page,
|
|
50
|
+
pageSize,
|
|
51
|
+
search,
|
|
52
|
+
sortField,
|
|
53
|
+
sortOrder: validSortOrder,
|
|
54
|
+
fields,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const paginationDtoInstance = plainToClass(PaginationDTO, finalData);
|
|
58
|
+
|
|
59
|
+
const errors = validateSync(paginationDtoInstance);
|
|
60
|
+
|
|
61
|
+
if (errors.length > 0) {
|
|
62
|
+
throw new BadRequestException(
|
|
63
|
+
'Pagination data is not valid according to PaginationDto: ' +
|
|
64
|
+
errors
|
|
65
|
+
.map((error) => Object.values(error.constraints).join(', '))
|
|
66
|
+
.join(', '),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
41
70
|
if (data) {
|
|
42
71
|
switch (data) {
|
|
43
72
|
case PaginationField.Page:
|
|
44
73
|
case PaginationField.PageSize:
|
|
45
|
-
return
|
|
46
|
-
case PaginationField.
|
|
47
|
-
return
|
|
74
|
+
return finalData[data] ? +finalData[data] : defaultOptions[data];
|
|
75
|
+
case PaginationField.SortOrder:
|
|
76
|
+
return validSortOrder || defaultOptions[data];
|
|
48
77
|
default:
|
|
49
|
-
return
|
|
78
|
+
return finalData[data];
|
|
50
79
|
}
|
|
51
80
|
}
|
|
52
81
|
|
|
53
|
-
return
|
|
54
|
-
page: +page,
|
|
55
|
-
pageSize: +pageSize,
|
|
56
|
-
search,
|
|
57
|
-
sortField,
|
|
58
|
-
sortOrder: validSortOrder,
|
|
59
|
-
fields,
|
|
60
|
-
};
|
|
82
|
+
return finalData;
|
|
61
83
|
},
|
|
62
84
|
);
|
|
@@ -3,12 +3,12 @@ import { IsEnum, IsInt, IsOptional, IsString } from 'class-validator';
|
|
|
3
3
|
import { PageOrderDirection } from '../enums/patination.enums';
|
|
4
4
|
export class PaginationDTO {
|
|
5
5
|
@IsOptional()
|
|
6
|
-
@Transform((value) => Number(value))
|
|
6
|
+
@Transform(({ value }) => Number(value))
|
|
7
7
|
@IsInt({ message: 'page must be an integer' })
|
|
8
8
|
page: number;
|
|
9
9
|
|
|
10
10
|
@IsOptional()
|
|
11
|
-
@Transform((value) => Number(value))
|
|
11
|
+
@Transform(({ value }) => Number(value))
|
|
12
12
|
@IsInt({ message: 'pageSize must be an integer' })
|
|
13
13
|
pageSize: number;
|
|
14
14
|
|
|
@@ -41,34 +41,44 @@ export class PaginationService {
|
|
|
41
41
|
id: paginationParams.sortOrder || PageOrderDirection.Asc,
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
if (
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
if (sortField) {
|
|
45
|
+
const invalid = this.isInvalidField(sortField, model);
|
|
46
|
+
if (invalid) {
|
|
47
|
+
this.logger.error(`Invalid field: ${sortField}`);
|
|
48
48
|
throw new BadRequestException(
|
|
49
|
-
`Invalid field: ${sortField}. Valid columns are: ${
|
|
49
|
+
`Invalid field: ${sortField}. Valid columns are: ${this.extractFieldNames(
|
|
50
|
+
model,
|
|
51
|
+
).join(', ')}`,
|
|
50
52
|
);
|
|
51
53
|
}
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
throw new BadRequestException('Field must be a string');
|
|
55
|
-
}
|
|
55
|
+
sortOrderCondition = { [sortField]: sortOrder };
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
if (
|
|
59
|
-
|
|
58
|
+
if (search) {
|
|
59
|
+
if (typeof search !== 'string') {
|
|
60
|
+
this.logger.error('Search must be a string');
|
|
61
|
+
throw new BadRequestException('Search must be a string');
|
|
62
|
+
}
|
|
60
63
|
}
|
|
61
64
|
|
|
62
65
|
if (fields) {
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
const invalidFields = this.isInvalidFields(fields, model);
|
|
67
|
+
|
|
68
|
+
if (invalidFields) {
|
|
69
|
+
this.logger.error(
|
|
70
|
+
`Invalid fields: ${sortField}. Valid columns are: ${this.extractFieldNames(
|
|
71
|
+
model,
|
|
72
|
+
).join(', ')}`,
|
|
73
|
+
);
|
|
74
|
+
|
|
68
75
|
throw new BadRequestException(
|
|
69
|
-
`Invalid fields: ${
|
|
76
|
+
`Invalid fields: ${sortField}. Valid columns are: ${this.extractFieldNames(
|
|
77
|
+
model,
|
|
78
|
+
).join(', ')}`,
|
|
70
79
|
);
|
|
71
80
|
}
|
|
81
|
+
|
|
72
82
|
selectCondition = fields.reduce((acc, field) => {
|
|
73
83
|
acc[field] = true;
|
|
74
84
|
return acc;
|
|
@@ -108,7 +118,7 @@ export class PaginationService {
|
|
|
108
118
|
throw error;
|
|
109
119
|
}
|
|
110
120
|
|
|
111
|
-
throw new BadRequestException(`Failed to paginate: ${error
|
|
121
|
+
throw new BadRequestException(`Failed to paginate: ${error}`);
|
|
112
122
|
}
|
|
113
123
|
}
|
|
114
124
|
|
|
@@ -125,4 +135,12 @@ export class PaginationService {
|
|
|
125
135
|
|
|
126
136
|
return fieldNames;
|
|
127
137
|
}
|
|
138
|
+
|
|
139
|
+
isInvalidField(sortField: string, model: BaseModel): boolean {
|
|
140
|
+
return !model.fields[sortField];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
isInvalidFields(fields: string[], model: BaseModel): boolean {
|
|
144
|
+
return !fields.every((field) => model.fields[field]);
|
|
145
|
+
}
|
|
128
146
|
}
|