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.
- package/README.md +144 -9
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/bases/base-restful-controller.d.ts +32 -0
- package/dist/src/bases/base-restful-controller.js +53 -0
- package/dist/src/bases/base-restful-controller.js.map +1 -0
- 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/index.d.ts +0 -1
- package/dist/src/decorators/index.js +0 -1
- package/dist/src/decorators/index.js.map +1 -1
- package/dist/src/decorators/property.d.ts +1 -0
- package/dist/src/decorators/property.js +10 -1
- package/dist/src/decorators/property.js.map +1 -1
- package/dist/src/decorators/query.d.ts +13 -6
- package/dist/src/decorators/query.js +18 -1
- package/dist/src/decorators/query.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/{decorators/restful.d.ts → restful.d.ts} +19 -2
- package/dist/src/{decorators/restful.js → restful.js} +116 -6
- package/dist/src/restful.js.map +1 -0
- 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/index.ts +1 -0
- package/package.json +2 -1
- 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()`
|
|
209
|
-
| `@QueryLike()`
|
|
210
|
-
| `@QuerySearch()`
|
|
211
|
-
| `@QueryMatchBoolean()`
|
|
212
|
-
| `@QueryEqualZeroNullable()`
|
|
213
|
-
| `@QueryGreater()`
|
|
214
|
-
| `@
|
|
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
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
|
|
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<{
|