nicot 1.1.9 → 1.1.11

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/README.md CHANGED
@@ -13,8 +13,10 @@
13
13
 
14
14
  ## 📦 安装
15
15
 
16
+ 在你的 Nest.js 项目中:
17
+
16
18
  ```bash
17
- npm install nicot typeorm @nestjs/typeorm class-validator class-transformer reflect-metadata @nestjs/swagger
19
+ npm install nicot @nestjs/config typeorm @nestjs/typeorm class-validator class-transformer reflect-metadata @nestjs/swagger
18
20
  ```
19
21
 
20
22
  ---
@@ -478,8 +480,133 @@ export class UserController {
478
480
  - 所有的接口都是返回状态码 200。
479
481
  - OpenAPI 文档会自动生成,包含所有 DTO 类型与查询参数。
480
482
  - Service 需要使用 `CrudService(Entity, options)` 进行标准化实现。
481
- - `RestfulFactory` 的选项 `options` 支持传入 `relations`,形式和 `CrudService` 一致,用于自动裁剪结果 DTO 字段。
482
- - 如果本内容的 `CrudService` 不查询任何关系字段,那么请设置 `{ relations: [] }` 以裁剪所有关系字段。
483
+
484
+ ---
485
+
486
+ ### 导出 DTO 类
487
+
488
+ `RestfulFactory` 会自动生成以下 DTO 类:供你导出并在其他的 OpenAPI 装饰器中使用。
489
+
490
+ ```ts
491
+ const factory = new RestfulFactory(User, {
492
+ relations: ['articles'],
493
+ });
494
+
495
+ class CreateUserDto extends factory.createDto {} // 创建用 DTO,在 POST /user 中使用
496
+ class UpdateUserDto extends factory.updateDto {} // 更新用 DTO,在 PATCH /user/:id 中使用
497
+ class FindAllUserDto extends factory.findAllDto {} // 查询用 DTO,在 GET /user 中使用
498
+ class UserResultDto extends factory.entityResultDto {} // 查询结果 DTO,在 GET /user/:id 和 GET /user 中返回
499
+ class UserCreateResultDto extends factory.entityCreateResultDto {} // 创建结果 DTO,在 POST /user 中返回。相比 entityResultDto 省略了间接字段和关系字段
500
+ class UserReturnMessageDto extends factory.entityReturnMessageDto {} // 相当于 ReturnMessageDto(UserResultDto),在 GET /user 中返回
501
+ class UserCreateReturnMessageDto extends factory.entityCreateReturnMessageDto {} // 相当于 ReturnMessageDto(UserCreateResultDto),在 POST /user 中返回
502
+ class UserArrayResultDto extends factory.entityArrayResultDto {} // 相当于 PaginatedReturnMessageDto(UserResultDto),在 GET /user 中返回
503
+ ```
504
+
505
+ ---
506
+
507
+ ### 关系定义
508
+
509
+ 类似于 `CrudService`,`RestfulFactory` 也需要在配置中定义关系字段。语法和 `CrudService` 的 `relations` 参数完全一致。
510
+
511
+ ```ts
512
+ class User extends IdBase() {
513
+ @OneToMany(() => Article, article => article.user)
514
+ articles: Article[];
515
+
516
+ @OneToMany(() => Comment, comment => comment.user)
517
+ comments: Comment[];
518
+
519
+ @OneToMany(() => Like, like => like.users)
520
+ likes: Like[];
521
+ }
522
+
523
+ class Article extends IdBase() {
524
+ @ManyToOne(() => User, user => user.articles)
525
+ user: User;
526
+
527
+ @OneToMany(() => Comment, comment => comment.article)
528
+ comments: Comment[];
529
+
530
+ @OneToMany(() => Like, like => like.article)
531
+ likes: Like[];
532
+ }
533
+
534
+ class Like extends IdBase() {
535
+ @ManyToOne(() => User, user => user.likes)
536
+ user: User;
537
+
538
+ @ManyToOne(() => Article, article => article.likes)
539
+ article: Article;
540
+ }
541
+
542
+ class Comment extends IdBase() {
543
+ @ManyToOne(() => Article, article => article.comments)
544
+ article: Article;
545
+
546
+ @ManyToOne(() => User, user => user.articles)
547
+ user: User;
548
+ }
549
+
550
+ const factory = new RestfulFactory(User, {
551
+ relations: ['comments', 'articles', 'articles.comments'], // 生成的 DTO 类中,只含有标明的关系字段,而 articles.user 不会被包含
552
+ });
553
+
554
+ class UserResultDto extends factory.entityResultDto {
555
+ // 生成的 DTO 类中包含 comments, articles, articles.comments 字段
556
+ // 但是不包含 likes, articles.user, articles.likes 等未声明关系字段
557
+ }
558
+ ```
559
+
560
+ 如果你的配套 `CrudService` 不准备加载任何关系,那么可以传入空数组:
561
+
562
+ ```ts
563
+ const factory = new RestfulFactory(User, {
564
+ relations: [], // DTO 不包含任何关系字段
565
+ });
566
+ ```
567
+
568
+ 如果不写 `relations`,则默认会尽可能加载所有非 `@NotInResult()` 的关系字段。但现在推荐显式声明需要加载的关系,以避免不必要的 OpenAPI 文档杂乱。
569
+
570
+ > 这是曾经版本的 nicot (<1.1.9) 的做法。
571
+
572
+ ---
573
+
574
+ ### 依赖关系的间接字段
575
+
576
+ 如果你有实体类,某一间接字段(`@NotColumn()`),依赖某个关系字段,那么需要显示声明这个字段。
577
+
578
+ ```ts
579
+ export class Participant extends IdBase() {
580
+ @OneToMany(() => Match, match => match.player1)
581
+ matches1: Match[];
582
+
583
+ @OneToMany(() => Match, match => match.player2)
584
+ matches2: Match[];
585
+ }
586
+
587
+ export class Match extends IdBase() {
588
+ @ManyToOne(() => Participant, participant => participant.matches1)
589
+ player1: Participant;
590
+ @ManyToOne(() => Participant, participant => participant.matches2)
591
+ player2: Participant;
592
+
593
+ @NotColumn()
594
+ @RelationComputed(() => Participant) // 声明这个字段依赖于 player1 和 player2 生成,当作关系参与裁剪,避免被拖入 Participant 属性黑洞
595
+ players: Participant[];
596
+
597
+ async afterGet() {
598
+ this.players = [this.player1, this.player2].filter(s => s);
599
+ }
600
+ }
601
+
602
+ const factory = new RestfulFactory(Match, {
603
+ relations: ['player1', 'player2', 'players'],
604
+ });
605
+
606
+ class MatchResultDto extends factory.entityResultDto {
607
+ // 包含 player1, player2, players 字段,但是不包含 player1.matches1, player1.matches2 等间接关系字段
608
+ }
609
+ ```
483
610
 
484
611
  ---
485
612
 
@@ -538,6 +665,98 @@ GET /user?name=Tom&pageCount=2&recordsPerPage=10
538
665
 
539
666
  ---
540
667
 
668
+ ## 🔁 游标分页(Cursor Pagination)
669
+
670
+ NICOT 支持游标式分页查询(Cursor-based Pagination),相比传统的页码分页,在数据量大、频繁变更或无限滚动的场景中更加稳定可靠。
671
+
672
+ ---
673
+
674
+ ### ✅ 使用方式
675
+
676
+ 定义查询 DTO 时继承工厂生成的游标分页基类:
677
+
678
+ ```ts
679
+ class FindAllUserCursorDto extends factory.findAllCursorPaginatedDto {}
680
+ ```
681
+
682
+ 在 Controller 中,使用以下工厂方法:
683
+
684
+ ```ts
685
+ @factory.findAllCursorPaginated()
686
+ async findAll(@factory.findAllParam() dto: FindAllUserCursorDto) {
687
+ return this.service.findAllCursorPaginated(dto);
688
+ }
689
+ ```
690
+
691
+ > ⚠️ 注意:`findAll()` 与 `findAllCursorPaginated()` **不能同时使用**,因为它们会绑定到同一个 GET `/` 路由。请选择其中一种分页模式。
692
+
693
+ ---
694
+
695
+ ### 📥 请求字段说明
696
+
697
+ | 字段名 | 类型 | 描述 |
698
+ |--------------------|---------|------------------------------------------------|
699
+ | `recordsPerPage` | number | 每页数据数量,默认 25 |
700
+ | `paginationCursor` | string | 上一次请求返回的游标(`nextCursor` 或 `previousCursor`)|
701
+
702
+ - 首次请求无需传 `paginationCursor`
703
+ - 后续请求使用返回的游标即可获取上一页或下一页数据
704
+
705
+ ---
706
+
707
+ ### 📤 返回结构说明
708
+
709
+ 返回值格式与传统分页一致,但字段不同:
710
+
711
+ ```json
712
+ {
713
+ "statusCode": 200,
714
+ "success": true,
715
+ "message": "success",
716
+ "timestamp": "2025-04-25T12:00:00.000Z",
717
+ "data": [{}],
718
+ "nextCursor": "eyJpZCI6MTAwfQ",
719
+ "previousCursor": "eyJpZCI6NDB9"
720
+ }
721
+ ```
722
+
723
+ - 游标格式为 Base64URL 编码(安全可用于 URL 参数)
724
+ - `nextCursor` / `previousCursor` 是可选字段,仅在有下一页或上一页时返回
725
+
726
+ ---
727
+
728
+ ### 🔐 兼容性说明
729
+
730
+ - 所有字段控制装饰器(如 `@NotInResult()`, `@QueryEqual()`, `@NotQueryable()` 等)在游标分页中同样生效
731
+ - 查询参数仍来自实体声明,Swagger 自动生成文档
732
+ - 无需变更现有实体结构,只需更换 `findAllDto` 和分页调用方法
733
+
734
+ ---
735
+
736
+ ### ✅ 适用场景
737
+
738
+ - 无限滚动分页加载(如微博、时间线)
739
+ - 数据频繁变动(传统分页页数易错)
740
+ - 前后端希望避免“总页数”等全表统计带来的性能消耗
741
+
742
+ ---
743
+
744
+ ### 🧪 示例请求
745
+
746
+ ```http
747
+ GET /user?recordsPerPage=20&paginationCursor=eyJpZCI6MTAwfQ
748
+ ```
749
+
750
+ ---
751
+
752
+ ### 🛑 注意事项
753
+
754
+ - 不支持跳页(如 pageCount = 5 这种跳转)
755
+ - 不再返回 `pageCount`、`totalPages` 等字段
756
+ - 若你的 Controller 中已有 `@factory.findAll()`,请不要再使用游标分页版本
757
+
758
+ ---
759
+
541
760
  ## 📦 统一返回结构与接口注解
542
761
 
543
762
  NICOT 默认提供统一的接口返回格式与 Swagger 自动注解能力,便于前后端标准化对接。
@@ -546,10 +765,9 @@ NICOT 默认提供统一的接口返回格式与 Swagger 自动注解能力,
546
765
 
547
766
  ### ✅ 返回结构 DTO 类型(用于 Swagger 类型标注)
548
767
 
549
- #### `ReturnMessageDto(EntityClass)`
550
- 用于生成带数据的标准返回结构类型(**不是直接返回值**,用于 `@nestjs/swagger`)。
768
+ #### `ReturnMessageDto(EntityClass)`
551
769
 
552
- 返回结构样式:
770
+ 用于生成带数据的标准返回结构类型(**不是直接返回值**,用于 `@nestjs/swagger`)。
553
771
 
554
772
  ```json
555
773
  {
@@ -557,13 +775,42 @@ NICOT 默认提供统一的接口返回格式与 Swagger 自动注解能力,
557
775
  "success": true,
558
776
  "message": "success",
559
777
  "timestamp": "2025-04-25T12:00:00.000Z",
560
- "data": { ... }
778
+ "data": {}
561
779
  }
562
780
  ```
563
781
 
564
- #### `BlankReturnMessageDto`
782
+ #### `BlankReturnMessageDto`
783
+
565
784
  无数据返回结构的类型(用于 DELETE、UPDATE 等空响应)。
566
785
 
786
+ ```json
787
+ {
788
+ "statusCode": 200,
789
+ "success": true,
790
+ "message": "success"
791
+ }
792
+ ```
793
+
794
+ #### `PaginatedReturnMessageDto(EntityClass)`
795
+
796
+ 带有分页信息的返回结构类型。
797
+
798
+ > EntityClass 会自动变成数组类型。
799
+
800
+ ```json
801
+ {
802
+ "statusCode": 200,
803
+ "success": true,
804
+ "message": "success",
805
+ "timestamp": "2025-04-25T12:00:00.000Z",
806
+ "data": [{}],
807
+ "total": 100,
808
+ "totalPages": 4,
809
+ "pageCount": 1,
810
+ "recordsPerPage": 25
811
+ }
812
+ ```
813
+
567
814
  ---
568
815
 
569
816
  ### 📊 实际返回结构
@@ -815,3 +1062,7 @@ NICOT 作为一个 “Entity 驱动” 的框架,在开发体验、安全性
815
1062
  - 内建返回结构、Swagger 注解、守卫装饰器等功能
816
1063
 
817
1064
  是构建 NestJS 标准化、低重复、文档完善的后端服务的理想选择。
1065
+
1066
+ ## LICENSE
1067
+
1068
+ MIT
@@ -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<{