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 +259 -8
- package/dist/src/bases/id-base.d.ts +2 -0
- package/dist/src/bases/page-settings.d.ts +3 -2
- package/dist/src/bases/page-settings.js +4 -11
- package/dist/src/bases/page-settings.js.map +1 -1
- package/dist/src/crud-base.d.ts +36 -9
- package/dist/src/crud-base.js +87 -25
- package/dist/src/crud-base.js.map +1 -1
- package/dist/src/decorators/restful.d.ts +3 -0
- package/dist/src/decorators/restful.js +17 -1
- package/dist/src/decorators/restful.js.map +1 -1
- package/dist/src/dto/cursor-pagination.d.ts +19 -0
- package/dist/src/dto/cursor-pagination.js +89 -0
- package/dist/src/dto/cursor-pagination.js.map +1 -0
- package/dist/src/dto/index.d.ts +1 -0
- package/dist/src/dto/index.js +1 -0
- package/dist/src/dto/index.js.map +1 -1
- package/dist/src/utility/cursor-pagination-utils.d.ts +15 -0
- package/dist/src/utility/cursor-pagination-utils.js +158 -0
- package/dist/src/utility/cursor-pagination-utils.js.map +1 -0
- package/package.json +9 -7
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
|
-
|
|
482
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/src/crud-base.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { FindOptionsWhere, Repository, SelectQueryBuilder } from 'typeorm';
|
|
2
|
-
import {
|
|
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> &
|
|
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:
|
|
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
|
-
|
|
61
|
-
|
|
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:
|
|
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
|
-
|
|
107
|
-
|
|
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<{
|