alchemymvc 1.3.22 → 1.4.0-alpha.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/LICENSE +1 -1
- package/README.md +3 -3
- package/lib/app/behaviour/publishable_behaviour.js +5 -5
- package/lib/app/behaviour/revision_behaviour.js +96 -59
- package/lib/app/behaviour/sluggable_behaviour.js +14 -14
- package/lib/app/conduit/electron_conduit.js +9 -9
- package/lib/app/conduit/http_conduit.js +13 -13
- package/lib/app/conduit/loopback_conduit.js +15 -15
- package/lib/app/conduit/socket_conduit.js +43 -43
- package/lib/app/config/routes.js +26 -0
- package/lib/app/controller/00-default_app_controller.js +21 -0
- package/lib/app/controller/alchemy_info_controller.js +12 -12
- package/lib/app/datasource/mongo_datasource.js +27 -18
- package/lib/app/element/00-default_app_element.js +19 -0
- package/lib/app/element/time_ago.js +5 -5
- package/lib/app/helper/00-default_app_helper.js +11 -0
- package/lib/app/helper/alchemy_helper.js +22 -22
- package/lib/app/helper/backed_map.js +1 -1
- package/lib/app/helper/breadcrumb.js +10 -10
- package/lib/app/helper/client_collection.js +3 -3
- package/lib/app/helper/cron.js +29 -29
- package/lib/app/helper/enum_values.js +6 -6
- package/lib/app/helper/pagination_helper.js +36 -36
- package/lib/app/helper/router_helper.js +35 -35
- package/lib/app/helper/socket_helper.js +57 -57
- package/lib/app/helper/syncable.js +62 -62
- package/lib/app/helper_component/paginate_component.js +9 -9
- package/lib/app/helper_controller/component.js +1 -1
- package/lib/app/helper_controller/conduit.js +31 -31
- package/lib/app/helper_controller/controller.js +54 -39
- package/lib/app/helper_datasource/00-nosql_datasource.js +624 -70
- package/lib/app/helper_datasource/05-fallback_datasource.js +10 -10
- package/lib/app/helper_datasource/idb_datasource.js +6 -6
- package/lib/app/helper_datasource/indexed_db.js +22 -22
- package/lib/app/helper_datasource/remote_datasource.js +5 -5
- package/lib/app/helper_error/http_error.js +4 -4
- package/lib/app/helper_error/model_error.js +2 -2
- package/lib/app/helper_error/validation_error.js +12 -12
- package/lib/app/helper_field/00-objectid_field.js +7 -7
- package/lib/app/helper_field/05-string_field.js +16 -12
- package/lib/app/helper_field/06-text_field.js +2 -4
- package/lib/app/helper_field/10-number_field.js +9 -12
- package/lib/app/helper_field/11-date_field.js +15 -15
- package/lib/app/helper_field/15-local_temporal_field.js +10 -10
- package/lib/app/helper_field/20-decimal_field.js +8 -9
- package/lib/app/helper_field/belongsto_field.js +1 -1
- package/lib/app/helper_field/big_int_field.js +8 -8
- package/lib/app/helper_field/boolean_field.js +9 -11
- package/lib/app/helper_field/datetime_field.js +3 -3
- package/lib/app/helper_field/enum_field.js +13 -8
- package/lib/app/helper_field/fixed_decimal_field.js +6 -7
- package/lib/app/helper_field/geopoint_field.js +9 -10
- package/lib/app/helper_field/habtm_field.js +3 -3
- package/lib/app/helper_field/hasoneparent_field.js +1 -1
- package/lib/app/helper_field/html_field.js +2 -4
- package/lib/app/helper_field/integer_field.js +8 -11
- package/lib/app/helper_field/local_date_field.js +5 -5
- package/lib/app/helper_field/local_date_time_field.js +5 -5
- package/lib/app/helper_field/local_time_field.js +5 -5
- package/lib/app/helper_field/mixed_field.js +5 -5
- package/lib/app/helper_field/object_field.js +6 -6
- package/lib/app/helper_field/password_field.js +3 -3
- package/lib/app/helper_field/regexp_field.js +7 -9
- package/lib/app/helper_field/schema_field.js +91 -88
- package/lib/app/helper_field/settings_field.js +92 -0
- package/lib/app/helper_field/time_field.js +6 -6
- package/lib/app/helper_field/url_field.js +2 -4
- package/lib/app/helper_model/00-base_criteria.js +662 -0
- package/lib/app/helper_model/05-criteria_expressions.js +605 -0
- package/lib/app/helper_model/10-model_criteria.js +1182 -0
- package/lib/app/helper_model/data_provider.js +2 -2
- package/lib/app/helper_model/document.js +103 -92
- package/lib/app/helper_model/document_list.js +14 -14
- package/lib/app/helper_model/field_config.js +11 -11
- package/lib/app/helper_model/field_set.js +17 -17
- package/lib/app/helper_model/model.js +201 -123
- package/lib/app/helper_model/remote_data_provider.js +2 -2
- package/lib/app/helper_validator/00_validator.js +16 -16
- package/lib/app/helper_validator/not_empty_validator.js +9 -9
- package/lib/app/model/00-default_app_model.js +18 -0
- package/lib/app/model/05-system_model.js +27 -0
- package/lib/app/model/{alchemy_migration_model.js → system_migration_model.js} +4 -4
- package/lib/app/model/system_setting_model.js +154 -0
- package/lib/app/model/{alchemy_task_history_model.js → system_task_history_model.js} +7 -7
- package/lib/app/model/{alchemy_task_model.js → system_task_model.js} +11 -11
- package/lib/bootstrap.js +22 -312
- package/lib/class/accumulator.js +5 -5
- package/lib/class/behaviour.js +5 -5
- package/lib/class/component.js +3 -3
- package/lib/class/conduit.js +152 -150
- package/lib/class/controller.js +42 -42
- package/lib/class/datasource.js +74 -79
- package/lib/class/document.js +74 -95
- package/lib/class/document_list.js +5 -5
- package/lib/class/element.js +17 -17
- package/lib/class/error.js +3 -3
- package/lib/class/field.js +169 -91
- package/lib/class/field_value.js +6 -6
- package/lib/class/helper.js +3 -3
- package/lib/class/inode.js +17 -17
- package/lib/class/inode_dir.js +12 -12
- package/lib/class/inode_file.js +26 -26
- package/lib/class/inode_list.js +4 -4
- package/lib/class/migration.js +4 -4
- package/lib/class/model.js +146 -165
- package/lib/class/path_definition.js +22 -22
- package/lib/class/path_evaluator.js +5 -5
- package/lib/class/path_param_definition.js +7 -7
- package/lib/class/plugin.js +312 -0
- package/lib/class/postponement.js +29 -29
- package/lib/class/reciprocal.js +8 -8
- package/lib/class/route.js +33 -33
- package/lib/class/router.js +73 -73
- package/lib/class/schema.js +21 -21
- package/lib/class/schema_client.js +105 -82
- package/lib/class/session.js +63 -29
- package/lib/class/session_scene.js +4 -4
- package/lib/class/sitemap.js +16 -16
- package/lib/class/task.js +39 -39
- package/lib/class/task_service.js +43 -47
- package/lib/{init → core}/alchemy.js +411 -373
- package/lib/{init/functions.js → core/alchemy_functions.js} +113 -91
- package/lib/core/alchemy_load_functions.js +715 -0
- package/lib/core/base.js +50 -62
- package/lib/core/client_alchemy.js +144 -152
- package/lib/core/client_base.js +27 -50
- package/lib/core/discovery.js +16 -18
- package/lib/core/middleware.js +54 -43
- package/lib/core/{routing.js → prefix.js} +14 -16
- package/lib/core/setting.js +1684 -0
- package/lib/core/stage.js +758 -0
- package/lib/scripts/create_constants.js +119 -0
- package/lib/{init/languages.js → scripts/create_languages.js} +5 -5
- package/lib/scripts/create_settings.js +449 -0
- package/lib/scripts/create_shared_constants.js +95 -0
- package/lib/scripts/create_stages.js +55 -0
- package/lib/scripts/init_alchemy.js +51 -0
- package/lib/{init/requirements.js → scripts/preload_modules.js} +15 -2
- package/lib/scripts/setup_devwatch.js +238 -0
- package/lib/stages/00-load_core.js +342 -0
- package/lib/stages/05-load_app.js +57 -0
- package/lib/stages/10-datasource.js +61 -0
- package/lib/stages/15-tasks.js +27 -0
- package/lib/stages/20-settings.js +68 -0
- package/lib/stages/50-routes.js +218 -0
- package/lib/stages/90-server.js +347 -0
- package/package.json +5 -7
- package/lib/app/helper_model/criteria.js +0 -2294
- package/lib/app/helper_model/db_query.js +0 -1488
- package/lib/app/routes.js +0 -11
- package/lib/core/socket.js +0 -171
- package/lib/init/constants.js +0 -158
- package/lib/init/devwatch.js +0 -238
- package/lib/init/load_functions.js +0 -979
- package/lib/stages.js +0 -515
package/lib/class/model.js
CHANGED
|
@@ -9,51 +9,90 @@ var nameCache = {},
|
|
|
9
9
|
*
|
|
10
10
|
* @constructor
|
|
11
11
|
*
|
|
12
|
-
* @author Jelle De Loecker
|
|
12
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
13
13
|
* @since 0.0.1
|
|
14
14
|
* @version 1.1.0
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
const Model = Function.inherits('Alchemy.Base', 'Alchemy.Model', function Model(options) {
|
|
17
17
|
this.init(options);
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* This is a wrapper class
|
|
22
|
+
*/
|
|
23
|
+
Model.makeAbstractClass();
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* This wrapper class starts a new group
|
|
27
|
+
*/
|
|
28
|
+
Model.startNewGroup();
|
|
29
|
+
|
|
20
30
|
/**
|
|
21
31
|
* Set the modelName property after class creation
|
|
22
32
|
*
|
|
23
|
-
* @author Jelle De Loecker
|
|
33
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
24
34
|
* @since 0.2.0
|
|
25
|
-
* @version 1.
|
|
35
|
+
* @version 1.4.0
|
|
26
36
|
*/
|
|
27
|
-
Model.
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
Model.postInherit(function setModelName() {
|
|
38
|
+
|
|
39
|
+
let base_name = this.name;
|
|
40
|
+
let model_name = base_name;
|
|
41
|
+
let table_prefix = this.table_prefix;
|
|
42
|
+
let namespace = this.namespace;
|
|
43
|
+
|
|
44
|
+
if (namespace.startsWith('Alchemy.Model.') || namespace == 'Alchemy.Model') {
|
|
45
|
+
namespace = namespace.slice(14);
|
|
46
|
+
} else if (namespace.startsWith('Alchemy.Client.Model.') || namespace == 'Alchemy.Client.Model') {
|
|
47
|
+
namespace = namespace.slice(21);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
this.setStatic('model_namespace', namespace, false);
|
|
30
51
|
|
|
31
|
-
|
|
32
|
-
|
|
52
|
+
let ns = namespace.replaceAll('.', '_');
|
|
53
|
+
|
|
54
|
+
if (!table_prefix && ns) {
|
|
55
|
+
table_prefix = ns.tableize();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (ns) {
|
|
59
|
+
model_name = ns + '_' + model_name;
|
|
33
60
|
}
|
|
61
|
+
|
|
62
|
+
// The simple name of the model
|
|
63
|
+
this.model_name = model_name;
|
|
64
|
+
this.setProperty('model_name', model_name);
|
|
65
|
+
|
|
66
|
+
let table_name = base_name.tableize();
|
|
67
|
+
|
|
68
|
+
if (table_prefix) {
|
|
69
|
+
table_name = table_prefix + '_' + table_name;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
this.table = table_name;
|
|
34
73
|
});
|
|
35
74
|
|
|
36
75
|
/**
|
|
37
76
|
* This is a model constructor
|
|
38
77
|
*
|
|
39
|
-
* @type
|
|
78
|
+
* @type {boolean}
|
|
40
79
|
*/
|
|
41
80
|
Model.setStaticProperty('model', true);
|
|
42
81
|
|
|
43
82
|
/**
|
|
44
83
|
* The cache duration static getter/setter
|
|
45
84
|
*
|
|
46
|
-
* @author Jelle De Loecker
|
|
85
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
47
86
|
* @since 0.1.0
|
|
48
87
|
* @version 1.0.3
|
|
49
88
|
*
|
|
50
89
|
* @property cache_duration
|
|
51
|
-
* @type {
|
|
90
|
+
* @type {string}
|
|
52
91
|
*/
|
|
53
92
|
Model.setStaticProperty(function cache_duration() {
|
|
54
93
|
|
|
55
94
|
if (this._cache_duration == null) {
|
|
56
|
-
this._cache_duration = alchemy.settings.model_query_cache_duration;
|
|
95
|
+
this._cache_duration = alchemy.settings.data_management.model_query_cache_duration;
|
|
57
96
|
}
|
|
58
97
|
|
|
59
98
|
return this._cache_duration;
|
|
@@ -66,7 +105,7 @@ Model.setStaticProperty(function cache_duration() {
|
|
|
66
105
|
/**
|
|
67
106
|
* Get the cache object
|
|
68
107
|
*
|
|
69
|
-
* @author Jelle De Loecker
|
|
108
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
70
109
|
* @since 0.1.0
|
|
71
110
|
* @version 1.0.3
|
|
72
111
|
*
|
|
@@ -94,11 +133,11 @@ Model.setStaticProperty(function cache() {
|
|
|
94
133
|
/**
|
|
95
134
|
* Is this an abstract model?
|
|
96
135
|
*
|
|
97
|
-
* @author Jelle De Loecker
|
|
136
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
98
137
|
* @since 1.1.0
|
|
99
138
|
* @version 1.1.0
|
|
100
139
|
*
|
|
101
|
-
* @type
|
|
140
|
+
* @type {boolean}
|
|
102
141
|
*/
|
|
103
142
|
Model.setStaticProperty(function is_abstract() {
|
|
104
143
|
|
|
@@ -130,11 +169,10 @@ Model.setStaticProperty(function is_abstract() {
|
|
|
130
169
|
return field_count < 1;
|
|
131
170
|
});
|
|
132
171
|
|
|
133
|
-
|
|
134
172
|
/**
|
|
135
173
|
* Get the document class constructor
|
|
136
174
|
*
|
|
137
|
-
* @type
|
|
175
|
+
* @type {Alchemy.Document}
|
|
138
176
|
*/
|
|
139
177
|
Model.prepareStaticProperty('Document', function getDocumentClass() {
|
|
140
178
|
return Classes.Alchemy.Document.Document.getDocumentClass(this);
|
|
@@ -143,7 +181,7 @@ Model.prepareStaticProperty('Document', function getDocumentClass() {
|
|
|
143
181
|
/**
|
|
144
182
|
* Get the client document class constructor
|
|
145
183
|
*
|
|
146
|
-
* @type
|
|
184
|
+
* @type {Hawkejs.Document}
|
|
147
185
|
*/
|
|
148
186
|
Model.prepareStaticProperty('ClientDocument', function getClientDocumentClass() {
|
|
149
187
|
return this.Document.getClientDocumentClass();
|
|
@@ -154,7 +192,7 @@ Model.prepareStaticProperty('ClientDocument', function getClientDocumentClass()
|
|
|
154
192
|
*
|
|
155
193
|
* @version 1.1.0
|
|
156
194
|
*
|
|
157
|
-
* @type
|
|
195
|
+
* @type {Schema}
|
|
158
196
|
*/
|
|
159
197
|
Model.staticCompose('schema', function createSchema(doNext) {
|
|
160
198
|
|
|
@@ -171,7 +209,7 @@ Model.staticCompose('schema', function createSchema(doNext) {
|
|
|
171
209
|
schema.setModel(model);
|
|
172
210
|
|
|
173
211
|
// Set the schema name
|
|
174
|
-
schema.setName(model.
|
|
212
|
+
schema.setName(model.model_name);
|
|
175
213
|
|
|
176
214
|
if (model.prototype.add_basic_fields !== false) {
|
|
177
215
|
|
|
@@ -206,28 +244,28 @@ Model.setDeprecatedProperty('displayField', 'display_field');
|
|
|
206
244
|
/**
|
|
207
245
|
* The default database config to use
|
|
208
246
|
*
|
|
209
|
-
* @type
|
|
247
|
+
* @type {string}
|
|
210
248
|
*/
|
|
211
249
|
Model.setProperty('dbConfig', 'default');
|
|
212
250
|
|
|
213
251
|
/**
|
|
214
252
|
* The default field to use as display
|
|
215
253
|
*
|
|
216
|
-
* @type
|
|
254
|
+
* @type {string}
|
|
217
255
|
*/
|
|
218
256
|
Model.setProperty('display_field', 'title');
|
|
219
257
|
|
|
220
258
|
/**
|
|
221
259
|
* Translate is on by default
|
|
222
260
|
*
|
|
223
|
-
* @type
|
|
261
|
+
* @type {boolean}
|
|
224
262
|
*/
|
|
225
263
|
Model.setProperty('translate', true);
|
|
226
264
|
|
|
227
265
|
/**
|
|
228
266
|
* Set the name of the primary key field
|
|
229
267
|
*
|
|
230
|
-
* @author Jelle De Loecker <jelle@
|
|
268
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
231
269
|
* @since 0.1.0
|
|
232
270
|
* @version 0.1.0
|
|
233
271
|
*/
|
|
@@ -236,7 +274,7 @@ Model.setProperty('primary_key', '_id');
|
|
|
236
274
|
/**
|
|
237
275
|
* Should we load the schema from the database?
|
|
238
276
|
*
|
|
239
|
-
* @author Jelle De Loecker <jelle@
|
|
277
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
240
278
|
* @since 1.1.0
|
|
241
279
|
* @version 1.1.0
|
|
242
280
|
*/
|
|
@@ -245,14 +283,14 @@ Model.setProperty('load_external_schema', false);
|
|
|
245
283
|
/**
|
|
246
284
|
* Object where behaviours are stored
|
|
247
285
|
*
|
|
248
|
-
* @type
|
|
286
|
+
* @type {Object}
|
|
249
287
|
*/
|
|
250
288
|
Model.prepareProperty('behaviours', Object);
|
|
251
289
|
|
|
252
290
|
/**
|
|
253
291
|
* Associations
|
|
254
292
|
*
|
|
255
|
-
* @type
|
|
293
|
+
* @type {Object}
|
|
256
294
|
*/
|
|
257
295
|
Model.setProperty(function associations() {
|
|
258
296
|
return this.schema.associations;
|
|
@@ -261,7 +299,7 @@ Model.setProperty(function associations() {
|
|
|
261
299
|
/**
|
|
262
300
|
* Instance access to static cache
|
|
263
301
|
*
|
|
264
|
-
* @type
|
|
302
|
+
* @type {Expirable}
|
|
265
303
|
*/
|
|
266
304
|
Model.prepareProperty('cache', function cache() {
|
|
267
305
|
return this.constructor.cache;
|
|
@@ -270,7 +308,7 @@ Model.prepareProperty('cache', function cache() {
|
|
|
270
308
|
/**
|
|
271
309
|
* Instance access to static schema
|
|
272
310
|
*
|
|
273
|
-
* @type
|
|
311
|
+
* @type {Schema}
|
|
274
312
|
*/
|
|
275
313
|
Model.setProperty(function schema() {
|
|
276
314
|
return this.constructor.schema;
|
|
@@ -279,26 +317,16 @@ Model.setProperty(function schema() {
|
|
|
279
317
|
/**
|
|
280
318
|
* Is this an abstract model?
|
|
281
319
|
*
|
|
282
|
-
* @type
|
|
320
|
+
* @type {boolean}
|
|
283
321
|
*/
|
|
284
322
|
Model.setProperty(function is_abstract() {
|
|
285
323
|
return this.constructor.is_abstract;
|
|
286
324
|
});
|
|
287
325
|
|
|
288
|
-
/**
|
|
289
|
-
* This is a wrapper class
|
|
290
|
-
*/
|
|
291
|
-
Model.makeAbstractClass();
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* This wrapper class starts a new group
|
|
295
|
-
*/
|
|
296
|
-
Model.startNewGroup();
|
|
297
|
-
|
|
298
326
|
/**
|
|
299
327
|
* The connection
|
|
300
328
|
*
|
|
301
|
-
* @type
|
|
329
|
+
* @type {Object}
|
|
302
330
|
*/
|
|
303
331
|
Model.prepareProperty('datasource', function datasource() {
|
|
304
332
|
if (this.table) return Datasource.get(this.dbConfig);
|
|
@@ -307,7 +335,7 @@ Model.prepareProperty('datasource', function datasource() {
|
|
|
307
335
|
/**
|
|
308
336
|
* The default sort options
|
|
309
337
|
*
|
|
310
|
-
* @type
|
|
338
|
+
* @type {Object}
|
|
311
339
|
*/
|
|
312
340
|
Model.prepareProperty('sort', function sort() {
|
|
313
341
|
return {[this.primary_key]: -1};
|
|
@@ -316,13 +344,13 @@ Model.prepareProperty('sort', function sort() {
|
|
|
316
344
|
/**
|
|
317
345
|
* Check a url value
|
|
318
346
|
*
|
|
319
|
-
* @author Jelle De Loecker
|
|
347
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
320
348
|
* @since 1.0.0
|
|
321
349
|
* @version 1.2.5
|
|
322
350
|
*
|
|
323
|
-
* @param {
|
|
324
|
-
* @param {
|
|
325
|
-
* @param {
|
|
351
|
+
* @param {string} value The value in the url
|
|
352
|
+
* @param {string} name The name of the url parameter
|
|
353
|
+
* @param {string} field_name The name of the field to check
|
|
326
354
|
* @param {Conduit} conduit The optional conduit
|
|
327
355
|
*
|
|
328
356
|
* @return {Pledge}
|
|
@@ -369,7 +397,7 @@ Model.setStatic(async function checkPathValue(value, name, field_name, conduit)
|
|
|
369
397
|
/**
|
|
370
398
|
* Add a computed field to this model's schema
|
|
371
399
|
*
|
|
372
|
-
* @author Jelle De Loecker
|
|
400
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
373
401
|
* @since 1.3.21
|
|
374
402
|
* @version 1.3.21
|
|
375
403
|
*
|
|
@@ -397,7 +425,7 @@ Model.setStatic(function addComputedField(name, type, options) {
|
|
|
397
425
|
/**
|
|
398
426
|
* Add a field to this model's schema
|
|
399
427
|
*
|
|
400
|
-
* @author Jelle De Loecker
|
|
428
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
401
429
|
* @since 0.2.0
|
|
402
430
|
* @version 1.2.21
|
|
403
431
|
*
|
|
@@ -423,11 +451,21 @@ Model.setStatic(function addField(name, type, options) {
|
|
|
423
451
|
return field;
|
|
424
452
|
});
|
|
425
453
|
|
|
454
|
+
/**
|
|
455
|
+
* Set the wanted table prefix
|
|
456
|
+
*
|
|
457
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
458
|
+
* @since 1.4.0
|
|
459
|
+
* @version 1.4.0
|
|
460
|
+
*/
|
|
461
|
+
Model.setStatic(function setTablePrefix(prefix) {
|
|
462
|
+
this.setStatic('table_prefix', prefix);
|
|
463
|
+
});
|
|
426
464
|
|
|
427
465
|
/**
|
|
428
466
|
* Add a behaviour to this model
|
|
429
467
|
*
|
|
430
|
-
* @author Jelle De Loecker
|
|
468
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
431
469
|
* @since 0.2.0
|
|
432
470
|
* @version 0.2.0
|
|
433
471
|
*/
|
|
@@ -439,7 +477,7 @@ Model.setStatic(function addBehaviour(behaviour_name, options) {
|
|
|
439
477
|
* Add an association to this model's schema
|
|
440
478
|
* and set it on the Document as a getter
|
|
441
479
|
*
|
|
442
|
-
* @author Jelle De Loecker
|
|
480
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
443
481
|
* @since 0.2.0
|
|
444
482
|
* @version 1.2.4
|
|
445
483
|
*/
|
|
@@ -456,7 +494,7 @@ Model.setStatic(function addAssociation(type, alias, model_name, options) {
|
|
|
456
494
|
/**
|
|
457
495
|
* Set a method on the document class
|
|
458
496
|
*
|
|
459
|
-
* @author Jelle De Loecker
|
|
497
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
460
498
|
* @since 0.2.0
|
|
461
499
|
* @version 1.0.6
|
|
462
500
|
*/
|
|
@@ -477,7 +515,7 @@ Model.setStatic(function setDocumentMethod(name, fnc) {
|
|
|
477
515
|
/**
|
|
478
516
|
* Set a property on the document class
|
|
479
517
|
*
|
|
480
|
-
* @author Jelle De Loecker
|
|
518
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
481
519
|
* @since 0.2.0
|
|
482
520
|
* @version 1.0.6
|
|
483
521
|
*/
|
|
@@ -494,7 +532,7 @@ Model.setStatic(function setDocumentProperty(name, fnc) {
|
|
|
494
532
|
/**
|
|
495
533
|
* Get a field
|
|
496
534
|
*
|
|
497
|
-
* @author Jelle De Loecker
|
|
535
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
498
536
|
* @since 0.2.0
|
|
499
537
|
* @version 0.2.0
|
|
500
538
|
*
|
|
@@ -532,22 +570,24 @@ Model.setStatic(function getField(name) {
|
|
|
532
570
|
* Get the model's public configuration
|
|
533
571
|
* (This is used to create the client-side Model instances)
|
|
534
572
|
*
|
|
535
|
-
* @author Jelle De Loecker
|
|
573
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
536
574
|
* @since 1.0.0
|
|
537
575
|
* @version 1.3.1
|
|
538
576
|
*/
|
|
539
577
|
Model.setStatic(function getClientConfig() {
|
|
540
578
|
|
|
541
579
|
const result = {
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
580
|
+
class_name : this.name,
|
|
581
|
+
model_name : this.model_name,
|
|
582
|
+
model_namespace : this.model_namespace || undefined,
|
|
583
|
+
schema : this.schema,
|
|
584
|
+
primary_key : this.prototype.primary_key,
|
|
585
|
+
display_field : this.prototype.display_field,
|
|
586
|
+
ancestors : 0,
|
|
547
587
|
};
|
|
548
588
|
|
|
549
589
|
if (this.super.name != 'Model') {
|
|
550
|
-
result.parent = this.super.
|
|
590
|
+
result.parent = this.super.model_name;
|
|
551
591
|
|
|
552
592
|
let ancestors = 0,
|
|
553
593
|
ancestor = this.super;
|
|
@@ -566,7 +606,7 @@ Model.setStatic(function getClientConfig() {
|
|
|
566
606
|
/**
|
|
567
607
|
* Initialize behaviours
|
|
568
608
|
*
|
|
569
|
-
* @author Jelle De Loecker
|
|
609
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
570
610
|
* @since 0.2.0
|
|
571
611
|
* @version 0.2.0
|
|
572
612
|
*
|
|
@@ -590,7 +630,7 @@ Model.setMethod(function initBehaviours() {
|
|
|
590
630
|
/**
|
|
591
631
|
* Enable a behaviour on-the-fly
|
|
592
632
|
*
|
|
593
|
-
* @author Jelle De Loecker
|
|
633
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
594
634
|
* @since 0.0.1
|
|
595
635
|
* @version 0.2.0
|
|
596
636
|
*/
|
|
@@ -611,11 +651,11 @@ Model.setMethod(function addBehaviour(behaviourname, options) {
|
|
|
611
651
|
/**
|
|
612
652
|
* Get a behaviour instance
|
|
613
653
|
*
|
|
614
|
-
* @author Jelle De Loecker
|
|
654
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
615
655
|
* @since 1.0.3
|
|
616
656
|
* @version 1.0.3
|
|
617
657
|
*
|
|
618
|
-
* @param {
|
|
658
|
+
* @param {string} name
|
|
619
659
|
*
|
|
620
660
|
* @return {Behaviour}
|
|
621
661
|
*/
|
|
@@ -633,7 +673,7 @@ Model.setMethod(function getBehaviour(name) {
|
|
|
633
673
|
/**
|
|
634
674
|
* Enable translations
|
|
635
675
|
*
|
|
636
|
-
* @author Jelle De Loecker
|
|
676
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
637
677
|
* @since 0.2.0
|
|
638
678
|
* @version 0.2.0
|
|
639
679
|
*/
|
|
@@ -644,7 +684,7 @@ Model.setMethod(function enableTranslations() {
|
|
|
644
684
|
/**
|
|
645
685
|
* Disable translations
|
|
646
686
|
*
|
|
647
|
-
* @author Jelle De Loecker
|
|
687
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
648
688
|
* @since 0.2.0
|
|
649
689
|
* @version 0.2.0
|
|
650
690
|
*/
|
|
@@ -655,7 +695,7 @@ Model.setMethod(function disableTranslations() {
|
|
|
655
695
|
/**
|
|
656
696
|
* Aggregate
|
|
657
697
|
*
|
|
658
|
-
* @author Jelle De Loecker
|
|
698
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
659
699
|
* @since 0.5.0
|
|
660
700
|
* @version 0.5.0
|
|
661
701
|
*
|
|
@@ -677,7 +717,7 @@ Model.setMethod(function aggregate(pipeline, callback) {
|
|
|
677
717
|
/**
|
|
678
718
|
* Translate the given records
|
|
679
719
|
*
|
|
680
|
-
* @author Jelle De Loecker
|
|
720
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
681
721
|
* @since 0.2.0
|
|
682
722
|
* @version 1.3.0
|
|
683
723
|
*
|
|
@@ -725,7 +765,7 @@ Model.setMethod(function translateItems(items, options, callback) {
|
|
|
725
765
|
let conduit = this.conduit;
|
|
726
766
|
|
|
727
767
|
// Should we use fallback translations?
|
|
728
|
-
const allow_fallbacks = options.allow_fallback_translations ?? alchemy.settings.allow_fallback_translations ?? false;
|
|
768
|
+
const allow_fallbacks = options.allow_fallback_translations ?? alchemy.settings.data_management.allow_fallback_translations ?? false;
|
|
729
769
|
|
|
730
770
|
let use_predefined_prefixes = false;
|
|
731
771
|
|
|
@@ -824,7 +864,7 @@ Model.setMethod(function translateItems(items, options, callback) {
|
|
|
824
864
|
/**
|
|
825
865
|
* Create the given record if the id does not exist in the database
|
|
826
866
|
*
|
|
827
|
-
* @author Jelle De Loecker
|
|
867
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
828
868
|
* @since 0.0.1
|
|
829
869
|
* @version 1.1.0
|
|
830
870
|
*
|
|
@@ -868,7 +908,7 @@ Model.setMethod(function ensureIds(list, callback) {
|
|
|
868
908
|
/**
|
|
869
909
|
* Save one record
|
|
870
910
|
*
|
|
871
|
-
* @author Jelle De Loecker
|
|
911
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
872
912
|
* @since 0.0.1
|
|
873
913
|
* @version 1.3.20
|
|
874
914
|
*
|
|
@@ -1001,7 +1041,7 @@ Model.setMethod(function saveRecord(document, options, callback) {
|
|
|
1001
1041
|
/**
|
|
1002
1042
|
* Look for the record id by checking the indexes
|
|
1003
1043
|
*
|
|
1004
|
-
* @author Jelle De Loecker
|
|
1044
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1005
1045
|
* @since 0.1.0
|
|
1006
1046
|
* @version 1.1.0
|
|
1007
1047
|
*
|
|
@@ -1129,7 +1169,7 @@ Model.setMethod(function auditRecord(document, options, callback) {
|
|
|
1129
1169
|
/**
|
|
1130
1170
|
* Turn a record into something the database will understand
|
|
1131
1171
|
*
|
|
1132
|
-
* @author Jelle De Loecker
|
|
1172
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1133
1173
|
* @since 1.0.3
|
|
1134
1174
|
* @version 1.0.4
|
|
1135
1175
|
*
|
|
@@ -1141,10 +1181,6 @@ Model.setMethod(function auditRecord(document, options, callback) {
|
|
|
1141
1181
|
*/
|
|
1142
1182
|
Model.setMethod(function convertRecordToDatasourceFormat(record, options, callback) {
|
|
1143
1183
|
|
|
1144
|
-
var that = this,
|
|
1145
|
-
pledge,
|
|
1146
|
-
data;
|
|
1147
|
-
|
|
1148
1184
|
if (typeof options == 'function') {
|
|
1149
1185
|
callback = options;
|
|
1150
1186
|
options = {};
|
|
@@ -1154,12 +1190,12 @@ Model.setMethod(function convertRecordToDatasourceFormat(record, options, callba
|
|
|
1154
1190
|
options = {};
|
|
1155
1191
|
}
|
|
1156
1192
|
|
|
1157
|
-
data = record[this.
|
|
1193
|
+
let data = record.$main || record[this.model_name] || record;
|
|
1158
1194
|
|
|
1159
1195
|
// Normalize the data
|
|
1160
1196
|
data = this.compose(data, options);
|
|
1161
1197
|
|
|
1162
|
-
pledge = this.datasource.toDatasource(this, data);
|
|
1198
|
+
let pledge = this.datasource.toDatasource(this, data);
|
|
1163
1199
|
|
|
1164
1200
|
pledge.handleCallback(callback);
|
|
1165
1201
|
|
|
@@ -1169,7 +1205,7 @@ Model.setMethod(function convertRecordToDatasourceFormat(record, options, callba
|
|
|
1169
1205
|
/**
|
|
1170
1206
|
* Process an object of datasource format
|
|
1171
1207
|
*
|
|
1172
|
-
* @author Jelle De Loecker
|
|
1208
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1173
1209
|
* @since 1.0.3
|
|
1174
1210
|
* @version 1.0.3
|
|
1175
1211
|
*
|
|
@@ -1204,11 +1240,11 @@ Model.setMethod(function processDatasourceFormat(ds_data, options, callback) {
|
|
|
1204
1240
|
/**
|
|
1205
1241
|
* Clear the cache of this and all associated models
|
|
1206
1242
|
*
|
|
1207
|
-
* @author Jelle De Loecker
|
|
1243
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1208
1244
|
* @since 0.0.1
|
|
1209
1245
|
* @version 1.1.6
|
|
1210
1246
|
*
|
|
1211
|
-
* @param {
|
|
1247
|
+
* @param {boolean} associated Also nuke associated models
|
|
1212
1248
|
* @param {Branch} parent
|
|
1213
1249
|
*/
|
|
1214
1250
|
Model.setMethod(function nukeCache(associated, parent) {
|
|
@@ -1261,13 +1297,13 @@ Model.setMethod(function nukeCache(associated, parent) {
|
|
|
1261
1297
|
/**
|
|
1262
1298
|
* Perform a MongoDB pipeline
|
|
1263
1299
|
*
|
|
1264
|
-
* @author Jelle De Loecker
|
|
1300
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1265
1301
|
* @since 1.3.17
|
|
1266
1302
|
* @version 1.3.17
|
|
1267
1303
|
*
|
|
1268
|
-
* @param
|
|
1304
|
+
* @param {Array} pipeline
|
|
1269
1305
|
*
|
|
1270
|
-
* @return
|
|
1306
|
+
* @return {Promise}
|
|
1271
1307
|
*/
|
|
1272
1308
|
Model.setMethod(async function executeMongoPipeline(pipeline) {
|
|
1273
1309
|
|
|
@@ -1285,14 +1321,14 @@ Model.setMethod(async function executeMongoPipeline(pipeline) {
|
|
|
1285
1321
|
/**
|
|
1286
1322
|
* Delete the given record id
|
|
1287
1323
|
*
|
|
1288
|
-
* @author Jelle De Loecker
|
|
1324
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1289
1325
|
* @since 0.0.1
|
|
1290
1326
|
* @version 1.3.22
|
|
1291
1327
|
*
|
|
1292
|
-
* @param
|
|
1293
|
-
* @param
|
|
1328
|
+
* @param {string} id The object id
|
|
1329
|
+
* @param {Function} callback
|
|
1294
1330
|
*
|
|
1295
|
-
* @return
|
|
1331
|
+
* @return {Pledge}
|
|
1296
1332
|
*/
|
|
1297
1333
|
Model.setMethod(function remove(id, callback) {
|
|
1298
1334
|
|
|
@@ -1367,7 +1403,7 @@ Model.setMethod(function remove(id, callback) {
|
|
|
1367
1403
|
/**
|
|
1368
1404
|
* Get all the records and perform the given task on them
|
|
1369
1405
|
*
|
|
1370
|
-
* @author Jelle De Loecker <jelle@
|
|
1406
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1371
1407
|
* @since 0.5.0
|
|
1372
1408
|
* @version 1.2.0
|
|
1373
1409
|
*
|
|
@@ -1464,7 +1500,7 @@ Model.setMethod(function eachRecord(options, task, callback) {
|
|
|
1464
1500
|
/**
|
|
1465
1501
|
* Strip out private fields
|
|
1466
1502
|
*
|
|
1467
|
-
* @author Jelle De Loecker <jelle@
|
|
1503
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1468
1504
|
* @since 1.0.0
|
|
1469
1505
|
* @version 1.0.0
|
|
1470
1506
|
*
|
|
@@ -1505,7 +1541,7 @@ Model.setMethod(function removePrivateFields(records) {
|
|
|
1505
1541
|
/**
|
|
1506
1542
|
* Create an export stream
|
|
1507
1543
|
*
|
|
1508
|
-
* @author Jelle De Loecker <jelle@
|
|
1544
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1509
1545
|
* @since 1.0.5
|
|
1510
1546
|
* @version 1.0.5
|
|
1511
1547
|
*
|
|
@@ -1555,7 +1591,7 @@ Model.setMethod(function exportToStream(output, options) {
|
|
|
1555
1591
|
/**
|
|
1556
1592
|
* Import from a stream
|
|
1557
1593
|
*
|
|
1558
|
-
* @author Jelle De Loecker <jelle@
|
|
1594
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1559
1595
|
* @since 1.0.5
|
|
1560
1596
|
* @version 1.0.5
|
|
1561
1597
|
*
|
|
@@ -1728,99 +1764,44 @@ Model.setMethod(function importFromStream(input, options) {
|
|
|
1728
1764
|
/**
|
|
1729
1765
|
* Get a model
|
|
1730
1766
|
*
|
|
1731
|
-
* @author Jelle De Loecker
|
|
1767
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1732
1768
|
* @since 0.0.1
|
|
1733
|
-
* @version 1.
|
|
1769
|
+
* @version 1.4.0
|
|
1734
1770
|
*
|
|
1735
|
-
* @param
|
|
1736
|
-
* @param
|
|
1771
|
+
* @param {string} name
|
|
1772
|
+
* @param {boolean} init
|
|
1737
1773
|
*
|
|
1738
|
-
* @return
|
|
1774
|
+
* @return {Model}
|
|
1739
1775
|
*/
|
|
1740
1776
|
Model.get = function get(name, init, options) {
|
|
1741
1777
|
|
|
1742
|
-
|
|
1743
|
-
namespace,
|
|
1744
|
-
pieces,
|
|
1745
|
-
path,
|
|
1746
|
-
obj;
|
|
1747
|
-
|
|
1748
|
-
if (typeof name == 'function') {
|
|
1749
|
-
name = name.name;
|
|
1750
|
-
}
|
|
1751
|
-
|
|
1752
|
-
if (!name) {
|
|
1753
|
-
throw new TypeError('Model name should be a non-empty string');
|
|
1754
|
-
}
|
|
1755
|
-
|
|
1756
|
-
if (init && typeof init == 'object') {
|
|
1778
|
+
if (typeof init != 'boolean') {
|
|
1757
1779
|
options = init;
|
|
1758
1780
|
init = true;
|
|
1759
1781
|
}
|
|
1760
1782
|
|
|
1761
|
-
|
|
1762
|
-
options = {};
|
|
1763
|
-
}
|
|
1783
|
+
let path = Blast.parseClassPath(name);
|
|
1764
1784
|
|
|
1765
|
-
|
|
1766
|
-
if (init === false) {
|
|
1767
|
-
return nameCache[name];
|
|
1768
|
-
} else {
|
|
1769
|
-
return new nameCache[name];
|
|
1770
|
-
}
|
|
1771
|
-
}
|
|
1772
|
-
|
|
1773
|
-
pieces = name.split('.');
|
|
1774
|
-
|
|
1775
|
-
if (pieces.length > 1) {
|
|
1776
|
-
// The first part is the namespace
|
|
1777
|
-
namespace = pieces.shift();
|
|
1778
|
-
|
|
1779
|
-
// The rest should be the path
|
|
1780
|
-
path = pieces.join('.');
|
|
1785
|
+
let constructor = Object.path(Blast.Classes.Alchemy.Model, path) || Object.path(Blast.Classes, path);
|
|
1781
1786
|
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
if (!obj) {
|
|
1785
|
-
if (init === false) {
|
|
1786
|
-
return null;
|
|
1787
|
-
}
|
|
1788
|
-
|
|
1789
|
-
throw new TypeError('Namespace "' + namespace + '" could not be found');
|
|
1790
|
-
}
|
|
1791
|
-
} else {
|
|
1792
|
-
path = name;
|
|
1793
|
-
obj = Classes.Alchemy.Model;
|
|
1787
|
+
if (!constructor) {
|
|
1788
|
+
throw new Error('Model "' + name + '" could not be found');
|
|
1794
1789
|
}
|
|
1795
1790
|
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
if (constructor == null) {
|
|
1799
|
-
if (init === false) {
|
|
1800
|
-
return null;
|
|
1801
|
-
}
|
|
1802
|
-
|
|
1803
|
-
throw new Error('Could not find model "' + name + '"');
|
|
1804
|
-
}
|
|
1805
|
-
|
|
1806
|
-
// Store this name in the cache,
|
|
1807
|
-
// so we don't have to perform the expensive #modelName() method again
|
|
1808
|
-
nameCache[name] = constructor;
|
|
1809
|
-
|
|
1810
|
-
if (init === false) {
|
|
1791
|
+
if (!init) {
|
|
1811
1792
|
return constructor;
|
|
1812
|
-
} else {
|
|
1813
|
-
return new constructor;
|
|
1814
1793
|
}
|
|
1794
|
+
|
|
1795
|
+
return new constructor(options);
|
|
1815
1796
|
};
|
|
1816
1797
|
|
|
1817
1798
|
/**
|
|
1818
1799
|
* Make the base Model class a global
|
|
1819
1800
|
*
|
|
1820
|
-
* @author Jelle De Loecker
|
|
1801
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1821
1802
|
* @since 0.0.1
|
|
1822
1803
|
* @version 0.2.0
|
|
1823
1804
|
*
|
|
1824
|
-
* @type
|
|
1805
|
+
* @type {Object}
|
|
1825
1806
|
*/
|
|
1826
|
-
|
|
1807
|
+
DEFINE('Model', Model);
|