@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.
Files changed (74) hide show
  1. package/README.md +103 -2
  2. package/lib/Backend.d.ts +6 -5
  3. package/lib/Backend.js +17 -5
  4. package/lib/Core.d.ts +3 -3
  5. package/lib/backends/AbstractAdapter.d.ts +11 -6
  6. package/lib/backends/AbstractAdapter.js +13 -3
  7. package/lib/backends/Filter.d.ts +2 -2
  8. package/lib/backends/FilterOperators.d.ts +1 -1
  9. package/lib/backends/FilterOperators.js +1 -1
  10. package/lib/backends/MockAdapter.js +13 -5
  11. package/lib/backends/Query.d.ts +9 -3
  12. package/lib/backends/Query.js +26 -6
  13. package/lib/backends/middlewares/InjectMetaMiddleware.d.ts +8 -6
  14. package/lib/backends/middlewares/InjectMetaMiddleware.js +11 -31
  15. package/lib/backends/middlewares/Middleware.d.ts +5 -0
  16. package/lib/common/ResourcesErrors.d.ts +13 -0
  17. package/lib/common/ResourcesErrors.js +25 -0
  18. package/lib/components/AbstractObject.d.ts +0 -2
  19. package/lib/components/AbstractObject.js +0 -4
  20. package/lib/components/BaseObject.d.ts +11 -13
  21. package/lib/components/BaseObject.js +84 -78
  22. package/lib/components/BaseObjectCore.d.ts +60 -0
  23. package/lib/components/BaseObjectCore.js +153 -0
  24. package/lib/components/BaseRepository.d.ts +24 -0
  25. package/lib/components/BaseRepository.js +116 -0
  26. package/lib/components/DataObject.d.ts +19 -4
  27. package/lib/components/DataObject.js +63 -18
  28. package/lib/components/Entity.d.ts +22 -3
  29. package/lib/components/Entity.js +23 -22
  30. package/lib/components/EntityRepository.d.ts +6 -0
  31. package/lib/components/EntityRepository.js +14 -0
  32. package/lib/components/ObjectUri.js +4 -4
  33. package/lib/components/User.d.ts +14 -3
  34. package/lib/components/User.js +10 -8
  35. package/lib/components/UserRepository.d.ts +7 -0
  36. package/lib/components/UserRepository.js +36 -0
  37. package/lib/components/index.d.ts +4 -5
  38. package/lib/components/index.js +6 -9
  39. package/lib/components/types/AbstractObjectClass.d.ts +1 -1
  40. package/lib/components/types/BaseObjectClass.d.ts +3 -2
  41. package/lib/components/types/DataObjectClass.d.ts +3 -0
  42. package/lib/components/types/Payload.d.ts +10 -0
  43. package/lib/components/types/Payload.js +2 -0
  44. package/lib/components/types/Persisted.d.ts +6 -0
  45. package/lib/components/types/Persisted.js +2 -0
  46. package/lib/components/types/Properties.d.ts +3 -0
  47. package/lib/components/types/Properties.js +1 -0
  48. package/lib/components/types/ProxyConstructor.d.ts +10 -0
  49. package/lib/components/types/ProxyConstructor.js +4 -0
  50. package/lib/components/types/RepositoryClass.d.ts +40 -0
  51. package/lib/components/types/RepositoryClass.js +2 -0
  52. package/lib/index.d.ts +11 -3
  53. package/lib/index.js +21 -8
  54. package/lib/properties/BaseProperty.d.ts +2 -1
  55. package/lib/properties/BaseProperty.js +5 -1
  56. package/lib/properties/CollectionProperty.d.ts +4 -3
  57. package/lib/properties/HashProperty.d.ts +1 -1
  58. package/lib/properties/NumberProperty.d.ts +2 -2
  59. package/lib/properties/ObjectProperty.d.ts +5 -3
  60. package/lib/properties/ObjectProperty.js +5 -2
  61. package/lib/properties/Property.js +6 -0
  62. package/lib/properties/index.d.ts +2 -2
  63. package/lib/properties/types/PropertyClassType.d.ts +2 -1
  64. package/lib/properties/types/PropertyHTMLType.d.ts +1 -1
  65. package/lib/properties/types/PropertyTypes.d.ts +2 -2
  66. package/lib/utils/DataGenerator.d.ts +3 -2
  67. package/lib/utils/DataGenerator.js +1 -1
  68. package/package.json +31 -29
  69. package/lib/components/BaseObjectProperties.d.ts +0 -13
  70. package/lib/components/BaseObjectProperties.js +0 -87
  71. package/lib/components/UserProperties.d.ts +0 -1
  72. package/lib/components/UserProperties.js +0 -103
  73. package/lib/components/types/UserClass.d.ts +0 -3
  74. /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
- ```javascript
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
- ```javascript
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 const CREATE = "create";
2
- export declare const READ = "read";
3
- export declare const UPDATE = "update";
4
- export declare const DELETE = "delete";
5
- export declare type BackendActions = typeof CREATE | typeof READ | typeof UPDATE | typeof DELETE;
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.DELETE = exports.UPDATE = exports.READ = exports.CREATE = void 0;
4
- exports.CREATE = 'create';
5
- exports.READ = 'read';
6
- exports.UPDATE = 'update';
7
- exports.DELETE = 'delete';
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
- import { UserClass } from './components/types/UserClass';
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: UserClass;
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 declare type BackendParametersKeys = 'host' | 'alias' | 'mapping' | 'middlewares' | 'config' | 'fixtures' | 'softDelete' | 'debug';
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?: any[];
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: any[];
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>): 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>): Promise<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.class.COLLECTION || dao.uri.class.name.toLowerCase();
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
- this._middlewares.forEach((middleware) => __awaiter(this, void 0, void 0, function* () { return yield middleware.execute(dataObject); }));
61
+ for (const middleware of this._middlewares) {
62
+ yield middleware.execute(dataObject, action);
63
+ }
54
64
  return dataObject;
55
65
  });
56
66
  }
@@ -1,6 +1,6 @@
1
- import { BaseObject } from '../components';
1
+ import { BaseObjectCore } from '../components';
2
2
  import { FilterOperatorType } from './FilterOperators';
3
- export declare type FilterValueType<T extends BaseObject> = T | number | string | string[] | null;
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 declare type FilterOperatorType = 'equals' | 'notEquals' | 'greater' | 'greaterOrEquals' | 'lower' | 'lowerOrEquals' | 'contains' | 'notContains' | 'containsAll' | 'containsAny';
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 = exports.FilterOperator || (exports.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 NotFoundError_1 = require("./NotFoundError");
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 NotFoundError_1.NotFoundError(`[Mock] No data for ${path}`));
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 NotFoundError_1.NotFoundError(`[Mock] No data for ${path}`));
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 NotFoundError_1.NotFoundError(`[Mock] No data for ${path}`));
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) {
@@ -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 { AbstractObject } from '../components';
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 AbstractObject> {
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
- execute(as?: returnAs, backend?: BackendInterface): Promise<any>;
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
  }
@@ -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 = exports.returnAs || (exports.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 result;
102
+ return yield this.fetch(backend);
82
103
  case exports.AS_OBJECTURIS:
83
- return yield Promise.all(result.map((dao) => dao.uri));
104
+ return yield this.fetchAsUri(backend);
84
105
  case exports.AS_INSTANCES:
85
- //console.log(this._obj)
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 { UserClass } from '../../components/types/UserClass';
3
- import * as actions from '../../Backend';
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: UserClass;
7
+ user: Proxy<User>;
6
8
  }
7
- export declare class InjectMetaMiddleware {
8
- protected _user: UserClass;
9
+ export declare class InjectMetaMiddleware implements Middleware {
10
+ protected _user: Proxy<User>;
9
11
  constructor(params: InjectMetaMiddlewareParams);
10
- execute(dataObject: DataObjectClass<any>, action: actions.BackendActions): void;
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 actions = __importStar(require("../../Backend"));
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 actions.CREATE:
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
- case actions.UPDATE:
39
- dataObject.set('updatedBy', this._user);
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
- case actions.DELETE:
42
- dataObject.set('deletedBy', this._user);
43
- dataObject.set('deleteddAt', Date.now());
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,5 @@
1
+ import { BackendAction } from '../../Backend';
2
+ import { DataObjectClass } from '../../components';
3
+ export default interface Middleware {
4
+ execute: (dataObject: DataObjectClass<any>, action: BackendAction) => void;
5
+ }
@@ -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 { DataObjectClass } from './types/DataObjectClass';
3
- import { BaseObjectClass } from './types/BaseObjectClass';
4
- import { AbstractObject } from './AbstractObject';
5
- import { Query } from '../backends/Query';
6
- export declare class BaseObject extends AbstractObject implements BaseObjectClass {
7
- static PROPS_DEFINITION: any;
8
- static getProperty(key: string): any;
9
- get status(): string;
10
- set status(status: string);
11
- static daoFactory(src?: string | ObjectUri | DataObjectClass<any> | undefined, child?: any): Promise<DataObjectClass<any>>;
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;