nicot 1.1.10 → 1.1.12

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.
Files changed (38) hide show
  1. package/README.md +144 -9
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/bases/base-restful-controller.d.ts +32 -0
  6. package/dist/src/bases/base-restful-controller.js +53 -0
  7. package/dist/src/bases/base-restful-controller.js.map +1 -0
  8. package/dist/src/bases/id-base.d.ts +2 -0
  9. package/dist/src/bases/page-settings.d.ts +3 -2
  10. package/dist/src/bases/page-settings.js +4 -11
  11. package/dist/src/bases/page-settings.js.map +1 -1
  12. package/dist/src/crud-base.d.ts +36 -9
  13. package/dist/src/crud-base.js +87 -25
  14. package/dist/src/crud-base.js.map +1 -1
  15. package/dist/src/decorators/index.d.ts +0 -1
  16. package/dist/src/decorators/index.js +0 -1
  17. package/dist/src/decorators/index.js.map +1 -1
  18. package/dist/src/decorators/property.d.ts +1 -0
  19. package/dist/src/decorators/property.js +10 -1
  20. package/dist/src/decorators/property.js.map +1 -1
  21. package/dist/src/decorators/query.d.ts +13 -6
  22. package/dist/src/decorators/query.js +18 -1
  23. package/dist/src/decorators/query.js.map +1 -1
  24. package/dist/src/dto/cursor-pagination.d.ts +19 -0
  25. package/dist/src/dto/cursor-pagination.js +89 -0
  26. package/dist/src/dto/cursor-pagination.js.map +1 -0
  27. package/dist/src/dto/index.d.ts +1 -0
  28. package/dist/src/dto/index.js +1 -0
  29. package/dist/src/dto/index.js.map +1 -1
  30. package/dist/src/{decorators/restful.d.ts → restful.d.ts} +19 -2
  31. package/dist/src/{decorators/restful.js → restful.js} +116 -6
  32. package/dist/src/restful.js.map +1 -0
  33. package/dist/src/utility/cursor-pagination-utils.d.ts +15 -0
  34. package/dist/src/utility/cursor-pagination-utils.js +158 -0
  35. package/dist/src/utility/cursor-pagination-utils.js.map +1 -0
  36. package/index.ts +1 -0
  37. package/package.json +2 -1
  38. package/dist/src/decorators/restful.js.map +0 -1
package/README.md CHANGED
@@ -203,15 +203,17 @@ NICOT 提供了一套查询装饰器,用于在 Entity 字段上声明支持的
203
203
 
204
204
  ### ✅ 内建查询装饰器
205
205
 
206
- | 装饰器名 | 查询效果 |
207
- |-----------------------------|------------------------------------------------|
208
- | `@QueryEqual()` | 精确匹配:`WHERE field = :value` |
209
- | `@QueryLike()` | 前缀模糊匹配:`WHERE field LIKE :value%` |
210
- | `@QuerySearch()` | 宽泛模糊搜索:`WHERE field LIKE %:value%` |
211
- | `@QueryMatchBoolean()` | `true/false/1/0` 转换为布尔类型查询 |
212
- | `@QueryEqualZeroNullable()` | `0 → IS NULL`,否则 `= :value`(适合 nullable)|
213
- | `@QueryGreater()` | 大于查询:`WHERE field > :value` |
214
- | `@QueryOrderBy()` | 排序字段控制:`ORDER BY field ASC|DESC` |
206
+ | 装饰器名 | 查询效果 |
207
+ |-------------------------------|------------------------------------------|
208
+ | `@QueryEqual()` | 精确匹配:`WHERE field = :value` |
209
+ | `@QueryLike()` | 前缀模糊匹配:`WHERE field LIKE :value%` |
210
+ | `@QuerySearch()` | 宽泛模糊搜索:`WHERE field LIKE %:value%` |
211
+ | `@QueryMatchBoolean()` | `true/false/1/0` 转换为布尔类型查询 |
212
+ | `@QueryEqualZeroNullable()` | `0 → IS NULL`,否则 `= :value`(适合 nullable) |
213
+ | `@QueryGreater(field)` | 大于查询:`WHERE field > :value` |
214
+ | `@QueryLess(field)` | 小于查询:`WHERE field < :value` |
215
+ | `@QueryGreaterOrEqual(field)` | 大于等于查询:`WHERE field >= :value` |
216
+ | `@QueryLessOrEqual(field)` | 小于等于查询:`WHERE field <= :value` |
215
217
 
216
218
  ---
217
219
 
@@ -665,6 +667,139 @@ GET /user?name=Tom&pageCount=2&recordsPerPage=10
665
667
 
666
668
  ---
667
669
 
670
+ ## 🔁 游标分页(Cursor Pagination)
671
+
672
+ NICOT 支持游标式分页查询(Cursor-based Pagination),相比传统的页码分页,在数据量大、频繁变更或无限滚动的场景中更加稳定可靠。
673
+
674
+ ---
675
+
676
+ ### ✅ 使用方式
677
+
678
+ 定义查询 DTO 时继承工厂生成的游标分页基类:
679
+
680
+ ```ts
681
+ class FindAllUserCursorDto extends factory.findAllCursorPaginatedDto {}
682
+ ```
683
+
684
+ 在 Controller 中,使用以下工厂方法:
685
+
686
+ ```ts
687
+ @factory.findAllCursorPaginated()
688
+ async findAll(@factory.findAllParam() dto: FindAllUserCursorDto) {
689
+ return this.service.findAllCursorPaginated(dto);
690
+ }
691
+ ```
692
+
693
+ > ⚠️ 注意:`findAll()` 与 `findAllCursorPaginated()` **不能同时使用**,因为它们会绑定到同一个 GET `/` 路由。请选择其中一种分页模式。
694
+
695
+ ---
696
+
697
+ ### 📥 请求字段说明
698
+
699
+ | 字段名 | 类型 | 描述 |
700
+ |--------------------|---------|------------------------------------------------|
701
+ | `recordsPerPage` | number | 每页数据数量,默认 25 |
702
+ | `paginationCursor` | string | 上一次请求返回的游标(`nextCursor` 或 `previousCursor`)|
703
+
704
+ - 首次请求无需传 `paginationCursor`
705
+ - 后续请求使用返回的游标即可获取上一页或下一页数据
706
+
707
+ ---
708
+
709
+ ### 📤 返回结构说明
710
+
711
+ 返回值格式与传统分页一致,但字段不同:
712
+
713
+ ```json
714
+ {
715
+ "statusCode": 200,
716
+ "success": true,
717
+ "message": "success",
718
+ "timestamp": "2025-04-25T12:00:00.000Z",
719
+ "data": [{}],
720
+ "nextCursor": "eyJpZCI6MTAwfQ",
721
+ "previousCursor": "eyJpZCI6NDB9"
722
+ }
723
+ ```
724
+
725
+ - 游标格式为 Base64URL 编码(安全可用于 URL 参数)
726
+ - `nextCursor` / `previousCursor` 是可选字段,仅在有下一页或上一页时返回
727
+
728
+ ---
729
+
730
+ ### 🔐 兼容性说明
731
+
732
+ - 所有字段控制装饰器(如 `@NotInResult()`, `@QueryEqual()`, `@NotQueryable()` 等)在游标分页中同样生效
733
+ - 查询参数仍来自实体声明,Swagger 自动生成文档
734
+ - 无需变更现有实体结构,只需更换 `findAllDto` 和分页调用方法
735
+
736
+ ---
737
+
738
+ ### ✅ 适用场景
739
+
740
+ - 无限滚动分页加载(如微博、时间线)
741
+ - 数据频繁变动(传统分页页数易错)
742
+ - 前后端希望避免“总页数”等全表统计带来的性能消耗
743
+
744
+ ---
745
+
746
+ ### 🧪 示例请求
747
+
748
+ ```http
749
+ GET /user?recordsPerPage=20&paginationCursor=eyJpZCI6MTAwfQ
750
+ ```
751
+
752
+ ---
753
+
754
+ ### 🛑 注意事项
755
+
756
+ - 不支持跳页(如 pageCount = 5 这种跳转)
757
+ - 不再返回 `pageCount`、`totalPages` 等字段
758
+ - 若你的 Controller 中已有 `@factory.findAll()`,请不要再使用游标分页版本
759
+
760
+ ---
761
+
762
+ ## 一键生成 Controller
763
+
764
+ 在一般情况下,可以使用 `factory.restfulController()` 生成 RESTful 控制器,自动处理所有 CRUD 接口。
765
+
766
+ ```ts
767
+ const factory = new RestfulFactory(User, {
768
+ relations: ['articles'],
769
+ });
770
+
771
+ @Controller('user')
772
+ class UserController extends factory.restfulController() {
773
+ constructor(userService: UserService) {
774
+ super(userService)
775
+ }
776
+ }
777
+ ```
778
+
779
+ 这样就可以自动生成所有 CRUD 接口,无需手动编写。
780
+
781
+ ### 选项
782
+
783
+ ```ts
784
+ class UserController extends factory.restfulController({
785
+ pagination: 'offset' // findAll 的分页模式。可以是 'offset', 'cursor', 'none'。默认为 'offset'
786
+ globalMethodDecorators: [ApiError(404, 'Error')] // 每个方法都添加的装饰器
787
+ routes: {
788
+ findOne: {
789
+ methodDecorators: [] // 本方法的装饰器
790
+ },
791
+ import: {
792
+ enabled: false // 禁用该路由
793
+ },
794
+ // ...
795
+ }
796
+ }) {}
797
+ ```
798
+
799
+ > 如果需要覆盖某个方法的实现,请在 `routes` 中设置 `enabled: false`,然后手动实现该方法。
800
+
801
+ ---
802
+
668
803
  ## 📦 统一返回结构与接口注解
669
804
 
670
805
  NICOT 默认提供统一的接口返回格式与 Swagger 自动注解能力,便于前后端标准化对接。
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import 'reflect-metadata';
2
2
  export * from 'nesties';
3
3
  export * from './src/crud-base';
4
+ export * from './src/restful';
4
5
  export * from './src/bases';
5
6
  export * from './src/decorators';
6
7
  export * from './src/dto';
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  require("reflect-metadata");
18
18
  __exportStar(require("nesties"), exports);
19
19
  __exportStar(require("./src/crud-base"), exports);
20
+ __exportStar(require("./src/restful"), exports);
20
21
  __exportStar(require("./src/bases"), exports);
21
22
  __exportStar(require("./src/decorators"), exports);
22
23
  __exportStar(require("./src/dto"), exports);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,0CAAwB;AACxB,kDAAgC;AAChC,8CAA4B;AAC5B,mDAAiC;AACjC,4CAA0B;AAC1B,gDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,0CAAwB;AACxB,kDAAgC;AAChC,gDAA8B;AAC9B,8CAA4B;AAC5B,mDAAiC;AACjC,4CAA0B;AAC1B,gDAA8B"}
@@ -0,0 +1,32 @@
1
+ import { CrudBase, RelationDef } from '../crud-base';
2
+ import { Repository } from 'typeorm';
3
+ import { ClassType } from 'nesties';
4
+ export declare const RestfulMethods: readonly ["findOne", "findAll", "create", "update", "delete", "import"];
5
+ export declare type RestfulMethods = typeof RestfulMethods[number];
6
+ export declare type RestfulPaginateType = 'offset' | 'cursor' | 'none';
7
+ export declare class BaseRestfulController<T extends {
8
+ id: any;
9
+ }> {
10
+ _options: Partial<{
11
+ paginateType: RestfulPaginateType;
12
+ relations: (string | RelationDef)[];
13
+ entityClass: ClassType<T>;
14
+ }>;
15
+ service: CrudBase<T>;
16
+ constructor(serviceOrRepo: CrudBase<T> | Repository<T>, _options?: Partial<{
17
+ paginateType: RestfulPaginateType;
18
+ relations: (string | RelationDef)[];
19
+ entityClass: ClassType<T>;
20
+ }>);
21
+ findOne(id: number): Promise<import("nesties").GenericReturnMessageDto<T>>;
22
+ findAll(dto: Partial<T>): Promise<import("nesties").GenericPaginatedReturnMessageDto<T>> | Promise<import("../dto").GenericCursorPaginationReturnMessageDto<T>>;
23
+ create(dto: T): Promise<import("nesties").GenericReturnMessageDto<T>>;
24
+ update(id: number, dto: Partial<T>): Promise<import("nesties").BlankReturnMessageDto>;
25
+ delete(id: number): Promise<import("nesties").BlankReturnMessageDto>;
26
+ import(data: {
27
+ data: T[];
28
+ }): Promise<import("nesties").GenericReturnMessageDto<{
29
+ result: string;
30
+ entry: T;
31
+ }[]>>;
32
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseRestfulController = exports.RestfulMethods = void 0;
4
+ const crud_base_1 = require("../crud-base");
5
+ exports.RestfulMethods = [
6
+ 'findOne',
7
+ 'findAll',
8
+ 'create',
9
+ 'update',
10
+ 'delete',
11
+ 'import',
12
+ ];
13
+ class BaseRestfulController {
14
+ constructor(serviceOrRepo, _options = {}) {
15
+ this._options = _options;
16
+ if (serviceOrRepo instanceof crud_base_1.CrudBase) {
17
+ this.service = serviceOrRepo;
18
+ }
19
+ else {
20
+ const crudServiceClass = (0, crud_base_1.CrudService)(this._options.entityClass, {
21
+ relations: this._options.relations,
22
+ });
23
+ this.service = new crudServiceClass(serviceOrRepo);
24
+ }
25
+ }
26
+ findOne(id) {
27
+ return this.service.findOne(id);
28
+ }
29
+ findAll(dto) {
30
+ if (this._options.paginateType === 'cursor') {
31
+ return this.service.findAllCursorPaginated(dto);
32
+ }
33
+ if (this._options.paginateType === 'offset') {
34
+ return this.service.findAll(dto);
35
+ }
36
+ dto['recordsPerPage'] ??= 99999;
37
+ return this.service.findAll(dto);
38
+ }
39
+ create(dto) {
40
+ return this.service.create(dto);
41
+ }
42
+ update(id, dto) {
43
+ return this.service.update(id, dto);
44
+ }
45
+ delete(id) {
46
+ return this.service.delete(id);
47
+ }
48
+ import(data) {
49
+ return this.service.importEntities(data.data);
50
+ }
51
+ }
52
+ exports.BaseRestfulController = BaseRestfulController;
53
+ //# sourceMappingURL=base-restful-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-restful-controller.js","sourceRoot":"","sources":["../../../src/bases/base-restful-controller.ts"],"names":[],"mappings":";;;AAAA,4CAAkE;AAIrD,QAAA,cAAc,GAAG;IAC5B,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;CACA,CAAC;AAMX,MAAa,qBAAqB;IAEhC,YACE,aAA0C,EACnC,WAIF,EAAE;QAJA,aAAQ,GAAR,QAAQ,CAIR;QAEP,IAAI,aAAa,YAAY,oBAAQ,EAAE;YACrC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;SAC9B;aAAM;YACL,MAAM,gBAAgB,GAAG,IAAA,uBAAW,EAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;gBAC9D,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;aACnC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAAC;SACpD;IACH,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,CAAC,GAAe;QACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,KAAK,QAAQ,EAAE;YAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;SACjD;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,KAAK,QAAQ,EAAE;YAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SAClC;QACD,GAAG,CAAC,gBAAgB,CAAC,KAAK,KAAK,CAAC;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,GAAM;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,GAAe;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,IAAmB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;CACF;AAlDD,sDAkDC"}
@@ -22,6 +22,7 @@ export declare function IdBase(idOptions?: IdOptions): {
22
22
  getPageCount(): number;
23
23
  getRecordsPerPage(): number;
24
24
  getStartingFrom(): number;
25
+ applyPaginationQuery(qb: SelectQueryBuilder<any>): void;
25
26
  };
26
27
  };
27
28
  export interface StringIdOptions extends IdOptions {
@@ -48,5 +49,6 @@ export declare function StringIdBase(idOptions: StringIdOptions): {
48
49
  getPageCount(): number;
49
50
  getRecordsPerPage(): number;
50
51
  getStartingFrom(): number;
52
+ applyPaginationQuery(qb: SelectQueryBuilder<any>): void;
51
53
  };
52
54
  };
@@ -6,7 +6,7 @@ export interface PageSettingsFactory {
6
6
  export interface QueryWise<T> {
7
7
  applyQuery(qb: SelectQueryBuilder<T>, entityName: string): void;
8
8
  }
9
- export declare type QueryCond = <T extends PageSettingsDto>(obj: T, qb: SelectQueryBuilder<T>, entityName: string, key: keyof T & string) => any;
9
+ export declare type QueryCond = <T>(obj: T, qb: SelectQueryBuilder<T>, entityName: string, key: keyof T & string) => any;
10
10
  export declare class PageSettingsDto implements PageSettingsWise, PageSettingsFactory, QueryWise<PageSettingsDto> {
11
11
  pageCount: number;
12
12
  recordsPerPage: number;
@@ -14,5 +14,6 @@ export declare class PageSettingsDto implements PageSettingsWise, PageSettingsFa
14
14
  getPageCount(): number;
15
15
  getRecordsPerPage(): number;
16
16
  getStartingFrom(): number;
17
- applyQuery(qb: SelectQueryBuilder<PageSettingsDto>, entityName: string): void;
17
+ applyPaginationQuery(qb: SelectQueryBuilder<any>): void;
18
+ applyQuery(qb: SelectQueryBuilder<any>, entityName: string): void;
18
19
  }
@@ -13,7 +13,6 @@ exports.PageSettingsDto = void 0;
13
13
  const decorators_1 = require("../decorators");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const swagger_1 = require("@nestjs/swagger");
16
- const metadata_1 = require("../utility/metadata");
17
16
  class PageSettingsDto {
18
17
  getActualPageSettings() {
19
18
  return {
@@ -22,24 +21,18 @@ class PageSettingsDto {
22
21
  };
23
22
  }
24
23
  getPageCount() {
25
- return this.pageCount || 1;
24
+ return parseInt(this.pageCount) || 1;
26
25
  }
27
26
  getRecordsPerPage() {
28
- return this.recordsPerPage || 25;
27
+ return parseInt(this.recordsPerPage) || 25;
29
28
  }
30
29
  getStartingFrom() {
31
30
  return (this.getPageCount() - 1) * this.getRecordsPerPage();
32
31
  }
33
- applyQuery(qb, entityName) {
34
- const queryFields = metadata_1.reflector.getArray('queryConditionFields', this);
35
- for (const field of queryFields) {
36
- const condition = metadata_1.reflector.get('queryCondition', this, field);
37
- if (condition) {
38
- condition(this, qb, entityName, field);
39
- }
40
- }
32
+ applyPaginationQuery(qb) {
41
33
  qb.take(this.getRecordsPerPage()).skip(this.getStartingFrom());
42
34
  }
35
+ applyQuery(qb, entityName) { }
43
36
  }
44
37
  __decorate([
45
38
  (0, decorators_1.NotWritable)(),
@@ -1 +1 @@
1
- {"version":3,"file":"page-settings.js","sourceRoot":"","sources":["../../../src/bases/page-settings.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8CAAyD;AAEzD,qDAAoD;AACpD,6CAA8C;AAC9C,kDAAgD;AAkBhD,MAAa,eAAe;IA2B1B,qBAAqB;QACnB,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE;YAC9B,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,eAAe;QACb,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC9D,CAAC;IAED,UAAU,CAAC,EAAuC,EAAE,UAAkB;QACpE,MAAM,WAAW,GAAG,oBAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;YAC/B,MAAM,SAAS,GAAG,oBAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,KAA8B,CAAC,CAAC;aACjE;SACF;QACD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACjE,CAAC;CACF;AA3CC;IAVC,IAAA,wBAAW,GAAE;IACb,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,wBAAW,GAAE;;kDACI;AAYlB;IAVC,IAAA,wBAAW,GAAE;IACb,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,wBAAW,GAAE;;uDACS;AAzBzB,0CAwDC"}
1
+ {"version":3,"file":"page-settings.js","sourceRoot":"","sources":["../../../src/bases/page-settings.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8CAAyD;AAEzD,qDAAoD;AACpD,6CAA8C;AAmB9C,MAAa,eAAe;IA2B1B,qBAAqB;QACnB,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE;YAC9B,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAgB,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,iBAAiB;QACf,OAAO,QAAQ,CAAC,IAAI,CAAC,cAAqB,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,eAAe;QACb,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC9D,CAAC;IAED,oBAAoB,CAAC,EAA2B;QAC9C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,UAAU,CAAC,EAA2B,EAAE,UAAkB,IAAG,CAAC;CAC/D;AAtCC;IAVC,IAAA,wBAAW,GAAE;IACb,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,wBAAW,GAAE;;kDACI;AAYlB;IAVC,IAAA,wBAAW,GAAE;IACb,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,mBAAmB;QAChC,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,wBAAW,GAAE;;uDACS;AAzBzB,0CAmDC"}
@@ -1,7 +1,8 @@
1
1
  import { FindOptionsWhere, Repository, SelectQueryBuilder } from 'typeorm';
2
- import { DeletionWise, EntityHooks, PageSettingsFactory, QueryWise } from './bases';
2
+ import { EntityHooks, PageSettingsDto, PageSettingsFactory, QueryWise } from './bases';
3
3
  import { ConsoleLogger } from '@nestjs/common';
4
- import { BlankReturnMessageDto, ClassType } from 'nesties';
4
+ import { BlankReturnMessageDto, ClassType, PageSettingsWise } from 'nesties';
5
+ import { CursorPaginationDto } from './dto/cursor-pagination';
5
6
  export declare type EntityId<T extends {
6
7
  id: any;
7
8
  }> = T['id'];
@@ -16,7 +17,7 @@ export declare const Relation: (name: string, options?: Omit<RelationDef, 'name'
16
17
  export declare const Inner: (name: string, options?: Omit<RelationDef, 'name'>) => RelationDef;
17
18
  export declare type ValidCrudEntity<T> = Record<string, any> & {
18
19
  id: any;
19
- } & Partial<QueryWise<T> & DeletionWise & EntityHooks & PageSettingsFactory>;
20
+ } & Partial<QueryWise<T> & EntityHooks & PageSettingsFactory>;
20
21
  export interface CrudOptions<T extends ValidCrudEntity<T>> {
21
22
  relations?: (string | RelationDef)[];
22
23
  extraGetQuery?: (qb: SelectQueryBuilder<T>) => void;
@@ -41,10 +42,16 @@ export declare class CrudBase<T extends ValidCrudEntity<T>> {
41
42
  result: string;
42
43
  entry: T;
43
44
  }[]>;
44
- readonly entityPaginatedReturnMessageDto: new (statusCode: number, message: string, data: T[], total: number, pageSettings: import("nesties").PageSettingsWise) => import("nesties").GenericPaginatedReturnMessageDto<T>;
45
+ readonly entityPaginatedReturnMessageDto: new (statusCode: number, message: string, data: T[], total: number, pageSettings: PageSettingsWise) => import("nesties").GenericPaginatedReturnMessageDto<T>;
46
+ readonly entityCursorPaginatedReturnMessageDto: new (statusCode: number, message: string, data: T[], cursorResponse: import("./dto").CursorPaginationResponseWise) => import("./dto").GenericCursorPaginationReturnMessageDto<T>;
45
47
  readonly entityRelations: (string | RelationDef)[];
46
48
  readonly extraGetQuery: (qb: SelectQueryBuilder<T>) => void;
47
49
  readonly log: ConsoleLogger;
50
+ readonly _typeormRelations: {
51
+ isArray: boolean;
52
+ propertyClass: import("nesties").AnyClass;
53
+ propertyName: string;
54
+ }[];
48
55
  constructor(entityClass: ClassType<T>, repo: Repository<T>, crudOptions: CrudOptions<T>);
49
56
  _cleanEntityNotInResultFields(ent: T): T;
50
57
  cleanEntityNotInResultFields<E extends T | T[]>(ents: E): E;
@@ -57,11 +64,18 @@ export declare class CrudBase<T extends ValidCrudEntity<T>> {
57
64
  }>;
58
65
  create(_ent: T, beforeCreate?: (repo: Repository<T>) => Promise<void>): Promise<import("nesties").GenericReturnMessageDto<T>>;
59
66
  get entityAliasName(): string;
60
- _applyRelationToQuery(qb: SelectQueryBuilder<T>, relation: RelationDef): void;
61
- _applyRelationsToQuery(qb: SelectQueryBuilder<T>): void;
67
+ _applyQueryRelation(qb: SelectQueryBuilder<T>, relation: RelationDef): void;
68
+ _applyQueryRelations(qb: SelectQueryBuilder<T>): void;
69
+ _applyQueryFilters(qb: SelectQueryBuilder<T>, ent: T): void;
62
70
  queryBuilder(): SelectQueryBuilder<T>;
63
71
  findOne(id: EntityId<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("nesties").GenericReturnMessageDto<T>>;
72
+ _preFindAll(ent?: Partial<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<{
73
+ query: SelectQueryBuilder<T>;
74
+ newEnt: T;
75
+ pageSettings: T & PageSettingsDto;
76
+ }>;
64
77
  findAll(ent?: Partial<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("nesties").GenericPaginatedReturnMessageDto<T>>;
78
+ findAllCursorPaginated(ent?: Partial<T & Partial<CursorPaginationDto>>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("./dto").GenericCursorPaginationReturnMessageDto<T>>;
65
79
  update(id: EntityId<T>, entPart: Partial<T>, cond?: FindOptionsWhere<T>): Promise<BlankReturnMessageDto>;
66
80
  delete(id: EntityId<T>, cond?: FindOptionsWhere<T>): Promise<BlankReturnMessageDto>;
67
81
  importEntities(_ents: T[], extraChecking?: (ent: T) => string | Promise<string>): Promise<import("nesties").GenericReturnMessageDto<{
@@ -85,10 +99,16 @@ export declare function CrudService<T extends ValidCrudEntity<T>>(entityClass: C
85
99
  result: string;
86
100
  entry: T;
87
101
  }[]>;
88
- readonly entityPaginatedReturnMessageDto: new (statusCode: number, message: string, data: T[], total: number, pageSettings: import("nesties").PageSettingsWise) => import("nesties").GenericPaginatedReturnMessageDto<T>;
102
+ readonly entityPaginatedReturnMessageDto: new (statusCode: number, message: string, data: T[], total: number, pageSettings: PageSettingsWise) => import("nesties").GenericPaginatedReturnMessageDto<T>;
103
+ readonly entityCursorPaginatedReturnMessageDto: new (statusCode: number, message: string, data: T[], cursorResponse: import("./dto").CursorPaginationResponseWise) => import("./dto").GenericCursorPaginationReturnMessageDto<T>;
89
104
  readonly entityRelations: (string | RelationDef)[];
90
105
  readonly extraGetQuery: (qb: SelectQueryBuilder<T>) => void;
91
106
  readonly log: ConsoleLogger;
107
+ readonly _typeormRelations: {
108
+ isArray: boolean;
109
+ propertyClass: import("nesties").AnyClass;
110
+ propertyName: string;
111
+ }[];
92
112
  entityClass: ClassType<T>;
93
113
  repo: Repository<T>;
94
114
  crudOptions: CrudOptions<T>;
@@ -103,11 +123,18 @@ export declare function CrudService<T extends ValidCrudEntity<T>>(entityClass: C
103
123
  }>;
104
124
  create(_ent: T, beforeCreate?: (repo: Repository<T>) => Promise<void>): Promise<import("nesties").GenericReturnMessageDto<T>>;
105
125
  readonly entityAliasName: string;
106
- _applyRelationToQuery(qb: SelectQueryBuilder<T>, relation: RelationDef): void;
107
- _applyRelationsToQuery(qb: SelectQueryBuilder<T>): void;
126
+ _applyQueryRelation(qb: SelectQueryBuilder<T>, relation: RelationDef): void;
127
+ _applyQueryRelations(qb: SelectQueryBuilder<T>): void;
128
+ _applyQueryFilters(qb: SelectQueryBuilder<T>, ent: T): void;
108
129
  queryBuilder(): SelectQueryBuilder<T>;
109
130
  findOne(id: EntityId<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("nesties").GenericReturnMessageDto<T>>;
131
+ _preFindAll(ent?: Partial<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<{
132
+ query: SelectQueryBuilder<T>;
133
+ newEnt: T;
134
+ pageSettings: T & PageSettingsDto;
135
+ }>;
110
136
  findAll(ent?: Partial<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("nesties").GenericPaginatedReturnMessageDto<T>>;
137
+ findAllCursorPaginated(ent?: Partial<T & Partial<CursorPaginationDto>>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("./dto").GenericCursorPaginationReturnMessageDto<T>>;
111
138
  update(id: EntityId<T>, entPart: Partial<T>, cond?: FindOptionsWhere<T>): Promise<BlankReturnMessageDto>;
112
139
  delete(id: EntityId<T>, cond?: FindOptionsWhere<T>): Promise<BlankReturnMessageDto>;
113
140
  importEntities(_ents: T[], extraChecking?: (ent: T) => string | Promise<string>): Promise<import("nesties").GenericReturnMessageDto<{