@quatrain/core 0.4.4 → 0.5.2
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 +103 -2
- package/lib/Backend.d.ts +6 -5
- package/lib/Backend.js +17 -5
- package/lib/Core.d.ts +3 -3
- package/lib/backends/AbstractAdapter.d.ts +11 -6
- package/lib/backends/AbstractAdapter.js +13 -3
- package/lib/backends/Filter.d.ts +2 -2
- package/lib/backends/FilterOperators.d.ts +1 -1
- package/lib/backends/FilterOperators.js +1 -1
- package/lib/backends/MockAdapter.js +13 -5
- package/lib/backends/Query.d.ts +9 -3
- package/lib/backends/Query.js +26 -6
- package/lib/backends/middlewares/InjectMetaMiddleware.d.ts +8 -6
- package/lib/backends/middlewares/InjectMetaMiddleware.js +11 -31
- package/lib/backends/middlewares/Middleware.d.ts +5 -0
- package/lib/common/ResourcesErrors.d.ts +13 -0
- package/lib/common/ResourcesErrors.js +25 -0
- package/lib/components/AbstractObject.d.ts +0 -2
- package/lib/components/AbstractObject.js +0 -4
- package/lib/components/BaseObject.d.ts +11 -13
- package/lib/components/BaseObject.js +84 -78
- package/lib/components/BaseObjectCore.d.ts +60 -0
- package/lib/components/BaseObjectCore.js +153 -0
- package/lib/components/BaseRepository.d.ts +24 -0
- package/lib/components/BaseRepository.js +116 -0
- package/lib/components/DataObject.d.ts +19 -4
- package/lib/components/DataObject.js +63 -18
- package/lib/components/Entity.d.ts +22 -3
- package/lib/components/Entity.js +23 -22
- package/lib/components/EntityRepository.d.ts +6 -0
- package/lib/components/EntityRepository.js +14 -0
- package/lib/components/ObjectUri.js +4 -4
- package/lib/components/User.d.ts +14 -3
- package/lib/components/User.js +10 -8
- package/lib/components/UserRepository.d.ts +7 -0
- package/lib/components/UserRepository.js +36 -0
- package/lib/components/index.d.ts +4 -5
- package/lib/components/index.js +6 -9
- package/lib/components/types/AbstractObjectClass.d.ts +1 -1
- package/lib/components/types/BaseObjectClass.d.ts +3 -2
- package/lib/components/types/DataObjectClass.d.ts +3 -0
- package/lib/components/types/Payload.d.ts +10 -0
- package/lib/components/types/Payload.js +2 -0
- package/lib/components/types/Persisted.d.ts +6 -0
- package/lib/components/types/Persisted.js +2 -0
- package/lib/components/types/Properties.d.ts +3 -0
- package/lib/components/types/Properties.js +1 -0
- package/lib/components/types/ProxyConstructor.d.ts +10 -0
- package/lib/components/types/ProxyConstructor.js +4 -0
- package/lib/components/types/RepositoryClass.d.ts +40 -0
- package/lib/components/types/RepositoryClass.js +2 -0
- package/lib/index.d.ts +11 -3
- package/lib/index.js +21 -8
- package/lib/properties/BaseProperty.d.ts +2 -1
- package/lib/properties/BaseProperty.js +5 -1
- package/lib/properties/CollectionProperty.d.ts +4 -3
- package/lib/properties/HashProperty.d.ts +1 -1
- package/lib/properties/NumberProperty.d.ts +2 -2
- package/lib/properties/ObjectProperty.d.ts +5 -3
- package/lib/properties/ObjectProperty.js +5 -2
- package/lib/properties/Property.js +6 -0
- package/lib/properties/index.d.ts +2 -2
- package/lib/properties/types/PropertyClassType.d.ts +2 -1
- package/lib/properties/types/PropertyHTMLType.d.ts +1 -1
- package/lib/properties/types/PropertyTypes.d.ts +2 -2
- package/lib/utils/DataGenerator.d.ts +3 -2
- package/lib/utils/DataGenerator.js +1 -1
- package/package.json +31 -29
- package/lib/components/BaseObjectProperties.d.ts +0 -13
- package/lib/components/BaseObjectProperties.js +0 -87
- package/lib/components/UserProperties.d.ts +0 -1
- package/lib/components/UserProperties.js +0 -103
- package/lib/components/types/UserClass.d.ts +0 -3
- /package/lib/{components/types/UserClass.js → backends/middlewares/Middleware.js} +0 -0
package/README.md
CHANGED
|
@@ -11,13 +11,114 @@ and storage.
|
|
|
11
11
|
|
|
12
12
|
## How to install
|
|
13
13
|
|
|
14
|
-
```
|
|
14
|
+
```bash
|
|
15
15
|
yarn install @quatrain/core
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
Quatrain Core comes with a built-in Mock backend adapter. Other adapters are available in
|
|
19
19
|
different packages. For example, a Google Firestore adapter is available:
|
|
20
20
|
|
|
21
|
-
```
|
|
21
|
+
```bash
|
|
22
22
|
yarn install @quatrain/backend-firestore
|
|
23
23
|
```
|
|
24
|
+
|
|
25
|
+
## How to use
|
|
26
|
+
|
|
27
|
+
### Setup
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { Core } from '@quatrain/core'
|
|
31
|
+
|
|
32
|
+
Core.addBackend(myAdapter, 'myDB', true)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Create a model
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { BaseObjectCore } from '@quatrain/core'
|
|
39
|
+
|
|
40
|
+
export type Cat = {
|
|
41
|
+
name: string
|
|
42
|
+
color: `#${string}`
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class CatCore extends BaseObjectCore {
|
|
46
|
+
static COLLECTION = 'cats'
|
|
47
|
+
|
|
48
|
+
static PROPERTIES = [
|
|
49
|
+
{
|
|
50
|
+
name: 'name',
|
|
51
|
+
type: Property.STRING,
|
|
52
|
+
minLength: 1,
|
|
53
|
+
maxLength: 32,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'color',
|
|
57
|
+
type: Property.STRING,
|
|
58
|
+
minLength: 4,
|
|
59
|
+
maxLength: 7,
|
|
60
|
+
},
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Instantiate a model
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
const catData: Cat = {
|
|
69
|
+
name: 'Garfield',
|
|
70
|
+
color: '#ffa502',
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const garfield = CatCore.fromObject(catData)
|
|
74
|
+
|
|
75
|
+
console.log(garfield.name)
|
|
76
|
+
// > "Garfield"
|
|
77
|
+
console.log(garfield.color)
|
|
78
|
+
// > "#ffa502"
|
|
79
|
+
console.log(garfield.core)
|
|
80
|
+
// > CatCore { ... }
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Interact with backend
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
// Let's save Garfield in our database
|
|
87
|
+
garfield.core.save()
|
|
88
|
+
|
|
89
|
+
// Now, let's retrieve Garfield in the database
|
|
90
|
+
const persistedGarfield = await CatCore.fromBackend('garfield')
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Using repositories
|
|
94
|
+
|
|
95
|
+
You can use repositories as an alternative way to persist and retrieve models in your backend.
|
|
96
|
+
|
|
97
|
+
This module provides a BaseRepository class that you can extend and override to apply your business logic when doing backend operations.
|
|
98
|
+
|
|
99
|
+
Let's create a repository for our Cat model, that prevents us from deleting a cat.
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import { Core, BackendInterface, BaseRepository } from '@quatrain/core'
|
|
103
|
+
|
|
104
|
+
export default class CatRepository extends BaseRepository<Cat> {
|
|
105
|
+
constructor(backendAdapter: BackendInterface = Core.getBackend()) {
|
|
106
|
+
super(CatCore, backendAdapter)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async delete(uid: string) {
|
|
110
|
+
throw Error("Don't delete the cats!")
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Now, let's use our new CatRepository.
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
const repository = new CatRepository()
|
|
119
|
+
|
|
120
|
+
repository.create(garfield)
|
|
121
|
+
repository.read('garfield')
|
|
122
|
+
repository.update(persistedGarfield)
|
|
123
|
+
repository.delete('garfield') // Will throw "Don't delete the cats!"
|
|
124
|
+
```
|
package/lib/Backend.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export declare
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
export declare enum BackendAction {
|
|
2
|
+
CREATE = "create",
|
|
3
|
+
READ = "read",
|
|
4
|
+
UPDATE = "update",
|
|
5
|
+
DELETE = "delete"
|
|
6
|
+
}
|
package/lib/Backend.js
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// export const CREATE = 'create'
|
|
3
|
+
// export const READ = 'read'
|
|
4
|
+
// export const UPDATE = 'update'
|
|
5
|
+
// export const DELETE = 'delete'
|
|
2
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
exports.BackendAction = void 0;
|
|
8
|
+
// export type BackendActions =
|
|
9
|
+
// | typeof CREATE
|
|
10
|
+
// | typeof READ
|
|
11
|
+
// | typeof UPDATE
|
|
12
|
+
// | typeof DELETE
|
|
13
|
+
var BackendAction;
|
|
14
|
+
(function (BackendAction) {
|
|
15
|
+
BackendAction["CREATE"] = "create";
|
|
16
|
+
BackendAction["READ"] = "read";
|
|
17
|
+
BackendAction["UPDATE"] = "update";
|
|
18
|
+
BackendAction["DELETE"] = "delete";
|
|
19
|
+
})(BackendAction || (exports.BackendAction = BackendAction = {}));
|
package/lib/Core.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { AbstractAdapter } from './backends/AbstractAdapter';
|
|
2
|
+
import { User } from './components/User';
|
|
2
3
|
import { DataObjectClass } from './components/types/DataObjectClass';
|
|
3
|
-
|
|
4
|
-
export declare type BackendRegistry<T extends AbstractAdapter> = {
|
|
4
|
+
export type BackendRegistry<T extends AbstractAdapter> = {
|
|
5
5
|
[x: string]: T;
|
|
6
6
|
};
|
|
7
7
|
export declare class Core {
|
|
8
8
|
static defaultBackend: string;
|
|
9
|
-
static currentUser:
|
|
9
|
+
static currentUser: User;
|
|
10
10
|
static classRegistry: {
|
|
11
11
|
[key: string]: any;
|
|
12
12
|
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { BackendAction } from '../Backend';
|
|
1
2
|
import { DataObjectClass } from '../components/types/DataObjectClass';
|
|
2
3
|
import { Filter } from './Filter';
|
|
3
4
|
import { Filters } from './Filters';
|
|
4
5
|
import { Query } from './Query';
|
|
5
6
|
import { SortAndLimit } from './SortAndLimit';
|
|
7
|
+
import Middleware from './middlewares/Middleware';
|
|
6
8
|
/**
|
|
7
9
|
* Default interface for a backend record
|
|
8
10
|
*/
|
|
@@ -14,7 +16,7 @@ export interface BackendRecordType {
|
|
|
14
16
|
/**
|
|
15
17
|
* Backend Parameters acceptable keys
|
|
16
18
|
*/
|
|
17
|
-
export
|
|
19
|
+
export type BackendParametersKeys = 'host' | 'alias' | 'mapping' | 'middlewares' | 'config' | 'fixtures' | 'softDelete' | 'debug';
|
|
18
20
|
/**
|
|
19
21
|
* Backend parameters interface
|
|
20
22
|
*/
|
|
@@ -24,7 +26,7 @@ export interface BackendParameters {
|
|
|
24
26
|
mapping?: {
|
|
25
27
|
[x: string]: any;
|
|
26
28
|
};
|
|
27
|
-
middlewares?:
|
|
29
|
+
middlewares?: Middleware[];
|
|
28
30
|
config?: any;
|
|
29
31
|
fixtures?: any;
|
|
30
32
|
softDelete?: boolean;
|
|
@@ -37,17 +39,19 @@ export interface BackendInterface {
|
|
|
37
39
|
delete(dataObject: DataObjectClass<any>): Promise<DataObjectClass<any>>;
|
|
38
40
|
query(query: Query<any>): Promise<DataObjectClass<any>[]>;
|
|
39
41
|
find(dataObject: DataObjectClass<any>, filters: Filters | Filter[] | undefined, pagination: SortAndLimit | undefined): Promise<DataObjectClass<any>[]>;
|
|
42
|
+
count(query: Query<any>): Promise<number>;
|
|
40
43
|
}
|
|
41
|
-
export declare abstract class AbstractAdapter {
|
|
44
|
+
export declare abstract class AbstractAdapter implements BackendInterface {
|
|
42
45
|
protected _alias: string;
|
|
43
46
|
protected _params: BackendParameters;
|
|
44
|
-
protected _middlewares:
|
|
47
|
+
protected _middlewares: Middleware[];
|
|
45
48
|
constructor(params?: BackendParameters);
|
|
46
49
|
setParam(key: BackendParametersKeys, value: any): void;
|
|
47
50
|
getParam(key: BackendParametersKeys): any;
|
|
51
|
+
addMiddleware(middleware: Middleware): void;
|
|
48
52
|
set alias(alias: string);
|
|
49
53
|
get alias(): string;
|
|
50
|
-
getCollection(dao: DataObjectClass<any>):
|
|
54
|
+
getCollection(dao: DataObjectClass<any>): string | undefined;
|
|
51
55
|
abstract create(dataObject: DataObjectClass<any>): Promise<DataObjectClass<any>>;
|
|
52
56
|
abstract read(dataObject: DataObjectClass<any>): Promise<DataObjectClass<any>>;
|
|
53
57
|
abstract update(dataObject: DataObjectClass<any>): Promise<DataObjectClass<any>>;
|
|
@@ -59,7 +63,8 @@ export declare abstract class AbstractAdapter {
|
|
|
59
63
|
* @returns Array
|
|
60
64
|
*/
|
|
61
65
|
query(query: Query<any>): Promise<DataObjectClass<any>[]>;
|
|
66
|
+
count(query: Query<any>): Promise<number>;
|
|
62
67
|
abstract find(dataObject: DataObjectClass<any>, filters: Filters | Filter[] | undefined, pagination: SortAndLimit | undefined): Promise<DataObjectClass<any>[]>;
|
|
63
68
|
log(message: string): void;
|
|
64
|
-
executeMiddlewares(dataObject: DataObjectClass<any
|
|
69
|
+
executeMiddlewares(dataObject: DataObjectClass<any>, action: BackendAction): Promise<DataObjectClass<any>>;
|
|
65
70
|
}
|
|
@@ -24,6 +24,9 @@ class AbstractAdapter {
|
|
|
24
24
|
getParam(key) {
|
|
25
25
|
return this._params[key];
|
|
26
26
|
}
|
|
27
|
+
addMiddleware(middleware) {
|
|
28
|
+
this._middlewares.push(middleware);
|
|
29
|
+
}
|
|
27
30
|
set alias(alias) {
|
|
28
31
|
this._alias = alias;
|
|
29
32
|
}
|
|
@@ -31,7 +34,7 @@ class AbstractAdapter {
|
|
|
31
34
|
return this._alias;
|
|
32
35
|
}
|
|
33
36
|
getCollection(dao) {
|
|
34
|
-
return dao.uri.
|
|
37
|
+
return dao.uri.collection; //|| dao.uri.class.name.toLowerCase() //class.COLLECTION
|
|
35
38
|
}
|
|
36
39
|
/**
|
|
37
40
|
* Process Query instance and return result
|
|
@@ -43,14 +46,21 @@ class AbstractAdapter {
|
|
|
43
46
|
return yield this.find(yield query.obj.daoFactory(), query.filters, query.sortAndLimit);
|
|
44
47
|
});
|
|
45
48
|
}
|
|
49
|
+
count(query) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
return (yield this.find(yield query.obj.daoFactory(), query.filters, undefined)).length;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
46
54
|
log(message) {
|
|
47
55
|
if (this._params['debug'] === true) {
|
|
48
56
|
console.log(message);
|
|
49
57
|
}
|
|
50
58
|
}
|
|
51
|
-
executeMiddlewares(dataObject) {
|
|
59
|
+
executeMiddlewares(dataObject, action) {
|
|
52
60
|
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
|
|
61
|
+
for (const middleware of this._middlewares) {
|
|
62
|
+
yield middleware.execute(dataObject, action);
|
|
63
|
+
}
|
|
54
64
|
return dataObject;
|
|
55
65
|
});
|
|
56
66
|
}
|
package/lib/backends/Filter.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BaseObjectCore } from '../components';
|
|
2
2
|
import { FilterOperatorType } from './FilterOperators';
|
|
3
|
-
export
|
|
3
|
+
export type FilterValueType<T extends BaseObjectCore> = T | number | string | string[] | null;
|
|
4
4
|
export interface FilterType {
|
|
5
5
|
prop: string;
|
|
6
6
|
operator: FilterOperatorType | undefined;
|
|
@@ -10,4 +10,4 @@ export declare enum FilterOperator {
|
|
|
10
10
|
containsAll = 8,
|
|
11
11
|
containsAny = 9
|
|
12
12
|
}
|
|
13
|
-
export
|
|
13
|
+
export type FilterOperatorType = 'equals' | 'notEquals' | 'greater' | 'greaterOrEquals' | 'lower' | 'lowerOrEquals' | 'contains' | 'notContains' | 'containsAll' | 'containsAny';
|
|
@@ -13,4 +13,4 @@ var FilterOperator;
|
|
|
13
13
|
FilterOperator[FilterOperator["notContains"] = 7] = "notContains";
|
|
14
14
|
FilterOperator[FilterOperator["containsAll"] = 8] = "containsAll";
|
|
15
15
|
FilterOperator[FilterOperator["containsAny"] = 9] = "containsAny";
|
|
16
|
-
})(FilterOperator
|
|
16
|
+
})(FilterOperator || (exports.FilterOperator = FilterOperator = {}));
|
|
@@ -14,7 +14,7 @@ const AbstractAdapter_1 = require("./AbstractAdapter");
|
|
|
14
14
|
const ObjectUri_1 = require("../components/ObjectUri");
|
|
15
15
|
const faker_1 = require("@faker-js/faker");
|
|
16
16
|
const BackendError_1 = require("./BackendError");
|
|
17
|
-
const
|
|
17
|
+
const ResourcesErrors_1 = require("../common/ResourcesErrors");
|
|
18
18
|
class MockAdapter extends AbstractAdapter_1.AbstractAdapter {
|
|
19
19
|
/**
|
|
20
20
|
* Inject fixtures data to backend adapter
|
|
@@ -67,7 +67,8 @@ class MockAdapter extends AbstractAdapter_1.AbstractAdapter {
|
|
|
67
67
|
const path = dataObject.path;
|
|
68
68
|
const data = MockAdapter._fixtures[path];
|
|
69
69
|
if (data === undefined) {
|
|
70
|
-
reject(new
|
|
70
|
+
reject(new ResourcesErrors_1.NotFoundError(`[Mock] No data for ${path}`));
|
|
71
|
+
return;
|
|
71
72
|
}
|
|
72
73
|
this.log(`[DAO] Populating ${dataObject.path}`);
|
|
73
74
|
resolve(yield dataObject.populate(data));
|
|
@@ -80,7 +81,7 @@ class MockAdapter extends AbstractAdapter_1.AbstractAdapter {
|
|
|
80
81
|
const path = dataObject.path;
|
|
81
82
|
const data = MockAdapter._fixtures[path];
|
|
82
83
|
if (data === undefined) {
|
|
83
|
-
reject(new
|
|
84
|
+
reject(new ResourcesErrors_1.NotFoundError(`[Mock] No data for ${path}`));
|
|
84
85
|
}
|
|
85
86
|
this.log(`[DAO] Updating ${dataObject.path}`);
|
|
86
87
|
MockAdapter._fixtures[path] = Object.assign(Object.assign({}, data), dataObject.toJSON());
|
|
@@ -94,7 +95,7 @@ class MockAdapter extends AbstractAdapter_1.AbstractAdapter {
|
|
|
94
95
|
const path = dataObject.path;
|
|
95
96
|
const data = MockAdapter._fixtures[path];
|
|
96
97
|
if (data === undefined) {
|
|
97
|
-
reject(new
|
|
98
|
+
reject(new ResourcesErrors_1.NotFoundError(`[Mock] No data for ${path}`));
|
|
98
99
|
}
|
|
99
100
|
delete MockAdapter._fixtures[dataObject.path];
|
|
100
101
|
dataObject.uri = new ObjectUri_1.ObjectUri();
|
|
@@ -126,8 +127,11 @@ class MockAdapter extends AbstractAdapter_1.AbstractAdapter {
|
|
|
126
127
|
if (Array.isArray(filters)) {
|
|
127
128
|
filters.forEach((filter) => {
|
|
128
129
|
const prop = dao.get(filter.prop);
|
|
130
|
+
if (typeof prop === 'undefined') {
|
|
131
|
+
keep = false;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
129
134
|
const val = prop.val();
|
|
130
|
-
//console.log(filter.prop, prop)
|
|
131
135
|
if (typeof prop === 'object') {
|
|
132
136
|
if (prop.constructor.name === 'ObjectProperty') {
|
|
133
137
|
if (filter.value instanceof ObjectUri_1.ObjectUri &&
|
|
@@ -144,6 +148,10 @@ class MockAdapter extends AbstractAdapter_1.AbstractAdapter {
|
|
|
144
148
|
return;
|
|
145
149
|
}
|
|
146
150
|
}
|
|
151
|
+
else if (val !== filter.value) {
|
|
152
|
+
keep = false;
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
147
155
|
}
|
|
148
156
|
else {
|
|
149
157
|
if (prop.val() !== filter.value) {
|
package/lib/backends/Query.d.ts
CHANGED
|
@@ -3,7 +3,10 @@ import { Limits } from './Limits';
|
|
|
3
3
|
import { Sorting } from './Sorting';
|
|
4
4
|
import { SortAndLimit } from './SortAndLimit';
|
|
5
5
|
import { BackendInterface } from './AbstractAdapter';
|
|
6
|
-
import {
|
|
6
|
+
import { DataObjectClass, ObjectUri } from '../components';
|
|
7
|
+
import { Persisted } from '../components/types/Persisted';
|
|
8
|
+
import { BaseObject } from '../components/BaseObject';
|
|
9
|
+
import { BaseObjectCore } from '../components/BaseObjectCore';
|
|
7
10
|
export declare const AS_OBJECTURIS = "objectUris";
|
|
8
11
|
export declare const AS_DATAOBJECTS = "dataObjects";
|
|
9
12
|
export declare const AS_INSTANCES = "classInstances";
|
|
@@ -12,7 +15,7 @@ export declare enum returnAs {
|
|
|
12
15
|
AS_DATAOBJECTS = "dataObjects",
|
|
13
16
|
AS_INSTANCES = "classInstances"
|
|
14
17
|
}
|
|
15
|
-
export declare class Query<T extends typeof
|
|
18
|
+
export declare class Query<T extends typeof BaseObjectCore> {
|
|
16
19
|
protected _obj: T;
|
|
17
20
|
protected _params: any;
|
|
18
21
|
filters: Filter[];
|
|
@@ -28,5 +31,8 @@ export declare class Query<T extends typeof AbstractObject> {
|
|
|
28
31
|
offset(offset?: number): this;
|
|
29
32
|
batch(batch?: number): this;
|
|
30
33
|
get sortAndLimit(): SortAndLimit;
|
|
31
|
-
|
|
34
|
+
fetch(backend?: BackendInterface): Promise<DataObjectClass<any>[]>;
|
|
35
|
+
fetchAsUri(backend?: BackendInterface): Promise<ObjectUri[]>;
|
|
36
|
+
fetchAsInstances(backend?: BackendInterface): Promise<Persisted<BaseObject>[]>;
|
|
37
|
+
execute(as?: returnAs, backend?: BackendInterface): Promise<DataObjectClass<any>[] | ObjectUri[] | Persisted<BaseObject>[]>;
|
|
32
38
|
}
|
package/lib/backends/Query.js
CHANGED
|
@@ -23,7 +23,7 @@ var returnAs;
|
|
|
23
23
|
returnAs["AS_OBJECTURIS"] = "objectUris";
|
|
24
24
|
returnAs["AS_DATAOBJECTS"] = "dataObjects";
|
|
25
25
|
returnAs["AS_INSTANCES"] = "classInstances";
|
|
26
|
-
})(returnAs
|
|
26
|
+
})(returnAs || (exports.returnAs = returnAs = {}));
|
|
27
27
|
class Query {
|
|
28
28
|
constructor(obj, params = {}) {
|
|
29
29
|
this._obj = obj;
|
|
@@ -72,18 +72,38 @@ class Query {
|
|
|
72
72
|
get sortAndLimit() {
|
|
73
73
|
return new SortAndLimit_1.SortAndLimit(this.sortings, this.limits);
|
|
74
74
|
}
|
|
75
|
+
fetch(backend = Core_1.Core.getBackend()) {
|
|
76
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
return backend.query(this);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
fetchAsUri(backend = Core_1.Core.getBackend()) {
|
|
81
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
const result = yield this.fetch(backend);
|
|
83
|
+
return yield Promise.all(result.map((dao) => dao.uri));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
fetchAsInstances(backend = Core_1.Core.getBackend()) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
const result = yield this.fetch(backend);
|
|
89
|
+
const instances = [];
|
|
90
|
+
for (const item of result) {
|
|
91
|
+
instances.push(this._obj.fromDataObject(item));
|
|
92
|
+
}
|
|
93
|
+
return instances;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
75
96
|
execute(as = returnAs.AS_DATAOBJECTS, backend = Core_1.Core.getBackend()) {
|
|
76
97
|
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
//</any><Array<T2> | Array<DataObject> | Array<ObjectUri>> {
|
|
77
99
|
try {
|
|
78
|
-
const result = yield backend.query(this);
|
|
79
100
|
switch (as) {
|
|
80
101
|
case exports.AS_DATAOBJECTS:
|
|
81
|
-
return
|
|
102
|
+
return yield this.fetch(backend);
|
|
82
103
|
case exports.AS_OBJECTURIS:
|
|
83
|
-
return yield
|
|
104
|
+
return yield this.fetchAsUri(backend);
|
|
84
105
|
case exports.AS_INSTANCES:
|
|
85
|
-
|
|
86
|
-
return yield Promise.all(result.map((dao) => Reflect.construct(this._obj, [dao])));
|
|
106
|
+
return yield this.fetchAsInstances(backend);
|
|
87
107
|
default:
|
|
88
108
|
throw new Error(`Unknown output mode`);
|
|
89
109
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { DataObjectClass } from '../../components';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
2
|
+
import { BackendAction } from '../../Backend';
|
|
3
|
+
import { User } from '../../components/User';
|
|
4
|
+
import Middleware from './Middleware';
|
|
5
|
+
import { Proxy } from '../../components/types/ProxyConstructor';
|
|
4
6
|
export interface InjectMetaMiddlewareParams {
|
|
5
|
-
user:
|
|
7
|
+
user: Proxy<User>;
|
|
6
8
|
}
|
|
7
|
-
export declare class InjectMetaMiddleware {
|
|
8
|
-
protected _user:
|
|
9
|
+
export declare class InjectMetaMiddleware implements Middleware {
|
|
10
|
+
protected _user: Proxy<User>;
|
|
9
11
|
constructor(params: InjectMetaMiddlewareParams);
|
|
10
|
-
execute(dataObject: DataObjectClass<any>, action:
|
|
12
|
+
execute(dataObject: DataObjectClass<any>, action: BackendAction): void;
|
|
11
13
|
}
|
|
@@ -1,30 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
3
|
exports.InjectMetaMiddleware = void 0;
|
|
27
|
-
const
|
|
4
|
+
const Backend_1 = require("../../Backend");
|
|
28
5
|
class InjectMetaMiddleware {
|
|
29
6
|
constructor(params) {
|
|
30
7
|
this._user = params.user;
|
|
@@ -32,15 +9,18 @@ class InjectMetaMiddleware {
|
|
|
32
9
|
execute(dataObject, action) {
|
|
33
10
|
switch (action) {
|
|
34
11
|
// add properties existence validation
|
|
35
|
-
case
|
|
36
|
-
dataObject.set('createdBy', this._user);
|
|
12
|
+
case Backend_1.BackendAction.CREATE:
|
|
13
|
+
dataObject.set('createdBy', this._user.core.dataObject.uri);
|
|
37
14
|
dataObject.set('createdAt', Date.now());
|
|
38
|
-
|
|
39
|
-
|
|
15
|
+
break;
|
|
16
|
+
case Backend_1.BackendAction.UPDATE:
|
|
17
|
+
dataObject.set('updatedBy', this._user.core.dataObject.uri);
|
|
40
18
|
dataObject.set('updatedAt', Date.now());
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
dataObject.set('
|
|
19
|
+
break;
|
|
20
|
+
case Backend_1.BackendAction.DELETE:
|
|
21
|
+
dataObject.set('deletedBy', this._user.core.dataObject.uri);
|
|
22
|
+
dataObject.set('deletedAt', Date.now());
|
|
23
|
+
break;
|
|
44
24
|
default:
|
|
45
25
|
break;
|
|
46
26
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class ResourceError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class BadRequestError extends ResourceError {
|
|
5
|
+
}
|
|
6
|
+
export declare class UnauthorizedError extends ResourceError {
|
|
7
|
+
}
|
|
8
|
+
export declare class ForbiddenError extends ResourceError {
|
|
9
|
+
}
|
|
10
|
+
export declare class NotFoundError extends ResourceError {
|
|
11
|
+
}
|
|
12
|
+
export declare class GoneError extends ResourceError {
|
|
13
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GoneError = exports.NotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.BadRequestError = exports.ResourceError = void 0;
|
|
4
|
+
class ResourceError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = this.constructor.name;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.ResourceError = ResourceError;
|
|
11
|
+
class BadRequestError extends ResourceError {
|
|
12
|
+
}
|
|
13
|
+
exports.BadRequestError = BadRequestError;
|
|
14
|
+
class UnauthorizedError extends ResourceError {
|
|
15
|
+
}
|
|
16
|
+
exports.UnauthorizedError = UnauthorizedError;
|
|
17
|
+
class ForbiddenError extends ResourceError {
|
|
18
|
+
}
|
|
19
|
+
exports.ForbiddenError = ForbiddenError;
|
|
20
|
+
class NotFoundError extends ResourceError {
|
|
21
|
+
}
|
|
22
|
+
exports.NotFoundError = NotFoundError;
|
|
23
|
+
class GoneError extends ResourceError {
|
|
24
|
+
}
|
|
25
|
+
exports.GoneError = GoneError;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { DataObjectClass } from './types/DataObjectClass';
|
|
2
2
|
import { DataObjectProperties } from '../properties/';
|
|
3
|
-
import { Query } from '../backends/Query';
|
|
4
3
|
export declare abstract class AbstractObject {
|
|
5
4
|
static PROPS_DEFINITION: DataObjectProperties;
|
|
6
5
|
static COLLECTION: string | undefined;
|
|
@@ -22,5 +21,4 @@ export declare abstract class AbstractObject {
|
|
|
22
21
|
};
|
|
23
22
|
save(): Promise<this>;
|
|
24
23
|
delete(): Promise<DataObjectClass<any>>;
|
|
25
|
-
static query(): Query<typeof AbstractObject>;
|
|
26
24
|
}
|
|
@@ -10,7 +10,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.AbstractObject = void 0;
|
|
13
|
-
const Query_1 = require("../backends/Query");
|
|
14
13
|
class AbstractObject {
|
|
15
14
|
constructor(dao) {
|
|
16
15
|
this._dataObject = dao;
|
|
@@ -60,9 +59,6 @@ class AbstractObject {
|
|
|
60
59
|
return yield this._dataObject.delete();
|
|
61
60
|
});
|
|
62
61
|
}
|
|
63
|
-
static query() {
|
|
64
|
-
return new Query_1.Query(this);
|
|
65
|
-
}
|
|
66
62
|
}
|
|
67
63
|
exports.AbstractObject = AbstractObject;
|
|
68
64
|
AbstractObject.PROPS_DEFINITION = [];
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { ObjectUri } from './ObjectUri';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
static factory<T extends BaseObject>(src?: string | ObjectUri | DataObjectClass<any> | undefined, child?: any): Promise<T | BaseObject>;
|
|
13
|
-
asReference(): any;
|
|
14
|
-
query(): Query<any>;
|
|
2
|
+
import { User } from './User';
|
|
3
|
+
export interface BaseObject {
|
|
4
|
+
name: string;
|
|
5
|
+
status: string;
|
|
6
|
+
createdBy?: User | ObjectUri;
|
|
7
|
+
createdAt?: number;
|
|
8
|
+
updatedBy?: User | ObjectUri;
|
|
9
|
+
updatedAt?: number;
|
|
10
|
+
deletedBy?: User | ObjectUri;
|
|
11
|
+
deletedAt?: number;
|
|
15
12
|
}
|
|
13
|
+
export declare const BaseObjectProperties: any;
|