@spinajs/orm-http 2.0.490 → 2.0.494
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 +100 -100
- package/lib/cjs/decorators.d.ts +1 -1
- package/lib/cjs/decorators.d.ts.map +1 -1
- package/lib/cjs/decorators.js +2 -0
- package/lib/cjs/decorators.js.map +1 -1
- package/lib/cjs/dto.d.ts +4 -4
- package/lib/cjs/dto.d.ts.map +1 -1
- package/lib/cjs/dto.js.map +1 -1
- package/lib/cjs/extension.d.ts +5 -2
- package/lib/cjs/extension.d.ts.map +1 -1
- package/lib/cjs/index.d.ts +12 -3
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +36 -6
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +8 -3
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/model.d.ts +2 -2
- package/lib/cjs/model.d.ts.map +1 -1
- package/lib/cjs/model.js +1 -1
- package/lib/cjs/model.js.map +1 -1
- package/lib/mjs/decorators.d.ts +1 -1
- package/lib/mjs/decorators.d.ts.map +1 -1
- package/lib/mjs/decorators.js +2 -0
- package/lib/mjs/decorators.js.map +1 -1
- package/lib/mjs/dto.d.ts +4 -4
- package/lib/mjs/dto.d.ts.map +1 -1
- package/lib/mjs/dto.js.map +1 -1
- package/lib/mjs/extension.d.ts +5 -2
- package/lib/mjs/extension.d.ts.map +1 -1
- package/lib/mjs/index.d.ts +12 -3
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +36 -6
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +8 -3
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/model.d.ts +2 -2
- package/lib/mjs/model.d.ts.map +1 -1
- package/lib/mjs/model.js +1 -1
- package/lib/mjs/model.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +70 -68
package/README.md
CHANGED
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
# `@spinajs/orm-http`
|
|
2
|
-
|
|
3
|
-
Glue between [`@spinajs/orm`](../orm) and `@spinajs/http`: route arguments that load or build
|
|
4
|
-
models straight from a request, a declarative filtering layer, and DTO fields that resolve to
|
|
5
|
-
database entities.
|
|
6
|
-
|
|
7
|
-
It does **not** generate controllers or routes. You write ordinary `@spinajs/http` controllers;
|
|
8
|
-
this package removes the boilerplate inside them.
|
|
9
|
-
|
|
10
|
-
## Install
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
npm install @spinajs/orm-http
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Importing it is enough — its bootstrapper registers itself with DI and runs when the ORM
|
|
17
|
-
resolves.
|
|
18
|
-
|
|
19
|
-
## Usage
|
|
20
|
-
|
|
21
|
-
```ts
|
|
22
|
-
import { BaseController, BasePath, Get, Post, Ok } from '@spinajs/http';
|
|
23
|
-
import { Connection, Model, ModelBase, Primary } from '@spinajs/orm';
|
|
24
|
-
import { FromModel, AsModel, Filter, Filterable, IFilterRequest } from '@spinajs/orm-http';
|
|
25
|
-
|
|
26
|
-
@Connection('default')
|
|
27
|
-
@Model('articles')
|
|
28
|
-
export class Article extends ModelBase<Article> {
|
|
29
|
-
@Primary()
|
|
30
|
-
public Id: number;
|
|
31
|
-
|
|
32
|
-
@Filterable(['eq', 'like'])
|
|
33
|
-
public Title: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
@BasePath('articles')
|
|
37
|
-
export class ArticleController extends BaseController {
|
|
38
|
-
/** GET /articles/:article — loaded by primary key, 404 when missing. */
|
|
39
|
-
@Get(':article')
|
|
40
|
-
public one(@FromModel() article: Article) {
|
|
41
|
-
return new Ok(article.dehydrate());
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** GET /articles?filter={"op":"and","filters":[{"Column":"Title","Operator":"like","Value":"x"}]} */
|
|
45
|
-
@Get()
|
|
46
|
-
public async list(@Filter(Article) filter: IFilterRequest) {
|
|
47
|
-
const rows = await Article.select().filter(filter.filters, filter.op);
|
|
48
|
-
return new Ok(rows.map((r) => r.dehydrate()));
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** POST /articles — hydrated from the body, not fetched or saved. */
|
|
52
|
-
@Post()
|
|
53
|
-
public async create(@AsModel() article: Article) {
|
|
54
|
-
await article.insert();
|
|
55
|
-
return new Ok(article.dehydrate());
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## What it adds
|
|
61
|
-
|
|
62
|
-
| Feature | Entry point |
|
|
63
|
-
| --- | --- |
|
|
64
|
-
| Load a model from a route / query / body / header parameter | `@FromModel()` |
|
|
65
|
-
| Build an unsaved model from the request body | `@AsModel()` |
|
|
66
|
-
| Declarative, schema-validated filtering | `@Filterable()` + `@Filter()` |
|
|
67
|
-
| DTO fields that resolve to entities | `@Relation()` |
|
|
68
|
-
| Pagination and ordering DTOs | `PaginationDTO`, `OrderDTO` |
|
|
69
|
-
| `404` for `OrmNotFoundException` | `OrmNotFound` |
|
|
70
|
-
|
|
71
|
-
It also installs `filter()`, `filterColumns()` and `filterSchema()` onto every model class.
|
|
72
|
-
|
|
73
|
-
## Documentation
|
|
74
|
-
|
|
75
|
-
Full documentation lives in **[docs/](docs/)**.
|
|
76
|
-
|
|
77
|
-
| | Page |
|
|
78
|
-
| --- | --- |
|
|
79
|
-
| 01 | [Overview](docs/01-overview.md) |
|
|
80
|
-
| 02 | [Route arguments](docs/02-route-args.md) |
|
|
81
|
-
| 03 | [Filtering](docs/03-filtering.md) |
|
|
82
|
-
| 04 | [DTO relations](docs/04-dto-relations.md) |
|
|
83
|
-
| 05 | [Pagination and ordering](docs/05-pagination-and-order.md) |
|
|
84
|
-
| 06 | [Repository middleware](docs/06-repository-middleware.md) |
|
|
85
|
-
|
|
86
|
-
## Known issues
|
|
87
|
-
|
|
88
|
-
- `RepositoryMiddleware` is defined in `src/middleware.ts` but re-exported from neither
|
|
89
|
-
`src/index.ts` nor the `exports` map, so it is currently unreachable. Use `QueryMiddleware`
|
|
90
|
-
from the core instead — see [docs/06](docs/06-repository-middleware.md).
|
|
91
|
-
- `npm test` fails during bootstrap with `No __file_provider_instance__ registered`: the test
|
|
92
|
-
harness does not register `@spinajs/fs`. That is a test-configuration gap, not a defect in the
|
|
93
|
-
package.
|
|
94
|
-
|
|
95
|
-
## Development
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
npm run build
|
|
99
|
-
npm run docs:check # from the repo root
|
|
100
|
-
```
|
|
1
|
+
# `@spinajs/orm-http`
|
|
2
|
+
|
|
3
|
+
Glue between [`@spinajs/orm`](../orm) and `@spinajs/http`: route arguments that load or build
|
|
4
|
+
models straight from a request, a declarative filtering layer, and DTO fields that resolve to
|
|
5
|
+
database entities.
|
|
6
|
+
|
|
7
|
+
It does **not** generate controllers or routes. You write ordinary `@spinajs/http` controllers;
|
|
8
|
+
this package removes the boilerplate inside them.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @spinajs/orm-http
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Importing it is enough — its bootstrapper registers itself with DI and runs when the ORM
|
|
17
|
+
resolves.
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { BaseController, BasePath, Get, Post, Ok } from '@spinajs/http';
|
|
23
|
+
import { Connection, Model, ModelBase, Primary } from '@spinajs/orm';
|
|
24
|
+
import { FromModel, AsModel, Filter, Filterable, IFilterRequest } from '@spinajs/orm-http';
|
|
25
|
+
|
|
26
|
+
@Connection('default')
|
|
27
|
+
@Model('articles')
|
|
28
|
+
export class Article extends ModelBase<Article> {
|
|
29
|
+
@Primary()
|
|
30
|
+
public Id: number;
|
|
31
|
+
|
|
32
|
+
@Filterable(['eq', 'like'])
|
|
33
|
+
public Title: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@BasePath('articles')
|
|
37
|
+
export class ArticleController extends BaseController {
|
|
38
|
+
/** GET /articles/:article — loaded by primary key, 404 when missing. */
|
|
39
|
+
@Get(':article')
|
|
40
|
+
public one(@FromModel() article: Article) {
|
|
41
|
+
return new Ok(article.dehydrate());
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** GET /articles?filter={"op":"and","filters":[{"Column":"Title","Operator":"like","Value":"x"}]} */
|
|
45
|
+
@Get()
|
|
46
|
+
public async list(@Filter(Article) filter: IFilterRequest) {
|
|
47
|
+
const rows = await Article.select().filter(filter.filters, filter.op);
|
|
48
|
+
return new Ok(rows.map((r) => r.dehydrate()));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** POST /articles — hydrated from the body, not fetched or saved. */
|
|
52
|
+
@Post()
|
|
53
|
+
public async create(@AsModel() article: Article) {
|
|
54
|
+
await article.insert();
|
|
55
|
+
return new Ok(article.dehydrate());
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## What it adds
|
|
61
|
+
|
|
62
|
+
| Feature | Entry point |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| Load a model from a route / query / body / header parameter | `@FromModel()` |
|
|
65
|
+
| Build an unsaved model from the request body | `@AsModel()` |
|
|
66
|
+
| Declarative, schema-validated filtering | `@Filterable()` + `@Filter()` |
|
|
67
|
+
| DTO fields that resolve to entities | `@Relation()` |
|
|
68
|
+
| Pagination and ordering DTOs | `PaginationDTO`, `OrderDTO` |
|
|
69
|
+
| `404` for `OrmNotFoundException` | `OrmNotFound` |
|
|
70
|
+
|
|
71
|
+
It also installs `filter()`, `filterColumns()` and `filterSchema()` onto every model class.
|
|
72
|
+
|
|
73
|
+
## Documentation
|
|
74
|
+
|
|
75
|
+
Full documentation lives in **[docs/](docs/)**.
|
|
76
|
+
|
|
77
|
+
| | Page |
|
|
78
|
+
| --- | --- |
|
|
79
|
+
| 01 | [Overview](docs/01-overview.md) |
|
|
80
|
+
| 02 | [Route arguments](docs/02-route-args.md) |
|
|
81
|
+
| 03 | [Filtering](docs/03-filtering.md) |
|
|
82
|
+
| 04 | [DTO relations](docs/04-dto-relations.md) |
|
|
83
|
+
| 05 | [Pagination and ordering](docs/05-pagination-and-order.md) |
|
|
84
|
+
| 06 | [Repository middleware](docs/06-repository-middleware.md) |
|
|
85
|
+
|
|
86
|
+
## Known issues
|
|
87
|
+
|
|
88
|
+
- `RepositoryMiddleware` is defined in `src/middleware.ts` but re-exported from neither
|
|
89
|
+
`src/index.ts` nor the `exports` map, so it is currently unreachable. Use `QueryMiddleware`
|
|
90
|
+
from the core instead — see [docs/06](docs/06-repository-middleware.md).
|
|
91
|
+
- `npm test` fails during bootstrap with `No __file_provider_instance__ registered`: the test
|
|
92
|
+
harness does not register `@spinajs/fs`. That is a test-configuration gap, not a defect in the
|
|
93
|
+
package.
|
|
94
|
+
|
|
95
|
+
## Development
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm run build
|
|
99
|
+
npm run docs:check # from the repo root
|
|
100
|
+
```
|
package/lib/cjs/decorators.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ModelBase, WhereFunction } from '@spinajs/orm';
|
|
2
2
|
import { FilterableOperators, IColumnFilter } from './interfaces.js';
|
|
3
3
|
import { Constructor } from '@spinajs/di';
|
|
4
|
-
export declare function Filterable(operatorsOrClass: FilterableOperators[] | Constructor<ModelBase>, queryFunc?: (operator: FilterableOperators, value: any) => WhereFunction<unknown
|
|
4
|
+
export declare function Filterable(operatorsOrClass: FilterableOperators[] | Constructor<ModelBase>, queryFunc?: ((operator: FilterableOperators, value: any) => WhereFunction<unknown>) | null, isAggregate?: boolean): any;
|
|
5
5
|
export declare function Filter(model: Constructor<ModelBase> | IColumnFilter<unknown>[]): (target: any, propertyKey?: string | symbol, indexOrDescriptor?: number | PropertyDescriptor) => void;
|
|
6
6
|
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,aAAa,EAAkF,MAAM,cAAc,CAAC;AAC1J,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,aAAa,EAAkF,MAAM,cAAc,CAAC;AAC1J,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAKzD,wBAAgB,UAAU,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,OAoC7M;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,yGAE9E"}
|
package/lib/cjs/decorators.js
CHANGED
|
@@ -5,6 +5,8 @@ exports.Filter = Filter;
|
|
|
5
5
|
const orm_1 = require("@spinajs/orm");
|
|
6
6
|
const di_1 = require("@spinajs/di");
|
|
7
7
|
const http_1 = require("@spinajs/http");
|
|
8
|
+
// `queryFunc` accepts null so that a column can opt out of a custom query while still
|
|
9
|
+
// setting the trailing `isAggregate` flag.
|
|
8
10
|
function Filterable(operatorsOrClass, queryFunc, isAggregate) {
|
|
9
11
|
return (0, orm_1.extractDecoratorPropertyDescriptor)((model, _target, propertyKey) => {
|
|
10
12
|
if (model.FilterableColumns === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":";;AAOA,gCAoCC;AAED,wBAEC;AA/CD,sCAA0J;AAE1J,oCAAyD;AACzD,wCAAiD;AAEjD,sFAAsF;AACtF,2CAA2C;AAC3C,SAAgB,UAAU,CAAC,gBAAgE,EAAE,SAA0F,EAAE,WAAqB;IAC5M,OAAO,IAAA,wCAAkC,EAAC,CAAC,KAAuB,EAAE,OAAY,EAAE,WAAmB,EAAE,EAAE;QACvG,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC1C,KAAK,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAkC,CAAC;QACtE,CAAC;QAED,IAAI,IAAA,kBAAa,EAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,kFAAkF;YAClF,yBAAyB;YACzB,MAAM,UAAU,GAAG,IAAA,4BAAsB,EAAC,gBAAgB,CAAC,CAAC;YAC5D,IAAI,UAAW,CAAC,iBAAiB,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,CAAC,GAAG,UAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACzB,OAAO,CAAC,GAAG,WAAW,IAAI,CAAC,EAAE,EAAE,UAAW,CAAC,iBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAiC,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,GAAI,GAAW,CAAC,CAAC,CAAC;YAC7H,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,IAAI,oBAAoB,WAAW,8BAA8B,CAAC,CAAC;YACtH,CAAC;YACD,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE;gBACvC,SAAS,EAAE,gBAAgB;gBAC3B,KAAK,EAAE,SAAS;aACS,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,mFAAmF;YACnF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,wBAAkB,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,SAAS,GAAG,WAAW,IAAI,KAAK,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,MAAM,CAAC,KAAwD;IAC7E,OAAO,IAAA,YAAK,EAAC,IAAA,gBAAS,EAAC,qBAAqB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
package/lib/cjs/dto.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { SortOrder } from '@spinajs/orm';
|
|
2
2
|
export declare class PaginationDTO {
|
|
3
|
-
limit
|
|
4
|
-
page
|
|
3
|
+
limit?: number;
|
|
4
|
+
page?: number;
|
|
5
5
|
constructor(data: Partial<PaginationDTO>);
|
|
6
6
|
}
|
|
7
7
|
export declare class OrderDTO {
|
|
8
|
-
order
|
|
9
|
-
column
|
|
8
|
+
order?: SortOrder;
|
|
9
|
+
column?: string;
|
|
10
10
|
constructor(data: Partial<OrderDTO>);
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=dto.d.ts.map
|
package/lib/cjs/dto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dto.d.ts","sourceRoot":"","sources":["../../src/dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,qBAUa,aAAa;
|
|
1
|
+
{"version":3,"file":"dto.d.ts","sourceRoot":"","sources":["../../src/dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,qBAUa,aAAa;IAGjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;gBAET,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC;CAGzC;AAED,qBAQa,QAAQ;IAEZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEX,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;CAGpC"}
|
package/lib/cjs/dto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dto.js","sourceRoot":"","sources":["../../src/dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,oDAA6C;AAYtC,IAAM,aAAa,GAAnB,MAAM,aAAa;
|
|
1
|
+
{"version":3,"file":"dto.js","sourceRoot":"","sources":["../../src/dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,oDAA6C;AAYtC,IAAM,aAAa,GAAnB,MAAM,aAAa;IAMxB,YAAY,IAA4B;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AATY,sCAAa;wBAAb,aAAa;IAVzB,IAAA,mBAAM,EAAC;QACN,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,4BAA4B;QACjC,0EAA0E;QAC1E,6EAA6E;QAC7E,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;YACrC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;SACrC;KACF,CAAC;;GACW,aAAa,CASzB;AAUM,IAAM,QAAQ,GAAd,MAAM,QAAQ;IAKnB,YAAY,IAAuB;QACjC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AARY,4BAAQ;mBAAR,QAAQ;IARpB,IAAA,mBAAM,EAAC;QACN,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,uBAAuB;QAC5B,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE;YAC/D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;KACF,CAAC;;GACW,QAAQ,CAQpB"}
|
package/lib/cjs/extension.d.ts
CHANGED
|
@@ -11,10 +11,13 @@ declare module '@spinajs/orm' {
|
|
|
11
11
|
*
|
|
12
12
|
* Add filter to query
|
|
13
13
|
*
|
|
14
|
+
* Passing no filters (undefined / null / empty array) is a no-op, so routes
|
|
15
|
+
* with an optional filter param can call this unconditionally.
|
|
16
|
+
*
|
|
14
17
|
* @param filter
|
|
15
18
|
* @param logicalOperator
|
|
16
19
|
*/
|
|
17
|
-
filter(filter
|
|
20
|
+
filter(filter?: IFilter[] | null, logicalOperator?: FilterableLogicalOperators, filters?: IColumnFilter<unknown>[]): this;
|
|
18
21
|
}
|
|
19
22
|
namespace ModelBase {
|
|
20
23
|
/**
|
|
@@ -30,7 +33,7 @@ declare module '@spinajs/orm' {
|
|
|
30
33
|
*
|
|
31
34
|
* @param filterRequest
|
|
32
35
|
*/
|
|
33
|
-
function filter<T extends ModelBase<unknown>>(filterRequest
|
|
36
|
+
function filter<T extends ModelBase<unknown>>(filterRequest?: IFilterRequest): Promise<Array<T>>;
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
//# sourceMappingURL=extension.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../src/extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAErG,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAiB,gBAAgB;QAC/B;;WAEG;QACH,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;KACzD;IAED,UAAiB,mBAAmB;QAClC
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../src/extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAErG,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAiB,gBAAgB;QAC/B;;WAEG;QACH,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;KACzD;IAED,UAAiB,mBAAmB;QAClC;;;;;;;;;WASG;QACH,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,eAAe,CAAC,EAAE,0BAA0B,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;KAC3H;IAED,UAAU,SAAS,CAAC;QAElB;;WAEG;QACH,SAAgB,YAAY,IAAI,GAAG,CAAC;QAEpC,SAAgB,aAAa,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAE1D;;;;;;;WAOG;QACH,SAAgB,MAAM,CAAC,CAAC,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KACzG;CACF"}
|
package/lib/cjs/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Orm, ModelBase } from '@spinajs/orm';
|
|
2
2
|
import { IRouteParameter, IRouteCall, ParameterType, ArgHydrator, Request as sRequest, RouteArgs, IRoute } from '@spinajs/http';
|
|
3
3
|
import { IContainer, Bootstrapper } from '@spinajs/di';
|
|
4
|
+
import { Log } from '@spinajs/log';
|
|
4
5
|
import { FromModelOptions } from './interfaces.js';
|
|
5
6
|
export * from './interfaces.js';
|
|
6
7
|
export * from './model.js';
|
|
@@ -27,14 +28,22 @@ export declare class AsDbModel extends RouteArgs {
|
|
|
27
28
|
export declare class FromDbModel extends RouteArgs {
|
|
28
29
|
protected Container: IContainer;
|
|
29
30
|
protected Orm: Orm;
|
|
31
|
+
protected Log: Log;
|
|
30
32
|
resolve(): Promise<void>;
|
|
31
33
|
get SupportedType(): string;
|
|
32
|
-
extract(callData: IRouteCall, args: unknown[], param: IRouteParameter, req: sRequest): Promise<{
|
|
34
|
+
extract(callData: IRouteCall, args: unknown[], param: IRouteParameter, req: sRequest, _res?: express.Response, route?: IRoute): Promise<{
|
|
33
35
|
CallData: IRouteCall;
|
|
34
36
|
Args: any;
|
|
35
37
|
}>;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
/**
|
|
39
|
+
* @param param - the @FromModel route parameter the key is being resolved for
|
|
40
|
+
* @param req - incoming request
|
|
41
|
+
* @param route - the route this parameter belongs to. Optional so that callers written
|
|
42
|
+
* against the two-argument signature keep working; without it the resolver
|
|
43
|
+
* falls back to the single-placeholder heuristic below.
|
|
44
|
+
*/
|
|
45
|
+
protected _extractValue(param: IRouteParameter<FromModelOptions<typeof ModelBase>>, req: sRequest, route?: IRoute): any;
|
|
46
|
+
protected fromDbModelDefaultQueryFunction(callData: IRouteCall, _args: unknown[], param: IRouteParameter<FromModelOptions<typeof ModelBase>>, req: sRequest, route?: IRoute): Promise<any>;
|
|
38
47
|
}
|
|
39
48
|
export declare class DbModelHydrator extends ArgHydrator {
|
|
40
49
|
hydrate(input: any, parameter: IRouteParameter): Promise<any>;
|
package/lib/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAgG,MAAM,cAAc,CAAC;AAC5I,OAAO,EAAE,eAAe,EAAE,UAAU,EAAoB,aAAa,EAAE,WAAW,EAAE,OAAO,IAAI,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAClJ,OAAO,EAAE,UAAU,EAAqC,YAAY,EAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAgG,MAAM,cAAc,CAAC;AAC5I,OAAO,EAAE,eAAe,EAAE,UAAU,EAAoB,aAAa,EAAE,WAAW,EAAE,OAAO,IAAI,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAClJ,OAAO,EAAE,UAAU,EAAqC,YAAY,EAAM,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mCAAmC,CAAC;AAClD,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC;;;;GAIG;AACH,qBACa,SAAU,SAAQ,SAAS;IACtC,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEY,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM;;;;CAU1I;AAED,qBACa,WAAY,SAAQ,SAAS;IAExC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC;IAGhC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEY,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM;;;;IAW1I;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,eAAe,CAAC,gBAAgB,CAAC,OAAO,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM;IA8CjH,SAAS,CAAC,+BAA+B,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,CAAC,gBAAgB,CAAC,OAAO,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM;CAqE5K;AAED,qBAAa,eAAgB,SAAQ,WAAW;IACjC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;CAS3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,yGAE3D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,OAAO,SAAS,EAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,yGAElF;AAED,qBACa,mBAAoB,SAAQ,YAAY;IACtC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAgBxC"}
|
package/lib/cjs/index.js
CHANGED
|
@@ -29,6 +29,7 @@ exports.FromModel = FromModel;
|
|
|
29
29
|
const orm_1 = require("@spinajs/orm");
|
|
30
30
|
const http_1 = require("@spinajs/http");
|
|
31
31
|
const di_1 = require("@spinajs/di");
|
|
32
|
+
const log_1 = require("@spinajs/log");
|
|
32
33
|
const model_js_1 = require("./model.js");
|
|
33
34
|
const exceptions_1 = require("@spinajs/exceptions");
|
|
34
35
|
__exportStar(require("./interfaces.js"), exports);
|
|
@@ -67,17 +68,24 @@ let FromDbModel = class FromDbModel extends http_1.RouteArgs {
|
|
|
67
68
|
get SupportedType() {
|
|
68
69
|
return 'FromDB';
|
|
69
70
|
}
|
|
70
|
-
async extract(callData, args, param, req) {
|
|
71
|
+
async extract(callData, args, param, req, _res, route) {
|
|
71
72
|
let result = null;
|
|
72
73
|
if (param?.Options?.query) {
|
|
73
|
-
result = await param.Options.query.call(param.RuntimeType.query(), args, this._extractValue(param, req)).firstOrThrow(new orm_1.OrmNotFoundException('Resource not found'));
|
|
74
|
+
result = await param.Options.query.call(param.RuntimeType.query(), args, this._extractValue(param, req, route)).firstOrThrow(new orm_1.OrmNotFoundException('Resource not found'));
|
|
74
75
|
}
|
|
75
76
|
else {
|
|
76
|
-
result = await this.fromDbModelDefaultQueryFunction(callData, args, param, req);
|
|
77
|
+
result = await this.fromDbModelDefaultQueryFunction(callData, args, param, req, route);
|
|
77
78
|
}
|
|
78
79
|
return { CallData: callData, Args: result };
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
+
/**
|
|
82
|
+
* @param param - the @FromModel route parameter the key is being resolved for
|
|
83
|
+
* @param req - incoming request
|
|
84
|
+
* @param route - the route this parameter belongs to. Optional so that callers written
|
|
85
|
+
* against the two-argument signature keep working; without it the resolver
|
|
86
|
+
* falls back to the single-placeholder heuristic below.
|
|
87
|
+
*/
|
|
88
|
+
_extractValue(param, req, route) {
|
|
81
89
|
let pkValue = null;
|
|
82
90
|
const field = param?.Options?.paramField ?? param.Name;
|
|
83
91
|
switch (param?.Options?.paramType) {
|
|
@@ -92,13 +100,31 @@ let FromDbModel = class FromDbModel extends http_1.RouteArgs {
|
|
|
92
100
|
break;
|
|
93
101
|
case http_1.ParameterType.FromParams:
|
|
94
102
|
default:
|
|
103
|
+
/**
|
|
104
|
+
* The url parameter a @FromModel reads is stated, never guessed: `paramField`
|
|
105
|
+
* names it, or the argument is called after it. If neither is present in the
|
|
106
|
+
* request the route is wrong and it says so, rather than querying with an
|
|
107
|
+
* empty key and returning a 404 that looks like missing data.
|
|
108
|
+
*
|
|
109
|
+
* This is the same rule the OpenAPI document applies while it is built
|
|
110
|
+
* ( http-swagger, OpenApiBuilder ), so a route that serves traffic and a route
|
|
111
|
+
* that can be documented are the same set. The check is against `req.params`
|
|
112
|
+
* rather than the route template on purpose: a placeholder declared in
|
|
113
|
+
* @BasePath never appears in `route.Path`, but it does arrive here.
|
|
114
|
+
*/
|
|
115
|
+
if (!Object.prototype.hasOwnProperty.call(req.params ?? {}, field)) {
|
|
116
|
+
const available = Object.keys(req.params ?? {});
|
|
117
|
+
throw new exceptions_1.InvalidArgument(`@FromModel argument '${param.Name}'${route?.Path ? ` on route '${route.Path}'` : ''} reads url parameter '${field}', which this request does not have. ` +
|
|
118
|
+
`Available url parameters: ${available.length > 0 ? available.join(', ') : '(none)'}. ` +
|
|
119
|
+
`Either name the argument after the placeholder, or state it explicitly with @FromModel({ paramField: '<placeholder>' }).`);
|
|
120
|
+
}
|
|
95
121
|
pkValue = req.params[field];
|
|
96
122
|
break;
|
|
97
123
|
}
|
|
98
124
|
return pkValue;
|
|
99
125
|
}
|
|
100
|
-
fromDbModelDefaultQueryFunction(callData, _args, param, req) {
|
|
101
|
-
const pkValue = this._extractValue(param, req);
|
|
126
|
+
fromDbModelDefaultQueryFunction(callData, _args, param, req, route) {
|
|
127
|
+
const pkValue = this._extractValue(param, req, route);
|
|
102
128
|
const query = param.RuntimeType['query']();
|
|
103
129
|
const descriptor = (0, orm_1.extractModelDescriptor)(param.RuntimeType);
|
|
104
130
|
// A route parameter carries ONE value, so it cannot address a composite key. Fail with a
|
|
@@ -166,6 +192,10 @@ __decorate([
|
|
|
166
192
|
(0, di_1.Autoinject)(orm_1.Orm),
|
|
167
193
|
__metadata("design:type", orm_1.Orm)
|
|
168
194
|
], FromDbModel.prototype, "Orm", void 0);
|
|
195
|
+
__decorate([
|
|
196
|
+
(0, log_1.Logger)('orm-http'),
|
|
197
|
+
__metadata("design:type", log_1.Log)
|
|
198
|
+
], FromDbModel.prototype, "Log", void 0);
|
|
169
199
|
exports.FromDbModel = FromDbModel = __decorate([
|
|
170
200
|
(0, di_1.Injectable)()
|
|
171
201
|
], FromDbModel);
|
package/lib/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwNA,0BAEC;AAQD,8BAEC;AApOD,sCAA4I;AAC5I,wCAAkJ;AAClJ,oCAA8F;AAC9F,sCAA2C;AAC3C,yCAAiD;AAEjD,oDAAkE;AAElE,kDAAgC;AAChC,6CAA2B;AAC3B,kDAAgC;AAChC,iDAA+B;AAC/B,iDAA+B;AAC/B,gDAA8B;AAC9B,2CAAyB;AACzB,oDAAkC;AAClC,oEAAkD;AAGlD;;;;GAIG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,gBAAS;IACtC,IAAW,aAAa;QACtB,OAAO,WAAW,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,QAAoB,EAAE,KAAgB,EAAE,KAAsB,EAAE,GAAa,EAAE,IAAsB,EAAE,KAAa;QAEvI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,uBAAU,CAAC,yDAAyD,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzH,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9J,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;CACF,CAAA;AAfY,8BAAS;oBAAT,SAAS;IADrB,IAAA,eAAU,GAAE;GACA,SAAS,CAerB;AAGM,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,gBAAS;IAUxC,KAAK,CAAC,OAAO,KAAoB,CAAC;IAElC,IAAW,aAAa;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,QAAoB,EAAE,IAAe,EAAE,KAAsB,EAAE,GAAa,EAAE,IAAuB,EAAE,KAAc;QACxI,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC1B,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,0BAAoB,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC/K,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED;;;;;;OAMG;IACO,aAAa,CAAC,KAA0D,EAAE,GAAa,EAAE,KAAc;QAC/G,IAAI,OAAO,GAAQ,IAAI,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC;QAEvD,QAAQ,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAClC,KAAK,oBAAa,CAAC,SAAS;gBAC1B,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,oBAAa,CAAC,QAAQ;gBACzB,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5C,MAAM;YACR,KAAK,oBAAa,CAAC,UAAU;gBAC3B,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,oBAAa,CAAC,UAAU,CAAC;YAC9B;gBACE;;;;;;;;;;;mBAWG;gBACH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;oBACnE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;oBAChD,MAAM,IAAI,4BAAe,CACvB,wBAAwB,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,yBAAyB,KAAK,uCAAuC;wBACvJ,6BAA6B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI;wBACvF,0HAA0H,CAC7H,CAAC;gBACJ,CAAC;gBAED,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,MAAM;QACV,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAIS,+BAA+B,CAAC,QAAoB,EAAE,KAAgB,EAAE,KAA0D,EAAE,GAAa,EAAE,KAAc;QACzK,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAwB,CAAC;QACjE,MAAM,UAAU,GAAG,IAAA,4BAAsB,EAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE7D,yFAAyF;QACzF,0FAA0F;QAC1F,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC,UAAW,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,uBAAU,CAAC,SAAS,UAAW,CAAC,IAAI,iCAAiC,CAAC,UAAW,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACjL,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,EAAE,OAAO,EAAE,UAAU,IAAI,UAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE3E,KAAK,CAAC,QAAQ,CAAC,UAAW,CAAC,SAAS,EAAE,IAAI,UAAW,CAAC,SAAS,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEjC;;WAEG;QACH,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,UAAW,CAAC,SAAS,EAAE,CAAC;YAC1C,2CAA2C;YAC3C,kDAAkD;YAClD,mEAAmE;YACnE,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAY,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;gBAE3C,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC1B,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACpG,CAAC,CAAC,CAAC;oBAEH,IAAI,GAAG,EAAE,CAAC;wBACR,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;4BACrC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC9D,CAAC;6BAAM,CAAC;4BACN,MAAM,IAAI,4BAAe,CAAC,uBAAuB,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC;wBAC1E,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED;;;WAGG;QACH,IAAG,KAAK,CAAC,OAAO,EAAE,OAAO,EAAC,CAAC;YACzB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAGD;;WAEG;QACH,IAAI,KAAK,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,0BAAoB,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED;;WAEG;QACH,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACtF,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9F,CAAC;QAED,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,0BAAoB,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF,CAAA;AArJY,kCAAW;AAEZ;IADT,IAAA,eAAU,EAAC,cAAS,CAAC;;8CACU;AAGtB;IADT,IAAA,eAAU,EAAC,SAAG,CAAC;8BACD,SAAG;wCAAC;AAGT;IADT,IAAA,YAAM,EAAC,UAAU,CAAC;8BACJ,SAAG;wCAAC;sBARR,WAAW;IADvB,IAAA,eAAU,GAAE;GACA,WAAW,CAqJvB;AAED,MAAa,eAAgB,SAAQ,kBAAW;IACvC,KAAK,CAAC,OAAO,CAAC,KAAU,EAAE,SAA0B;QACzD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,kBAAY,CAAC,4BAA4B,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,KAAK,GAAc,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QACrD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAVD,0CAUC;AAED;;;;;;;;;GASG;AACH,SAAgB,OAAO,CAAC,KAAc,EAAE,IAAoB;IAC1D,OAAO,IAAA,YAAK,EAAC,IAAA,gBAAS,EAAC,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAA6B,OAA6B;IACjF,OAAO,IAAA,YAAK,EAAC,IAAA,gBAAS,EAAC,aAAa,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC;AAGM,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,iBAAY;IAC5C,KAAK,CAAC,SAAS;QACpB,OAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,GAAQ,EAAE,EAAE;YACzC,6DAA6D;YAC7D,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvB,OAAO,CAAC,cAAc,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACvF,CAAC,CAAC,CAAC;YAEH,oBAAoB;YACpB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACvB,kCAAkC;gBAClC,KAAK,MAAM,KAAK,IAAI,8BAAmB,EAAE,CAAC;oBACxC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAI,8BAA2B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAjBY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,eAAU,EAAC,iBAAY,CAAC;GACZ,mBAAmB,CAiB/B"}
|
package/lib/cjs/interfaces.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface ITransformOptions {
|
|
|
20
20
|
export interface IColumnFilter<T> {
|
|
21
21
|
column?: string;
|
|
22
22
|
operators: FilterableOperators[];
|
|
23
|
-
query?: (operator: FilterableOperators, value: any) => WhereFunction<T
|
|
23
|
+
query?: ((operator: FilterableOperators, value: any) => WhereFunction<T>) | null;
|
|
24
24
|
}
|
|
25
25
|
export interface IFilter {
|
|
26
26
|
Column: string;
|
|
@@ -28,8 +28,13 @@ export interface IFilter {
|
|
|
28
28
|
Value: any;
|
|
29
29
|
}
|
|
30
30
|
export interface IFilterRequest {
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Both fields are optional: the filter param itself is optional in a route
|
|
33
|
+
* (FilterModelRouteArg reads it from query/body and yields undefined when absent)
|
|
34
|
+
* and the generated JSON schema marks neither `op` nor `filters` as required.
|
|
35
|
+
*/
|
|
36
|
+
op?: FilterableLogicalOperators;
|
|
37
|
+
filters?: IFilter[];
|
|
33
38
|
}
|
|
34
39
|
export declare enum FilterableLogicalOperators {
|
|
35
40
|
And = "and",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGvF,qBACa,qBAAqB;IACzB,IAAI,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,GAAG,CAAC;QAChB,aAAa,EAAE,GAAG,CAAC;KACpB,CAAe;gBAEJ,IAAI,EAAE,GAAG;CAGtB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGvF,qBACa,qBAAqB;IACzB,IAAI,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,GAAG,CAAC;QAChB,aAAa,EAAE,GAAG,CAAC;KACpB,CAAe;gBAEJ,IAAI,EAAE,GAAG;CAGtB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAClF;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,EAAE,GAAG,CAAC;CACZ;AAGD,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,EAAE,CAAC,EAAE,0BAA0B,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,oBAAY,0BAA0B;IACpC,GAAG,QAAQ;IACX,EAAE,OAAO;CACV;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,OAAO,SAAS;IAC1D;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAG,MAAM,EAAE,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,kBAAkB,CAAC;CAC/G;AAED,MAAM,MAAM,mBAAmB,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,oDAA6C;AAGtC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAQhC,YAAY,IAAS;QAPd,SAAI,GAKP,IAAW,CAAC;QAGd,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AAXY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAM,EAAC,yCAAyC,CAAC;;GACrC,qBAAqB,CAWjC;
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,oDAA6C;AAGtC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAQhC,YAAY,IAAS;QAPd,SAAI,GAKP,IAAW,CAAC;QAGd,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;AAXY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAM,EAAC,yCAAyC,CAAC;;GACrC,qBAAqB,CAWjC;AAkCD,IAAY,0BAGX;AAHD,WAAY,0BAA0B;IACpC,yCAAW,CAAA;IACX,uCAAS,CAAA;AACX,CAAC,EAHW,0BAA0B,0CAA1B,0BAA0B,QAGrC"}
|
package/lib/cjs/model.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import './builders.js';
|
|
2
2
|
import { IFilterRequest, FilterableLogicalOperators } from './interfaces.js';
|
|
3
3
|
export declare const MODEL_STATIC_MIXINS: {
|
|
4
|
-
filter(filterRequest
|
|
4
|
+
filter(filterRequest?: IFilterRequest): Promise<any>;
|
|
5
5
|
filterColumns(): {
|
|
6
6
|
column: string;
|
|
7
7
|
operators: import("./interfaces.js").FilterableOperators[];
|
|
8
|
-
query: ((operator: import("./interfaces.js").FilterableOperators, value: any) => import("@spinajs/orm").WhereFunction<unknown>) | undefined;
|
|
8
|
+
query: ((operator: import("./interfaces.js").FilterableOperators, value: any) => import("@spinajs/orm").WhereFunction<unknown>) | null | undefined;
|
|
9
9
|
}[];
|
|
10
10
|
filterSchema(): {
|
|
11
11
|
type?: undefined;
|
package/lib/cjs/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAiB,cAAc,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE5F,eAAO,MAAM,mBAAmB;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAiB,cAAc,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE5F,eAAO,MAAM,mBAAmB;2BACD,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D5C,CAAC"}
|
package/lib/cjs/model.js
CHANGED
|
@@ -7,7 +7,7 @@ const interfaces_js_1 = require("./interfaces.js");
|
|
|
7
7
|
exports.MODEL_STATIC_MIXINS = {
|
|
8
8
|
async filter(filterRequest) {
|
|
9
9
|
const { query } = (0, orm_1.createQuery)(this, orm_1.SelectQueryBuilder);
|
|
10
|
-
return query.filter(filterRequest
|
|
10
|
+
return query.filter(filterRequest?.filters, filterRequest?.op);
|
|
11
11
|
},
|
|
12
12
|
filterColumns() {
|
|
13
13
|
const modelDescriptor = this.getModelDescriptor();
|
package/lib/cjs/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":";;;AAAA,sCAA+F;AAC/F,yBAAuB;AACvB,mDAA4F;AAE/E,QAAA,mBAAmB,GAAG;IACjC,KAAK,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":";;;AAAA,sCAA+F;AAC/F,yBAAuB;AACvB,mDAA4F;AAE/E,QAAA,mBAAmB,GAAG;IACjC,KAAK,CAAC,MAAM,CAAC,aAA8B;QACzC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,iBAAW,EAAC,IAAI,EAAE,wBAAkB,CAAC,CAAC;QACxD,OAAQ,KAAa,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,aAAa;QACX,MAAM,eAAe,GAAI,IAAY,CAAC,kBAAkB,EAAsB,CAAC;QAE/E,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,kBAAY,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,oBAAoB,CAAC,CAAC;QAC7E,CAAC;QAED,IAAG,eAAe,CAAC,iBAAiB,KAAK,SAAS,EAAC,CAAC;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,CAAC,GAAG,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAmC,EAAE,EAAE;YAC3G,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,KAAK,EAAE,GAAG,CAAC,KAAK;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,MAAM,eAAe,GAAI,IAAY,CAAC,kBAAkB,EAAsB,CAAC;QAE/E,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,kBAAY,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,oBAAoB,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,eAAe,CAAC,iBAAiB,KAAK,SAAS,EAAC,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE;oBACF,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,0CAA0B,CAAC,GAAG,EAAE,0CAA0B,CAAC,EAAE,CAAC;iBACtE;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,CAAC,GAAG,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAmC,EAAE,EAAE;4BAC3G,OAAO;gCACL,IAAI,EAAE,QAAQ;gCACd,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;gCAChC,UAAU,EAAE;oCACV,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;oCACtB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE;oCAC1D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE;iCAClD;6BACF,CAAC;wBACJ,CAAC,CAAC;qBACH;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/lib/mjs/decorators.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ModelBase, WhereFunction } from '@spinajs/orm';
|
|
2
2
|
import { FilterableOperators, IColumnFilter } from './interfaces.js';
|
|
3
3
|
import { Constructor } from '@spinajs/di';
|
|
4
|
-
export declare function Filterable(operatorsOrClass: FilterableOperators[] | Constructor<ModelBase>, queryFunc?: (operator: FilterableOperators, value: any) => WhereFunction<unknown
|
|
4
|
+
export declare function Filterable(operatorsOrClass: FilterableOperators[] | Constructor<ModelBase>, queryFunc?: ((operator: FilterableOperators, value: any) => WhereFunction<unknown>) | null, isAggregate?: boolean): any;
|
|
5
5
|
export declare function Filter(model: Constructor<ModelBase> | IColumnFilter<unknown>[]): (target: any, propertyKey?: string | symbol, indexOrDescriptor?: number | PropertyDescriptor) => void;
|
|
6
6
|
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,aAAa,EAAkF,MAAM,cAAc,CAAC;AAC1J,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,aAAa,EAAkF,MAAM,cAAc,CAAC;AAC1J,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAKzD,wBAAgB,UAAU,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,OAoC7M;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,yGAE9E"}
|
package/lib/mjs/decorators.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { _prepareColumnDesc, extractDecoratorPropertyDescriptor, extractModelDescriptor } from '@spinajs/orm';
|
|
2
2
|
import { isConstructor } from '@spinajs/di';
|
|
3
3
|
import { Parameter, Route } from '@spinajs/http';
|
|
4
|
+
// `queryFunc` accepts null so that a column can opt out of a custom query while still
|
|
5
|
+
// setting the trailing `isAggregate` flag.
|
|
4
6
|
export function Filterable(operatorsOrClass, queryFunc, isAggregate) {
|
|
5
7
|
return extractDecoratorPropertyDescriptor((model, _target, propertyKey) => {
|
|
6
8
|
if (model.FilterableColumns === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,kBAAkB,EAAE,kCAAkC,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE1J,OAAO,EAAe,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,UAAU,UAAU,CAAC,gBAAgE,EAAE,
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8C,kBAAkB,EAAE,kCAAkC,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE1J,OAAO,EAAe,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEjD,sFAAsF;AACtF,2CAA2C;AAC3C,MAAM,UAAU,UAAU,CAAC,gBAAgE,EAAE,SAA0F,EAAE,WAAqB;IAC5M,OAAO,kCAAkC,CAAC,CAAC,KAAuB,EAAE,OAAY,EAAE,WAAmB,EAAE,EAAE;QACvG,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC1C,KAAK,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAkC,CAAC;QACtE,CAAC;QAED,IAAI,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,kFAAkF;YAClF,yBAAyB;YACzB,MAAM,UAAU,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAC5D,IAAI,UAAW,CAAC,iBAAiB,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,CAAC,GAAG,UAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACzB,OAAO,CAAC,GAAG,WAAW,IAAI,CAAC,EAAE,EAAE,UAAW,CAAC,iBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAiC,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,GAAI,GAAW,CAAC,CAAC,CAAC;YAC7H,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,IAAI,oBAAoB,WAAW,8BAA8B,CAAC,CAAC;YACtH,CAAC;YACD,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE;gBACvC,SAAS,EAAE,gBAAgB;gBAC3B,KAAK,EAAE,SAAS;aACS,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,mFAAmF;YACnF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAChH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,SAAS,GAAG,WAAW,IAAI,KAAK,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAwD;IAC7E,OAAO,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
package/lib/mjs/dto.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { SortOrder } from '@spinajs/orm';
|
|
2
2
|
export declare class PaginationDTO {
|
|
3
|
-
limit
|
|
4
|
-
page
|
|
3
|
+
limit?: number;
|
|
4
|
+
page?: number;
|
|
5
5
|
constructor(data: Partial<PaginationDTO>);
|
|
6
6
|
}
|
|
7
7
|
export declare class OrderDTO {
|
|
8
|
-
order
|
|
9
|
-
column
|
|
8
|
+
order?: SortOrder;
|
|
9
|
+
column?: string;
|
|
10
10
|
constructor(data: Partial<OrderDTO>);
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=dto.d.ts.map
|
package/lib/mjs/dto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dto.d.ts","sourceRoot":"","sources":["../../src/dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,qBAUa,aAAa;
|
|
1
|
+
{"version":3,"file":"dto.d.ts","sourceRoot":"","sources":["../../src/dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,qBAUa,aAAa;IAGjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;gBAET,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC;CAGzC;AAED,qBAQa,QAAQ;IAEZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEX,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;CAGpC"}
|