@quatrain/core 0.5.6 → 1.0.0-beta10

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 (100) hide show
  1. package/lib/Auth.d.ts +25 -0
  2. package/lib/Auth.js +9 -0
  3. package/lib/Backend.d.ts +34 -1
  4. package/lib/Backend.js +1 -9
  5. package/lib/Core.d.ts +11 -7
  6. package/lib/Core.js +13 -3
  7. package/lib/authentication/AbstractAuthAdapter.d.ts +18 -0
  8. package/lib/authentication/AbstractAuthAdapter.js +23 -0
  9. package/lib/authentication/AuthenticationError.d.ts +2 -0
  10. package/lib/authentication/AuthenticationError.js +6 -0
  11. package/lib/authentication/index.d.ts +4 -0
  12. package/lib/authentication/index.js +7 -0
  13. package/lib/authentication/middlewares/AbstractAuthMiddleware.d.ts +0 -0
  14. package/lib/authentication/middlewares/AbstractAuthMiddleware.js +1 -0
  15. package/lib/authentication/middlewares/AuthMiddleware.d.ts +5 -0
  16. package/lib/authentication/middlewares/AuthMiddleware.js +2 -0
  17. package/lib/authentication/middlewares/Middleware.d.ts +5 -0
  18. package/lib/authentication/middlewares/Middleware.js +2 -0
  19. package/lib/authentication/types/AuthInterface.d.ts +9 -0
  20. package/lib/authentication/types/AuthInterface.js +2 -0
  21. package/lib/backends/AbstractAdapter.d.ts +20 -45
  22. package/lib/backends/AbstractAdapter.js +27 -9
  23. package/lib/backends/Filters.d.ts +2 -1
  24. package/lib/backends/MockAdapter.d.ts +6 -4
  25. package/lib/backends/MockAdapter.js +15 -6
  26. package/lib/backends/Query.d.ts +29 -13
  27. package/lib/backends/Query.js +22 -9
  28. package/lib/backends/index.d.ts +5 -3
  29. package/lib/backends/index.js +26 -1
  30. package/lib/backends/middlewares/InjectKeywordsMiddleware.d.ts +9 -0
  31. package/lib/backends/middlewares/InjectKeywordsMiddleware.js +47 -0
  32. package/lib/backends/middlewares/InjectMetaMiddleware.d.ts +6 -6
  33. package/lib/backends/middlewares/InjectMetaMiddleware.js +10 -7
  34. package/lib/backends/middlewares/Middleware.d.ts +2 -2
  35. package/lib/backends/middlewares/types/MiddlewareParams.d.ts +3 -0
  36. package/lib/backends/middlewares/types/MiddlewareParams.js +2 -0
  37. package/lib/backends/types/BackendInterface.d.ts +13 -0
  38. package/lib/backends/types/BackendInterface.js +2 -0
  39. package/lib/backends/types/CollectionHierarchy.d.ts +3 -0
  40. package/lib/backends/types/CollectionHierarchy.js +6 -0
  41. package/lib/common/statuses.d.ts +3 -0
  42. package/lib/common/statuses.js +4 -1
  43. package/lib/components/AbstractObject.d.ts +9 -1
  44. package/lib/components/AbstractObject.js +9 -0
  45. package/lib/components/BaseObject.d.ts +3 -3
  46. package/lib/components/BaseObject.js +3 -0
  47. package/lib/components/BaseObjectCore.d.ts +16 -3
  48. package/lib/components/BaseObjectCore.js +21 -5
  49. package/lib/components/BaseRepository.d.ts +14 -13
  50. package/lib/components/BaseRepository.js +37 -21
  51. package/lib/components/DataObject.d.ts +20 -3
  52. package/lib/components/DataObject.js +73 -13
  53. package/lib/components/Entity.d.ts +4 -21
  54. package/lib/components/Entity.js +34 -32
  55. package/lib/components/EntityRepository.d.ts +3 -3
  56. package/lib/components/EntityRepository.js +1 -1
  57. package/lib/components/ObjectUri.js +2 -3
  58. package/lib/components/User.d.ts +4 -5
  59. package/lib/components/User.js +19 -10
  60. package/lib/components/UserRepository.d.ts +4 -4
  61. package/lib/components/UserRepository.js +2 -2
  62. package/lib/components/index.d.ts +3 -2
  63. package/lib/components/index.js +9 -2
  64. package/lib/components/types/DataObjectClass.d.ts +7 -1
  65. package/lib/components/types/RepositoryClass.d.ts +2 -2
  66. package/lib/components/types/toJSONParams.d.ts +8 -0
  67. package/lib/components/types/toJSONParams.js +2 -0
  68. package/lib/index.d.ts +10 -5
  69. package/lib/index.js +17 -2
  70. package/lib/properties/ArrayProperty.d.ts +1 -1
  71. package/lib/properties/ArrayProperty.js +2 -2
  72. package/lib/properties/BaseProperty.d.ts +4 -1
  73. package/lib/properties/BaseProperty.js +15 -3
  74. package/lib/properties/BooleanProperty.d.ts +1 -1
  75. package/lib/properties/BooleanProperty.js +2 -2
  76. package/lib/properties/CollectionProperty.d.ts +3 -3
  77. package/lib/properties/CollectionProperty.js +4 -3
  78. package/lib/properties/DateTimeProperty.d.ts +1 -1
  79. package/lib/properties/DateTimeProperty.js +2 -2
  80. package/lib/properties/EnumProperty.d.ts +1 -1
  81. package/lib/properties/EnumProperty.js +2 -2
  82. package/lib/properties/HashProperty.d.ts +7 -1
  83. package/lib/properties/HashProperty.js +10 -2
  84. package/lib/properties/MapProperty.d.ts +1 -1
  85. package/lib/properties/MapProperty.js +2 -2
  86. package/lib/properties/NumberProperty.d.ts +1 -1
  87. package/lib/properties/NumberProperty.js +2 -2
  88. package/lib/properties/ObjectProperty.d.ts +6 -6
  89. package/lib/properties/ObjectProperty.js +57 -5
  90. package/lib/properties/Property.d.ts +9 -2
  91. package/lib/properties/StringProperty.d.ts +2 -2
  92. package/lib/properties/StringProperty.js +2 -2
  93. package/lib/properties/types/AbstractPropertyType.d.ts +1 -0
  94. package/lib/properties/types/PropertyClassType.d.ts +4 -1
  95. package/lib/utils/DataGenerator.d.ts +2 -3
  96. package/lib/utils/DataGenerator.js +2 -1
  97. package/lib/wrappers/cloud/AbstractCloudWrapper.d.ts +4 -0
  98. package/lib/wrappers/cloud/AbstractCloudWrapper.js +9 -0
  99. package/package.json +3 -2
  100. package/README.md +0 -124
@@ -23,18 +23,30 @@ var returnAs;
23
23
  returnAs["AS_OBJECTURIS"] = "objectUris";
24
24
  returnAs["AS_DATAOBJECTS"] = "dataObjects";
25
25
  returnAs["AS_INSTANCES"] = "classInstances";
26
+ returnAs["AS_IS"] = "asIs";
26
27
  })(returnAs || (exports.returnAs = returnAs = {}));
27
28
  class Query {
28
- constructor(obj, params = {}) {
29
+ constructor(obj, parent) {
29
30
  this._obj = obj;
30
- this._params = params; // just in case
31
+ this._parent = parent;
31
32
  this.filters = [];
32
33
  this.sortings = [];
33
34
  this.limits = new Limits_1.Limits();
35
+ this.meta = {};
34
36
  }
35
37
  get obj() {
36
38
  return this._obj;
37
39
  }
40
+ get parent() {
41
+ return this._parent;
42
+ }
43
+ /**
44
+ * Declare query parent record
45
+ * This may be need in some NoSQL backend to query subcollections
46
+ */
47
+ set parent(parent) {
48
+ this._parent = parent;
49
+ }
38
50
  where(param, value = null, operator = 'equals') {
39
51
  if (typeof param == 'object') {
40
52
  this.filters.push(param);
@@ -42,7 +54,7 @@ class Query {
42
54
  else {
43
55
  if (operator === 'equals' && Array.isArray(value)) {
44
56
  // auto-convert operator if value is an array
45
- operator = 'containsAny';
57
+ operator = 'contains'; // Any'
46
58
  }
47
59
  this.filters.push(new Filter_1.Filter(param, value, operator));
48
60
  }
@@ -79,22 +91,23 @@ class Query {
79
91
  }
80
92
  fetchAsUri(backend = Core_1.Core.getBackend()) {
81
93
  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));
94
+ const { items, meta } = yield this.fetch(backend);
95
+ return { items: yield Promise.all(items.map((dao) => dao.uri)), meta };
84
96
  });
85
97
  }
86
98
  fetchAsInstances(backend = Core_1.Core.getBackend()) {
87
99
  return __awaiter(this, void 0, void 0, function* () {
88
- const result = yield this.fetch(backend);
100
+ const { items, meta } = yield this.fetch(backend);
89
101
  const instances = [];
90
- for (const item of result) {
102
+ for (const item of items) {
91
103
  instances.push(this._obj.fromDataObject(item));
92
104
  }
93
- return instances;
105
+ return { items: instances, meta };
94
106
  });
95
107
  }
96
- execute(as = returnAs.AS_DATAOBJECTS, backend = Core_1.Core.getBackend()) {
108
+ execute(as = returnAs.AS_DATAOBJECTS, backend = Core_1.Core.getBackend(this._obj.DEFAULT_BACKEND)) {
97
109
  return __awaiter(this, void 0, void 0, function* () {
110
+ //<DataObjectClass<any>[] | ObjectUri[] | Persisted<BaseObject>[]> {
98
111
  //</any><Array<T2> | Array<DataObject> | Array<ObjectUri>> {
99
112
  try {
100
113
  switch (as) {
@@ -1,10 +1,12 @@
1
- import { AbstractAdapter, BackendInterface, BackendParameters } from './AbstractAdapter';
1
+ import { AbstractAdapter } from './AbstractAdapter';
2
2
  import { MockAdapter } from './MockAdapter';
3
3
  import { BackendError } from './BackendError';
4
- import { Query } from './Query';
4
+ import { BackendInterface } from './types/BackendInterface';
5
+ import * as CollectionHierarchy from './types/CollectionHierarchy';
6
+ import { Query, QueryResultType, QueryMetaType } from './Query';
5
7
  import { Filter } from './Filter';
6
8
  import { Filters } from './Filters';
7
9
  import { Sorting } from './Sorting';
8
10
  import { Limits } from './Limits';
9
11
  import { SortAndLimit } from './SortAndLimit';
10
- export { AbstractAdapter, BackendInterface, BackendParameters, BackendError, MockAdapter, Query, Filter, Filters, Sorting, Limits, SortAndLimit, };
12
+ export { BackendInterface, AbstractAdapter, BackendError, MockAdapter, Query, QueryResultType, QueryMetaType, Filter, Filters, Sorting, Limits, SortAndLimit, CollectionHierarchy, };
@@ -1,12 +1,37 @@
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
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SortAndLimit = exports.Limits = exports.Sorting = exports.Filters = exports.Filter = exports.Query = exports.MockAdapter = exports.BackendError = exports.AbstractAdapter = void 0;
26
+ exports.CollectionHierarchy = exports.SortAndLimit = exports.Limits = exports.Sorting = exports.Filters = exports.Filter = exports.Query = exports.MockAdapter = exports.BackendError = exports.AbstractAdapter = void 0;
4
27
  const AbstractAdapter_1 = require("./AbstractAdapter");
5
28
  Object.defineProperty(exports, "AbstractAdapter", { enumerable: true, get: function () { return AbstractAdapter_1.AbstractAdapter; } });
6
29
  const MockAdapter_1 = require("./MockAdapter");
7
30
  Object.defineProperty(exports, "MockAdapter", { enumerable: true, get: function () { return MockAdapter_1.MockAdapter; } });
8
31
  const BackendError_1 = require("./BackendError");
9
32
  Object.defineProperty(exports, "BackendError", { enumerable: true, get: function () { return BackendError_1.BackendError; } });
33
+ const CollectionHierarchy = __importStar(require("./types/CollectionHierarchy"));
34
+ exports.CollectionHierarchy = CollectionHierarchy;
10
35
  const Query_1 = require("./Query");
11
36
  Object.defineProperty(exports, "Query", { enumerable: true, get: function () { return Query_1.Query; } });
12
37
  const Filter_1 = require("./Filter");
@@ -0,0 +1,9 @@
1
+ import { DataObjectClass } from '../../components';
2
+ import { BackendAction } from '../../Backend';
3
+ import BackendMiddleware from './Middleware';
4
+ export interface InjectKeywordsMiddlewareParams {
5
+ }
6
+ export declare class InjectKeywordsMiddleware implements BackendMiddleware {
7
+ execute(dataObject: DataObjectClass<any>, action: BackendAction): void;
8
+ protected _createKeywords(dataObject: DataObjectClass<any>): string[];
9
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectKeywordsMiddleware = void 0;
4
+ const Backend_1 = require("../../Backend");
5
+ const properties_1 = require("../../properties");
6
+ class InjectKeywordsMiddleware {
7
+ execute(dataObject, action) {
8
+ if (!dataObject.has('keywords')) {
9
+ dataObject.addProperty(new properties_1.ArrayProperty({ name: 'keywords' }));
10
+ }
11
+ switch (action) {
12
+ case Backend_1.BackendAction.CREATE:
13
+ case Backend_1.BackendAction.UPDATE:
14
+ dataObject.set('keywords', this._createKeywords(dataObject));
15
+ break;
16
+ default:
17
+ break;
18
+ }
19
+ return;
20
+ }
21
+ _createKeywords(dataObject) {
22
+ const keywords = [];
23
+ Object.keys(dataObject.properties)
24
+ .filter((key) => dataObject.get(key).fullSearch === true)
25
+ .forEach((key) => {
26
+ const val = dataObject.val(key);
27
+ if (val) {
28
+ val.toLowerCase()
29
+ .split(' ')
30
+ .forEach((word) => {
31
+ let seq = '';
32
+ word
33
+ .split('')
34
+ .splice(0, 15)
35
+ .forEach((letter) => {
36
+ seq += letter;
37
+ if (seq.length > 1) {
38
+ keywords.push(seq);
39
+ }
40
+ });
41
+ });
42
+ }
43
+ });
44
+ return [...new Set(keywords)];
45
+ }
46
+ }
47
+ exports.InjectKeywordsMiddleware = InjectKeywordsMiddleware;
@@ -1,13 +1,13 @@
1
1
  import { DataObjectClass } from '../../components';
2
2
  import { BackendAction } from '../../Backend';
3
3
  import { User } from '../../components/User';
4
- import Middleware from './Middleware';
5
- import { Proxy } from '../../components/types/ProxyConstructor';
4
+ import BackendMiddleware from './Middleware';
5
+ import { MiddlewareParams } from './types/MiddlewareParams';
6
6
  export interface InjectMetaMiddlewareParams {
7
- user: Proxy<User>;
7
+ user: User;
8
8
  }
9
- export declare class InjectMetaMiddleware implements Middleware {
10
- protected _user: Proxy<User>;
9
+ export declare class InjectMetaMiddleware implements BackendMiddleware {
10
+ protected _user: User;
11
11
  constructor(params: InjectMetaMiddlewareParams);
12
- execute(dataObject: DataObjectClass<any>, action: BackendAction): void;
12
+ execute(dataObject: DataObjectClass<any>, action: BackendAction, params?: MiddlewareParams): void;
13
13
  }
@@ -2,24 +2,27 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InjectMetaMiddleware = void 0;
4
4
  const Backend_1 = require("../../Backend");
5
+ const Core_1 = require("../../Core");
5
6
  class InjectMetaMiddleware {
6
7
  constructor(params) {
7
8
  this._user = params.user;
8
9
  }
9
- execute(dataObject, action) {
10
+ execute(dataObject, action, params) {
11
+ Core_1.Core.log(`[MDW] Executing Middleware ${this.constructor.name}`);
12
+ const date = params && params.useDateFormat ? (new Date()).toISOString() : Date.now();
10
13
  switch (action) {
11
14
  // add properties existence validation
12
15
  case Backend_1.BackendAction.CREATE:
13
- dataObject.set('createdBy', this._user.core.dataObject.uri);
14
- dataObject.set('createdAt', Date.now());
16
+ dataObject.set('createdBy', this._user);
17
+ dataObject.set('createdAt', date);
15
18
  break;
16
19
  case Backend_1.BackendAction.UPDATE:
17
- dataObject.set('updatedBy', this._user.core.dataObject.uri);
18
- dataObject.set('updatedAt', Date.now());
20
+ dataObject.set('updatedBy', this._user);
21
+ dataObject.set('updatedAt', date);
19
22
  break;
20
23
  case Backend_1.BackendAction.DELETE:
21
- dataObject.set('deletedBy', this._user.core.dataObject.uri);
22
- dataObject.set('deletedAt', Date.now());
24
+ dataObject.set('deletedBy', this._user);
25
+ dataObject.set('deletedAt', date);
23
26
  break;
24
27
  default:
25
28
  break;
@@ -1,5 +1,5 @@
1
1
  import { BackendAction } from '../../Backend';
2
2
  import { DataObjectClass } from '../../components';
3
- export default interface Middleware {
4
- execute: (dataObject: DataObjectClass<any>, action: BackendAction) => void;
3
+ export default interface BackendMiddleware {
4
+ execute: (dataObject: DataObjectClass<any>, action: BackendAction, params?: any) => void;
5
5
  }
@@ -0,0 +1,3 @@
1
+ export type MiddlewareParams = {
2
+ useDateFormat?: boolean;
3
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { DataObjectClass } from '../../components';
2
+ import { Filter } from '../Filter';
3
+ import { Filters } from '../Filters';
4
+ import { Query, QueryResultType } from '../Query';
5
+ import { SortAndLimit } from '../SortAndLimit';
6
+ export interface BackendInterface {
7
+ create(dataObject: DataObjectClass<any>, desiredUid: string | undefined): Promise<DataObjectClass<any>>;
8
+ read(param: string | DataObjectClass<any>): Promise<DataObjectClass<any>>;
9
+ update(dataObject: DataObjectClass<any>): Promise<DataObjectClass<any>>;
10
+ delete(dataObject: DataObjectClass<any>): Promise<DataObjectClass<any>>;
11
+ query(query: Query<any>): Promise<QueryResultType<DataObjectClass<any>>>;
12
+ find(dataObject: DataObjectClass<any>, filters: Filters | Filter[] | undefined, pagination: SortAndLimit | undefined, parent: any): Promise<QueryResultType<DataObjectClass<any>>>;
13
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export declare const STANDARD = 1;
2
+ export declare const SUBCOLLECTION = 2;
3
+ export declare const SUBCOLLECTION_GROUP = 3;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SUBCOLLECTION_GROUP = exports.SUBCOLLECTION = exports.STANDARD = void 0;
4
+ exports.STANDARD = 1;
5
+ exports.SUBCOLLECTION = 2;
6
+ exports.SUBCOLLECTION_GROUP = 3;
@@ -1,11 +1,14 @@
1
1
  export declare const CREATED = "created";
2
2
  export declare const PENDING = "pending";
3
+ export declare const QUEUED = "queued";
3
4
  export declare const ACTIVE = "active";
5
+ export declare const COMPLETED = "completed";
4
6
  export declare const ERROR = "error";
5
7
  export declare const TEST = "test";
6
8
  export declare const SUSPENDED = "suspended";
7
9
  export declare const DELETABLE = "deletable";
8
10
  export declare const DELETED = "deleted";
11
+ export declare const DISABLED = "disabled";
9
12
  export declare const DONE = "done";
10
13
  export declare const MAINTENANCE = "maintenance";
11
14
  export declare const UNKNOWN = "unknown";
@@ -1,14 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UNKNOWN = exports.MAINTENANCE = exports.DONE = exports.DELETED = exports.DELETABLE = exports.SUSPENDED = exports.TEST = exports.ERROR = exports.ACTIVE = exports.PENDING = exports.CREATED = void 0;
3
+ exports.UNKNOWN = exports.MAINTENANCE = exports.DONE = exports.DISABLED = exports.DELETED = exports.DELETABLE = exports.SUSPENDED = exports.TEST = exports.ERROR = exports.COMPLETED = exports.ACTIVE = exports.QUEUED = exports.PENDING = exports.CREATED = void 0;
4
4
  exports.CREATED = 'created';
5
5
  exports.PENDING = 'pending';
6
+ exports.QUEUED = 'queued';
6
7
  exports.ACTIVE = 'active';
8
+ exports.COMPLETED = 'completed';
7
9
  exports.ERROR = 'error';
8
10
  exports.TEST = 'test';
9
11
  exports.SUSPENDED = 'suspended';
10
12
  exports.DELETABLE = 'deletable';
11
13
  exports.DELETED = 'deleted';
14
+ exports.DISABLED = 'disabled';
12
15
  exports.DONE = 'done';
13
16
  exports.MAINTENANCE = 'maintenance';
14
17
  exports.UNKNOWN = 'unknown';
@@ -1,11 +1,18 @@
1
1
  import { DataObjectClass } from './types/DataObjectClass';
2
- import { DataObjectProperties } from '../properties/';
2
+ import { DataObjectProperties } from '../properties';
3
3
  export declare abstract class AbstractObject {
4
4
  static PROPS_DEFINITION: DataObjectProperties;
5
5
  static COLLECTION: string | undefined;
6
+ static PARENT_PROP: string | undefined;
7
+ static DEFAULT_BACKEND: string;
6
8
  static LABEL_KEY: string;
7
9
  protected _dataObject: DataObjectClass<any>;
8
10
  constructor(dao: DataObjectClass<any>);
11
+ /**
12
+ * Return property object matching key
13
+ * @param key string
14
+ * @returns
15
+ */
9
16
  get(key: string): any;
10
17
  set(key: string, val: any): any;
11
18
  val(key: string): any;
@@ -13,6 +20,7 @@ export declare abstract class AbstractObject {
13
20
  get path(): string;
14
21
  get uid(): any;
15
22
  get dataObject(): DataObjectClass<any>;
23
+ get _(): any;
16
24
  get uri(): import("./ObjectUri").ObjectUri;
17
25
  toJSON(): {
18
26
  backend: string;
@@ -14,6 +14,11 @@ class AbstractObject {
14
14
  constructor(dao) {
15
15
  this._dataObject = dao;
16
16
  }
17
+ /**
18
+ * Return property object matching key
19
+ * @param key string
20
+ * @returns
21
+ */
17
22
  get(key) {
18
23
  return this._dataObject.get(key);
19
24
  }
@@ -41,6 +46,9 @@ class AbstractObject {
41
46
  get dataObject() {
42
47
  return this._dataObject;
43
48
  }
49
+ get _() {
50
+ return this._dataObject.asProxy();
51
+ }
44
52
  get uri() {
45
53
  return this._dataObject.uri;
46
54
  }
@@ -62,5 +70,6 @@ class AbstractObject {
62
70
  }
63
71
  exports.AbstractObject = AbstractObject;
64
72
  AbstractObject.PROPS_DEFINITION = [];
73
+ AbstractObject.DEFAULT_BACKEND = 'default';
65
74
  // Which property's value to use in backend as label for object reference
66
75
  AbstractObject.LABEL_KEY = 'name';
@@ -4,10 +4,10 @@ export interface BaseObject {
4
4
  name: string;
5
5
  status: string;
6
6
  createdBy?: User | ObjectUri;
7
- createdAt?: number;
7
+ createdAt?: number | string;
8
8
  updatedBy?: User | ObjectUri;
9
- updatedAt?: number;
9
+ updatedAt?: number | string;
10
10
  deletedBy?: User | ObjectUri;
11
- deletedAt?: number;
11
+ deletedAt?: number | string;
12
12
  }
13
13
  export declare const BaseObjectProperties: any;
@@ -37,6 +37,7 @@ exports.BaseObjectProperties = [
37
37
  type: StringProperty_1.StringProperty.TYPE,
38
38
  minLength: 1,
39
39
  maxLength: 100,
40
+ fullSearch: true,
40
41
  htmlType: htmlType.NAME,
41
42
  },
42
43
  {
@@ -51,6 +52,8 @@ exports.BaseObjectProperties = [
51
52
  ],
52
53
  defaultValue: statuses.CREATED,
53
54
  },
55
+ // the following properties may be optionally
56
+ // populated with a backend middleware
54
57
  {
55
58
  name: 'createdBy',
56
59
  type: ObjectProperty_1.ObjectProperty.TYPE,
@@ -39,7 +39,7 @@ export declare class BaseObjectCore extends AbstractObject implements BaseObject
39
39
  * @param child
40
40
  * @returns
41
41
  */
42
- static fromObject<T extends BaseObject>(src: T, child?: any): Proxy<T>;
42
+ static fromObject<T extends BaseObject>(src: T, child?: any): any;
43
43
  static factory(src?: string | ObjectUri | BaseObject | undefined, child?: any): Promise<any>;
44
44
  /**
45
45
  * Fetches an object from its backend path
@@ -52,9 +52,22 @@ export declare class BaseObjectCore extends AbstractObject implements BaseObject
52
52
  * @param dao
53
53
  * @returns
54
54
  */
55
- static fromDataObject<T extends BaseObject>(dao: DataObjectClass<any>): T;
55
+ static fromDataObject<T extends BaseObject>(dao: DataObjectClass<any>): any;
56
+ /**
57
+ * Wrap instance into proxy to get access to properties
58
+ * @returns Proxy
59
+ */
56
60
  protected toProxy<T extends BaseObject>(): Proxy<Proxy<T>>;
57
61
  asReference(): any;
58
- query(): Query<any>;
62
+ /**
63
+ * Create a query based on given class where parent is current instance
64
+ * @param obj
65
+ * @returns Query
66
+ */
67
+ query(obj: any): Query<any>;
68
+ /**
69
+ * Create a query based on current class
70
+ * @returns Query
71
+ */
59
72
  static query(): Query<typeof BaseObjectCore>;
60
73
  }
@@ -33,7 +33,10 @@ class BaseObjectCore extends AbstractObject_1.AbstractObject {
33
33
  base.push(property);
34
34
  }
35
35
  });
36
- const dao = DataObject_1.DataObject.factory({ properties: base });
36
+ const dao = DataObject_1.DataObject.factory({
37
+ properties: base,
38
+ parentProp: this.PARENT_PROP,
39
+ });
37
40
  dao.uri.class = child;
38
41
  return dao;
39
42
  }
@@ -63,7 +66,7 @@ class BaseObjectCore extends AbstractObject_1.AbstractObject {
63
66
  dao.uri.class = child;
64
67
  dao.populateFromData(src);
65
68
  const obj = new this(dao);
66
- return obj.toProxy();
69
+ return obj;
67
70
  }
68
71
  static factory(src = undefined, child = this) {
69
72
  return __awaiter(this, void 0, void 0, function* () {
@@ -100,8 +103,12 @@ class BaseObjectCore extends AbstractObject_1.AbstractObject {
100
103
  */
101
104
  static fromDataObject(dao) {
102
105
  const obj = new this(dao);
103
- return obj.toProxy();
106
+ return obj; //.toProxy()
104
107
  }
108
+ /**
109
+ * Wrap instance into proxy to get access to properties
110
+ * @returns Proxy
111
+ */
105
112
  toProxy() {
106
113
  return new ProxyConstructor_1.ProxyConstructor(this, {
107
114
  get: (target, prop) => {
@@ -142,9 +149,18 @@ class BaseObjectCore extends AbstractObject_1.AbstractObject {
142
149
  asReference() {
143
150
  return this._dataObject.toReference();
144
151
  }
145
- query() {
146
- return new Query_1.Query(this.constructor.prototype);
152
+ /**
153
+ * Create a query based on given class where parent is current instance
154
+ * @param obj
155
+ * @returns Query
156
+ */
157
+ query(obj) {
158
+ return new Query_1.Query(obj, this);
147
159
  }
160
+ /**
161
+ * Create a query based on current class
162
+ * @returns Query
163
+ */
148
164
  static query() {
149
165
  return new Query_1.Query(this);
150
166
  }
@@ -1,24 +1,25 @@
1
- import { BackendInterface } from '../backends/AbstractAdapter';
2
- import { Query } from '../backends/Query';
1
+ import { Query, QueryResultType } from '../backends/Query';
3
2
  import { BaseObjectCore } from './BaseObjectCore';
4
3
  import { DataObjectClass } from './types/DataObjectClass';
5
- import Payload from './types/Payload';
6
- import RepositoryClass from './types/RepositoryClass';
7
4
  import { BaseObject } from './BaseObject';
8
- import { Persisted } from './types/Persisted';
9
- import { Proxy } from './types/ProxyConstructor';
5
+ import { BackendInterface } from '../backends/types/BackendInterface';
10
6
  /**
11
7
  * CRUD methods for models/entities inheriting from BaseObject
12
8
  * Extend this by passing the typeof of the desired class to the constructor
13
9
  */
14
- export default class BaseRepository<T extends BaseObject> implements RepositoryClass<T> {
15
- protected model: typeof BaseObjectCore;
10
+ export default class BaseRepository<T extends BaseObject> {
11
+ protected _model: typeof BaseObjectCore;
16
12
  backendAdapter: BackendInterface;
17
13
  constructor(model: typeof BaseObjectCore, backendAdapter?: BackendInterface);
18
14
  protected getDataObjectFromUid(uid: string): Promise<DataObjectClass<any>>;
19
- create(obj: Proxy<T>, uid?: string): Promise<Persisted<T>>;
20
- read(uid: string): Promise<Persisted<T>>;
21
- update(obj: Proxy<T>): Promise<Persisted<T>>;
22
- delete(uid: string): Promise<void>;
23
- query(query: Query<typeof BaseObjectCore>): Promise<Payload<Persisted<T>>>;
15
+ protected getDataObjectFromPath(path: string): Promise<DataObjectClass<any>>;
16
+ create<B extends BaseObjectCore>(obj: B, uid?: string): Promise<any>;
17
+ read(key: string): Promise<any>;
18
+ update(obj: BaseObjectCore): Promise<any>;
19
+ /**
20
+ * delete object in its backend
21
+ * @param uid string
22
+ */
23
+ delete(uid: string): Promise<DataObjectClass<any>>;
24
+ query(query: Query<any>): Promise<QueryResultType<T>>;
24
25
  }
@@ -43,34 +43,53 @@ const RESOURCE_GONE_ERROR = `The resource you are trying to access has been dele
43
43
  */
44
44
  class BaseRepository {
45
45
  constructor(model, backendAdapter = Core_1.Core.getBackend()) {
46
- this.model = model;
46
+ this._model = model;
47
47
  this.backendAdapter = backendAdapter;
48
48
  }
49
49
  getDataObjectFromUid(uid) {
50
50
  return __awaiter(this, void 0, void 0, function* () {
51
- const collection = this.model.COLLECTION || this.model.name.toLowerCase();
51
+ const collection = this._model.COLLECTION || this._model.name.toLowerCase();
52
52
  const path = `${collection}/${uid}`;
53
- const dataObject = yield DataObject_1.DataObject.factory({
54
- properties: this.model.PROPS_DEFINITION,
53
+ const dataObject = DataObject_1.DataObject.factory({
54
+ properties: this._model.PROPS_DEFINITION,
55
55
  uri: path,
56
56
  });
57
57
  dataObject.uid = uid;
58
58
  return dataObject;
59
59
  });
60
60
  }
61
+ getDataObjectFromPath(path) {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ const dataObject = DataObject_1.DataObject.factory({
64
+ properties: this._model.PROPS_DEFINITION,
65
+ uri: path,
66
+ });
67
+ dataObject.uid = path.substring(path.lastIndexOf('/') + 1);
68
+ return dataObject;
69
+ });
70
+ }
61
71
  create(obj, uid) {
62
72
  return __awaiter(this, void 0, void 0, function* () {
63
- const dataObject = obj.core.dataObject;
64
- const savedObj = yield this.backendAdapter.create(dataObject, uid);
65
- return this.model.fromDataObject(savedObj);
73
+ const savedObj = yield this.backendAdapter.create(obj.dataObject, uid);
74
+ return this._model.fromDataObject(savedObj);
66
75
  });
67
76
  }
68
- read(uid) {
77
+ read(key) {
69
78
  return __awaiter(this, void 0, void 0, function* () {
70
79
  try {
71
- const dataObject = yield this.getDataObjectFromUid(uid);
80
+ let dataObject;
81
+ if (key.split('/').length <= 2) {
82
+ const uid = key.indexOf('/') !== -1
83
+ ? key.substring(key.lastIndexOf('/') + 1)
84
+ : key;
85
+ dataObject = yield this.getDataObjectFromUid(uid);
86
+ }
87
+ else {
88
+ dataObject = yield this.getDataObjectFromPath(key);
89
+ }
72
90
  const response = yield this.backendAdapter.read(dataObject);
73
- const obj = this.model.fromDataObject(response);
91
+ const obj = this._model.fromDataObject(response);
92
+ // TODO should be moved to the backend middleware
74
93
  if (obj.status === statuses.DELETED) {
75
94
  throw new ResourcesErrors_1.GoneError(RESOURCE_GONE_ERROR);
76
95
  }
@@ -89,27 +108,24 @@ class BaseRepository {
89
108
  }
90
109
  update(obj) {
91
110
  return __awaiter(this, void 0, void 0, function* () {
92
- const dataObject = obj.core.dataObject;
111
+ const dataObject = obj.dataObject;
93
112
  const savedObj = yield this.backendAdapter.update(dataObject);
94
- return this.model.fromDataObject(savedObj);
113
+ return this._model.fromDataObject(savedObj);
95
114
  });
96
115
  }
116
+ /**
117
+ * delete object in its backend
118
+ * @param uid string
119
+ */
97
120
  delete(uid) {
98
121
  return __awaiter(this, void 0, void 0, function* () {
99
122
  const dataObject = yield this.getDataObjectFromUid(uid);
100
- yield this.backendAdapter.delete(dataObject);
123
+ return yield this.backendAdapter.delete(dataObject);
101
124
  });
102
125
  }
103
126
  query(query) {
104
127
  return __awaiter(this, void 0, void 0, function* () {
105
- const items = (yield query.fetchAsInstances(this.backendAdapter));
106
- const count = yield this.backendAdapter.count(query);
107
- const meta = {
108
- count,
109
- updatedAt: new Date().getTime(),
110
- };
111
- const payload = { items, meta };
112
- return payload;
128
+ return yield query.fetchAsInstances(this.backendAdapter);
113
129
  });
114
130
  }
115
131
  }