alchemymvc 1.3.21 → 1.4.0-alpha.1
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 +10 -10
- 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 +16 -16
- 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 +84 -59
- 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 +8 -8
- 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 +203 -124
- 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 +203 -163
- 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 +50 -25
- package/lib/class/inode_list.js +4 -4
- package/lib/class/migration.js +4 -4
- package/lib/class/model.js +182 -168
- 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 +73 -67
- 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 +413 -374
- package/lib/{init/functions.js → core/alchemy_functions.js} +171 -108
- 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 +39 -52
- 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 -973
- package/lib/stages.js +0 -513
package/lib/class/model.js
CHANGED
|
@@ -9,51 +9,95 @@ 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);
|
|
51
|
+
|
|
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;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (model_name[0] == '_') {
|
|
63
|
+
console.log(ns, model_name)
|
|
64
|
+
throw new Error('KAK')
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The simple name of the model
|
|
68
|
+
this.model_name = model_name;
|
|
69
|
+
this.setProperty('model_name', model_name);
|
|
70
|
+
|
|
71
|
+
let table_name = base_name.tableize();
|
|
30
72
|
|
|
31
|
-
if (
|
|
32
|
-
|
|
73
|
+
if (table_prefix) {
|
|
74
|
+
table_name = table_prefix + '_' + table_name;
|
|
33
75
|
}
|
|
76
|
+
|
|
77
|
+
this.table = table_name;
|
|
34
78
|
});
|
|
35
79
|
|
|
36
80
|
/**
|
|
37
81
|
* This is a model constructor
|
|
38
82
|
*
|
|
39
|
-
* @type
|
|
83
|
+
* @type {boolean}
|
|
40
84
|
*/
|
|
41
85
|
Model.setStaticProperty('model', true);
|
|
42
86
|
|
|
43
87
|
/**
|
|
44
88
|
* The cache duration static getter/setter
|
|
45
89
|
*
|
|
46
|
-
* @author Jelle De Loecker
|
|
90
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
47
91
|
* @since 0.1.0
|
|
48
92
|
* @version 1.0.3
|
|
49
93
|
*
|
|
50
94
|
* @property cache_duration
|
|
51
|
-
* @type {
|
|
95
|
+
* @type {string}
|
|
52
96
|
*/
|
|
53
97
|
Model.setStaticProperty(function cache_duration() {
|
|
54
98
|
|
|
55
99
|
if (this._cache_duration == null) {
|
|
56
|
-
this._cache_duration = alchemy.settings.model_query_cache_duration;
|
|
100
|
+
this._cache_duration = alchemy.settings.data_management.model_query_cache_duration;
|
|
57
101
|
}
|
|
58
102
|
|
|
59
103
|
return this._cache_duration;
|
|
@@ -66,7 +110,7 @@ Model.setStaticProperty(function cache_duration() {
|
|
|
66
110
|
/**
|
|
67
111
|
* Get the cache object
|
|
68
112
|
*
|
|
69
|
-
* @author Jelle De Loecker
|
|
113
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
70
114
|
* @since 0.1.0
|
|
71
115
|
* @version 1.0.3
|
|
72
116
|
*
|
|
@@ -94,11 +138,11 @@ Model.setStaticProperty(function cache() {
|
|
|
94
138
|
/**
|
|
95
139
|
* Is this an abstract model?
|
|
96
140
|
*
|
|
97
|
-
* @author Jelle De Loecker
|
|
141
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
98
142
|
* @since 1.1.0
|
|
99
143
|
* @version 1.1.0
|
|
100
144
|
*
|
|
101
|
-
* @type
|
|
145
|
+
* @type {boolean}
|
|
102
146
|
*/
|
|
103
147
|
Model.setStaticProperty(function is_abstract() {
|
|
104
148
|
|
|
@@ -130,11 +174,10 @@ Model.setStaticProperty(function is_abstract() {
|
|
|
130
174
|
return field_count < 1;
|
|
131
175
|
});
|
|
132
176
|
|
|
133
|
-
|
|
134
177
|
/**
|
|
135
178
|
* Get the document class constructor
|
|
136
179
|
*
|
|
137
|
-
* @type
|
|
180
|
+
* @type {Alchemy.Document}
|
|
138
181
|
*/
|
|
139
182
|
Model.prepareStaticProperty('Document', function getDocumentClass() {
|
|
140
183
|
return Classes.Alchemy.Document.Document.getDocumentClass(this);
|
|
@@ -143,7 +186,7 @@ Model.prepareStaticProperty('Document', function getDocumentClass() {
|
|
|
143
186
|
/**
|
|
144
187
|
* Get the client document class constructor
|
|
145
188
|
*
|
|
146
|
-
* @type
|
|
189
|
+
* @type {Hawkejs.Document}
|
|
147
190
|
*/
|
|
148
191
|
Model.prepareStaticProperty('ClientDocument', function getClientDocumentClass() {
|
|
149
192
|
return this.Document.getClientDocumentClass();
|
|
@@ -154,7 +197,7 @@ Model.prepareStaticProperty('ClientDocument', function getClientDocumentClass()
|
|
|
154
197
|
*
|
|
155
198
|
* @version 1.1.0
|
|
156
199
|
*
|
|
157
|
-
* @type
|
|
200
|
+
* @type {Schema}
|
|
158
201
|
*/
|
|
159
202
|
Model.staticCompose('schema', function createSchema(doNext) {
|
|
160
203
|
|
|
@@ -171,7 +214,7 @@ Model.staticCompose('schema', function createSchema(doNext) {
|
|
|
171
214
|
schema.setModel(model);
|
|
172
215
|
|
|
173
216
|
// Set the schema name
|
|
174
|
-
schema.setName(model.
|
|
217
|
+
schema.setName(model.model_name);
|
|
175
218
|
|
|
176
219
|
if (model.prototype.add_basic_fields !== false) {
|
|
177
220
|
|
|
@@ -206,28 +249,28 @@ Model.setDeprecatedProperty('displayField', 'display_field');
|
|
|
206
249
|
/**
|
|
207
250
|
* The default database config to use
|
|
208
251
|
*
|
|
209
|
-
* @type
|
|
252
|
+
* @type {string}
|
|
210
253
|
*/
|
|
211
254
|
Model.setProperty('dbConfig', 'default');
|
|
212
255
|
|
|
213
256
|
/**
|
|
214
257
|
* The default field to use as display
|
|
215
258
|
*
|
|
216
|
-
* @type
|
|
259
|
+
* @type {string}
|
|
217
260
|
*/
|
|
218
261
|
Model.setProperty('display_field', 'title');
|
|
219
262
|
|
|
220
263
|
/**
|
|
221
264
|
* Translate is on by default
|
|
222
265
|
*
|
|
223
|
-
* @type
|
|
266
|
+
* @type {boolean}
|
|
224
267
|
*/
|
|
225
268
|
Model.setProperty('translate', true);
|
|
226
269
|
|
|
227
270
|
/**
|
|
228
271
|
* Set the name of the primary key field
|
|
229
272
|
*
|
|
230
|
-
* @author Jelle De Loecker <jelle@
|
|
273
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
231
274
|
* @since 0.1.0
|
|
232
275
|
* @version 0.1.0
|
|
233
276
|
*/
|
|
@@ -236,7 +279,7 @@ Model.setProperty('primary_key', '_id');
|
|
|
236
279
|
/**
|
|
237
280
|
* Should we load the schema from the database?
|
|
238
281
|
*
|
|
239
|
-
* @author Jelle De Loecker <jelle@
|
|
282
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
240
283
|
* @since 1.1.0
|
|
241
284
|
* @version 1.1.0
|
|
242
285
|
*/
|
|
@@ -245,14 +288,14 @@ Model.setProperty('load_external_schema', false);
|
|
|
245
288
|
/**
|
|
246
289
|
* Object where behaviours are stored
|
|
247
290
|
*
|
|
248
|
-
* @type
|
|
291
|
+
* @type {Object}
|
|
249
292
|
*/
|
|
250
293
|
Model.prepareProperty('behaviours', Object);
|
|
251
294
|
|
|
252
295
|
/**
|
|
253
296
|
* Associations
|
|
254
297
|
*
|
|
255
|
-
* @type
|
|
298
|
+
* @type {Object}
|
|
256
299
|
*/
|
|
257
300
|
Model.setProperty(function associations() {
|
|
258
301
|
return this.schema.associations;
|
|
@@ -261,7 +304,7 @@ Model.setProperty(function associations() {
|
|
|
261
304
|
/**
|
|
262
305
|
* Instance access to static cache
|
|
263
306
|
*
|
|
264
|
-
* @type
|
|
307
|
+
* @type {Expirable}
|
|
265
308
|
*/
|
|
266
309
|
Model.prepareProperty('cache', function cache() {
|
|
267
310
|
return this.constructor.cache;
|
|
@@ -270,7 +313,7 @@ Model.prepareProperty('cache', function cache() {
|
|
|
270
313
|
/**
|
|
271
314
|
* Instance access to static schema
|
|
272
315
|
*
|
|
273
|
-
* @type
|
|
316
|
+
* @type {Schema}
|
|
274
317
|
*/
|
|
275
318
|
Model.setProperty(function schema() {
|
|
276
319
|
return this.constructor.schema;
|
|
@@ -279,26 +322,16 @@ Model.setProperty(function schema() {
|
|
|
279
322
|
/**
|
|
280
323
|
* Is this an abstract model?
|
|
281
324
|
*
|
|
282
|
-
* @type
|
|
325
|
+
* @type {boolean}
|
|
283
326
|
*/
|
|
284
327
|
Model.setProperty(function is_abstract() {
|
|
285
328
|
return this.constructor.is_abstract;
|
|
286
329
|
});
|
|
287
330
|
|
|
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
331
|
/**
|
|
299
332
|
* The connection
|
|
300
333
|
*
|
|
301
|
-
* @type
|
|
334
|
+
* @type {Object}
|
|
302
335
|
*/
|
|
303
336
|
Model.prepareProperty('datasource', function datasource() {
|
|
304
337
|
if (this.table) return Datasource.get(this.dbConfig);
|
|
@@ -307,7 +340,7 @@ Model.prepareProperty('datasource', function datasource() {
|
|
|
307
340
|
/**
|
|
308
341
|
* The default sort options
|
|
309
342
|
*
|
|
310
|
-
* @type
|
|
343
|
+
* @type {Object}
|
|
311
344
|
*/
|
|
312
345
|
Model.prepareProperty('sort', function sort() {
|
|
313
346
|
return {[this.primary_key]: -1};
|
|
@@ -316,13 +349,13 @@ Model.prepareProperty('sort', function sort() {
|
|
|
316
349
|
/**
|
|
317
350
|
* Check a url value
|
|
318
351
|
*
|
|
319
|
-
* @author Jelle De Loecker
|
|
352
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
320
353
|
* @since 1.0.0
|
|
321
354
|
* @version 1.2.5
|
|
322
355
|
*
|
|
323
|
-
* @param {
|
|
324
|
-
* @param {
|
|
325
|
-
* @param {
|
|
356
|
+
* @param {string} value The value in the url
|
|
357
|
+
* @param {string} name The name of the url parameter
|
|
358
|
+
* @param {string} field_name The name of the field to check
|
|
326
359
|
* @param {Conduit} conduit The optional conduit
|
|
327
360
|
*
|
|
328
361
|
* @return {Pledge}
|
|
@@ -369,7 +402,7 @@ Model.setStatic(async function checkPathValue(value, name, field_name, conduit)
|
|
|
369
402
|
/**
|
|
370
403
|
* Add a computed field to this model's schema
|
|
371
404
|
*
|
|
372
|
-
* @author Jelle De Loecker
|
|
405
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
373
406
|
* @since 1.3.21
|
|
374
407
|
* @version 1.3.21
|
|
375
408
|
*
|
|
@@ -397,7 +430,7 @@ Model.setStatic(function addComputedField(name, type, options) {
|
|
|
397
430
|
/**
|
|
398
431
|
* Add a field to this model's schema
|
|
399
432
|
*
|
|
400
|
-
* @author Jelle De Loecker
|
|
433
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
401
434
|
* @since 0.2.0
|
|
402
435
|
* @version 1.2.21
|
|
403
436
|
*
|
|
@@ -423,11 +456,21 @@ Model.setStatic(function addField(name, type, options) {
|
|
|
423
456
|
return field;
|
|
424
457
|
});
|
|
425
458
|
|
|
459
|
+
/**
|
|
460
|
+
* Set the wanted table prefix
|
|
461
|
+
*
|
|
462
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
463
|
+
* @since 1.4.0
|
|
464
|
+
* @version 1.4.0
|
|
465
|
+
*/
|
|
466
|
+
Model.setStatic(function setTablePrefix(prefix) {
|
|
467
|
+
this.setStatic('table_prefix', prefix);
|
|
468
|
+
});
|
|
426
469
|
|
|
427
470
|
/**
|
|
428
471
|
* Add a behaviour to this model
|
|
429
472
|
*
|
|
430
|
-
* @author Jelle De Loecker
|
|
473
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
431
474
|
* @since 0.2.0
|
|
432
475
|
* @version 0.2.0
|
|
433
476
|
*/
|
|
@@ -439,7 +482,7 @@ Model.setStatic(function addBehaviour(behaviour_name, options) {
|
|
|
439
482
|
* Add an association to this model's schema
|
|
440
483
|
* and set it on the Document as a getter
|
|
441
484
|
*
|
|
442
|
-
* @author Jelle De Loecker
|
|
485
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
443
486
|
* @since 0.2.0
|
|
444
487
|
* @version 1.2.4
|
|
445
488
|
*/
|
|
@@ -456,7 +499,7 @@ Model.setStatic(function addAssociation(type, alias, model_name, options) {
|
|
|
456
499
|
/**
|
|
457
500
|
* Set a method on the document class
|
|
458
501
|
*
|
|
459
|
-
* @author Jelle De Loecker
|
|
502
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
460
503
|
* @since 0.2.0
|
|
461
504
|
* @version 1.0.6
|
|
462
505
|
*/
|
|
@@ -477,7 +520,7 @@ Model.setStatic(function setDocumentMethod(name, fnc) {
|
|
|
477
520
|
/**
|
|
478
521
|
* Set a property on the document class
|
|
479
522
|
*
|
|
480
|
-
* @author Jelle De Loecker
|
|
523
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
481
524
|
* @since 0.2.0
|
|
482
525
|
* @version 1.0.6
|
|
483
526
|
*/
|
|
@@ -494,7 +537,7 @@ Model.setStatic(function setDocumentProperty(name, fnc) {
|
|
|
494
537
|
/**
|
|
495
538
|
* Get a field
|
|
496
539
|
*
|
|
497
|
-
* @author Jelle De Loecker
|
|
540
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
498
541
|
* @since 0.2.0
|
|
499
542
|
* @version 0.2.0
|
|
500
543
|
*
|
|
@@ -532,22 +575,24 @@ Model.setStatic(function getField(name) {
|
|
|
532
575
|
* Get the model's public configuration
|
|
533
576
|
* (This is used to create the client-side Model instances)
|
|
534
577
|
*
|
|
535
|
-
* @author Jelle De Loecker
|
|
578
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
536
579
|
* @since 1.0.0
|
|
537
580
|
* @version 1.3.1
|
|
538
581
|
*/
|
|
539
582
|
Model.setStatic(function getClientConfig() {
|
|
540
583
|
|
|
541
584
|
const result = {
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
585
|
+
class_name : this.name,
|
|
586
|
+
model_name : this.model_name,
|
|
587
|
+
model_namespace : this.model_namespace || undefined,
|
|
588
|
+
schema : this.schema,
|
|
589
|
+
primary_key : this.prototype.primary_key,
|
|
590
|
+
display_field : this.prototype.display_field,
|
|
591
|
+
ancestors : 0,
|
|
547
592
|
};
|
|
548
593
|
|
|
549
594
|
if (this.super.name != 'Model') {
|
|
550
|
-
result.parent = this.super.
|
|
595
|
+
result.parent = this.super.model_name;
|
|
551
596
|
|
|
552
597
|
let ancestors = 0,
|
|
553
598
|
ancestor = this.super;
|
|
@@ -566,7 +611,7 @@ Model.setStatic(function getClientConfig() {
|
|
|
566
611
|
/**
|
|
567
612
|
* Initialize behaviours
|
|
568
613
|
*
|
|
569
|
-
* @author Jelle De Loecker
|
|
614
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
570
615
|
* @since 0.2.0
|
|
571
616
|
* @version 0.2.0
|
|
572
617
|
*
|
|
@@ -590,7 +635,7 @@ Model.setMethod(function initBehaviours() {
|
|
|
590
635
|
/**
|
|
591
636
|
* Enable a behaviour on-the-fly
|
|
592
637
|
*
|
|
593
|
-
* @author Jelle De Loecker
|
|
638
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
594
639
|
* @since 0.0.1
|
|
595
640
|
* @version 0.2.0
|
|
596
641
|
*/
|
|
@@ -611,11 +656,11 @@ Model.setMethod(function addBehaviour(behaviourname, options) {
|
|
|
611
656
|
/**
|
|
612
657
|
* Get a behaviour instance
|
|
613
658
|
*
|
|
614
|
-
* @author Jelle De Loecker
|
|
659
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
615
660
|
* @since 1.0.3
|
|
616
661
|
* @version 1.0.3
|
|
617
662
|
*
|
|
618
|
-
* @param {
|
|
663
|
+
* @param {string} name
|
|
619
664
|
*
|
|
620
665
|
* @return {Behaviour}
|
|
621
666
|
*/
|
|
@@ -633,7 +678,7 @@ Model.setMethod(function getBehaviour(name) {
|
|
|
633
678
|
/**
|
|
634
679
|
* Enable translations
|
|
635
680
|
*
|
|
636
|
-
* @author Jelle De Loecker
|
|
681
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
637
682
|
* @since 0.2.0
|
|
638
683
|
* @version 0.2.0
|
|
639
684
|
*/
|
|
@@ -644,7 +689,7 @@ Model.setMethod(function enableTranslations() {
|
|
|
644
689
|
/**
|
|
645
690
|
* Disable translations
|
|
646
691
|
*
|
|
647
|
-
* @author Jelle De Loecker
|
|
692
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
648
693
|
* @since 0.2.0
|
|
649
694
|
* @version 0.2.0
|
|
650
695
|
*/
|
|
@@ -655,7 +700,7 @@ Model.setMethod(function disableTranslations() {
|
|
|
655
700
|
/**
|
|
656
701
|
* Aggregate
|
|
657
702
|
*
|
|
658
|
-
* @author Jelle De Loecker
|
|
703
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
659
704
|
* @since 0.5.0
|
|
660
705
|
* @version 0.5.0
|
|
661
706
|
*
|
|
@@ -677,7 +722,7 @@ Model.setMethod(function aggregate(pipeline, callback) {
|
|
|
677
722
|
/**
|
|
678
723
|
* Translate the given records
|
|
679
724
|
*
|
|
680
|
-
* @author Jelle De Loecker
|
|
725
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
681
726
|
* @since 0.2.0
|
|
682
727
|
* @version 1.3.0
|
|
683
728
|
*
|
|
@@ -725,7 +770,7 @@ Model.setMethod(function translateItems(items, options, callback) {
|
|
|
725
770
|
let conduit = this.conduit;
|
|
726
771
|
|
|
727
772
|
// Should we use fallback translations?
|
|
728
|
-
const allow_fallbacks = options.allow_fallback_translations ?? alchemy.settings.allow_fallback_translations ?? false;
|
|
773
|
+
const allow_fallbacks = options.allow_fallback_translations ?? alchemy.settings.data_management.allow_fallback_translations ?? false;
|
|
729
774
|
|
|
730
775
|
let use_predefined_prefixes = false;
|
|
731
776
|
|
|
@@ -824,7 +869,7 @@ Model.setMethod(function translateItems(items, options, callback) {
|
|
|
824
869
|
/**
|
|
825
870
|
* Create the given record if the id does not exist in the database
|
|
826
871
|
*
|
|
827
|
-
* @author Jelle De Loecker
|
|
872
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
828
873
|
* @since 0.0.1
|
|
829
874
|
* @version 1.1.0
|
|
830
875
|
*
|
|
@@ -868,7 +913,7 @@ Model.setMethod(function ensureIds(list, callback) {
|
|
|
868
913
|
/**
|
|
869
914
|
* Save one record
|
|
870
915
|
*
|
|
871
|
-
* @author Jelle De Loecker
|
|
916
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
872
917
|
* @since 0.0.1
|
|
873
918
|
* @version 1.3.20
|
|
874
919
|
*
|
|
@@ -1001,7 +1046,7 @@ Model.setMethod(function saveRecord(document, options, callback) {
|
|
|
1001
1046
|
/**
|
|
1002
1047
|
* Look for the record id by checking the indexes
|
|
1003
1048
|
*
|
|
1004
|
-
* @author Jelle De Loecker
|
|
1049
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1005
1050
|
* @since 0.1.0
|
|
1006
1051
|
* @version 1.1.0
|
|
1007
1052
|
*
|
|
@@ -1129,7 +1174,7 @@ Model.setMethod(function auditRecord(document, options, callback) {
|
|
|
1129
1174
|
/**
|
|
1130
1175
|
* Turn a record into something the database will understand
|
|
1131
1176
|
*
|
|
1132
|
-
* @author Jelle De Loecker
|
|
1177
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1133
1178
|
* @since 1.0.3
|
|
1134
1179
|
* @version 1.0.4
|
|
1135
1180
|
*
|
|
@@ -1169,7 +1214,7 @@ Model.setMethod(function convertRecordToDatasourceFormat(record, options, callba
|
|
|
1169
1214
|
/**
|
|
1170
1215
|
* Process an object of datasource format
|
|
1171
1216
|
*
|
|
1172
|
-
* @author Jelle De Loecker
|
|
1217
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1173
1218
|
* @since 1.0.3
|
|
1174
1219
|
* @version 1.0.3
|
|
1175
1220
|
*
|
|
@@ -1204,11 +1249,11 @@ Model.setMethod(function processDatasourceFormat(ds_data, options, callback) {
|
|
|
1204
1249
|
/**
|
|
1205
1250
|
* Clear the cache of this and all associated models
|
|
1206
1251
|
*
|
|
1207
|
-
* @author Jelle De Loecker
|
|
1252
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1208
1253
|
* @since 0.0.1
|
|
1209
1254
|
* @version 1.1.6
|
|
1210
1255
|
*
|
|
1211
|
-
* @param {
|
|
1256
|
+
* @param {boolean} associated Also nuke associated models
|
|
1212
1257
|
* @param {Branch} parent
|
|
1213
1258
|
*/
|
|
1214
1259
|
Model.setMethod(function nukeCache(associated, parent) {
|
|
@@ -1261,13 +1306,13 @@ Model.setMethod(function nukeCache(associated, parent) {
|
|
|
1261
1306
|
/**
|
|
1262
1307
|
* Perform a MongoDB pipeline
|
|
1263
1308
|
*
|
|
1264
|
-
* @author Jelle De Loecker
|
|
1309
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1265
1310
|
* @since 1.3.17
|
|
1266
1311
|
* @version 1.3.17
|
|
1267
1312
|
*
|
|
1268
|
-
* @param
|
|
1313
|
+
* @param {Array} pipeline
|
|
1269
1314
|
*
|
|
1270
|
-
* @return
|
|
1315
|
+
* @return {Promise}
|
|
1271
1316
|
*/
|
|
1272
1317
|
Model.setMethod(async function executeMongoPipeline(pipeline) {
|
|
1273
1318
|
|
|
@@ -1285,14 +1330,14 @@ Model.setMethod(async function executeMongoPipeline(pipeline) {
|
|
|
1285
1330
|
/**
|
|
1286
1331
|
* Delete the given record id
|
|
1287
1332
|
*
|
|
1288
|
-
* @author Jelle De Loecker
|
|
1333
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1289
1334
|
* @since 0.0.1
|
|
1290
|
-
* @version 1.3.
|
|
1335
|
+
* @version 1.3.22
|
|
1291
1336
|
*
|
|
1292
|
-
* @param
|
|
1293
|
-
* @param
|
|
1337
|
+
* @param {string} id The object id
|
|
1338
|
+
* @param {Function} callback
|
|
1294
1339
|
*
|
|
1295
|
-
* @return
|
|
1340
|
+
* @return {Pledge}
|
|
1296
1341
|
*/
|
|
1297
1342
|
Model.setMethod(function remove(id, callback) {
|
|
1298
1343
|
|
|
@@ -1313,12 +1358,33 @@ Model.setMethod(function remove(id, callback) {
|
|
|
1313
1358
|
id = String(id);
|
|
1314
1359
|
}
|
|
1315
1360
|
|
|
1316
|
-
let query = {
|
|
1317
|
-
|
|
1361
|
+
let query = {
|
|
1362
|
+
[this.primary_key] : id,
|
|
1363
|
+
};
|
|
1364
|
+
|
|
1365
|
+
let has_remove_events = typeof this.beforeRemove == 'function' || typeof this.afterRemove == 'function' || this.listeners('removed').length;
|
|
1366
|
+
let doc;
|
|
1367
|
+
let tasks = [];
|
|
1318
1368
|
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1369
|
+
if (has_remove_events) {
|
|
1370
|
+
|
|
1371
|
+
// Get the actual document
|
|
1372
|
+
tasks.push(async next => {
|
|
1373
|
+
doc = await this.findByPk(id);
|
|
1374
|
+
|
|
1375
|
+
if (!doc) {
|
|
1376
|
+
return next(new Error('Unable to find document with id ' + id));
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
next();
|
|
1380
|
+
});
|
|
1381
|
+
|
|
1382
|
+
tasks.push(next => {
|
|
1383
|
+
this.callOrNext('beforeRemove', [doc], next);
|
|
1384
|
+
});
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
Function.series(tasks, function done(err) {
|
|
1322
1388
|
|
|
1323
1389
|
if (err) {
|
|
1324
1390
|
pledge.reject(err);
|
|
@@ -1330,10 +1396,13 @@ Model.setMethod(function remove(id, callback) {
|
|
|
1330
1396
|
if (err != null) {
|
|
1331
1397
|
return pledge.reject(err);
|
|
1332
1398
|
}
|
|
1333
|
-
|
|
1334
|
-
|
|
1399
|
+
|
|
1400
|
+
if (has_remove_events) {
|
|
1401
|
+
that.issueEvent('removed', [doc, result], () => pledge.resolve(result));
|
|
1402
|
+
} else {
|
|
1335
1403
|
pledge.resolve(result);
|
|
1336
|
-
}
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1337
1406
|
});
|
|
1338
1407
|
});
|
|
1339
1408
|
|
|
@@ -1343,7 +1412,7 @@ Model.setMethod(function remove(id, callback) {
|
|
|
1343
1412
|
/**
|
|
1344
1413
|
* Get all the records and perform the given task on them
|
|
1345
1414
|
*
|
|
1346
|
-
* @author Jelle De Loecker <jelle@
|
|
1415
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1347
1416
|
* @since 0.5.0
|
|
1348
1417
|
* @version 1.2.0
|
|
1349
1418
|
*
|
|
@@ -1440,7 +1509,7 @@ Model.setMethod(function eachRecord(options, task, callback) {
|
|
|
1440
1509
|
/**
|
|
1441
1510
|
* Strip out private fields
|
|
1442
1511
|
*
|
|
1443
|
-
* @author Jelle De Loecker <jelle@
|
|
1512
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1444
1513
|
* @since 1.0.0
|
|
1445
1514
|
* @version 1.0.0
|
|
1446
1515
|
*
|
|
@@ -1481,7 +1550,7 @@ Model.setMethod(function removePrivateFields(records) {
|
|
|
1481
1550
|
/**
|
|
1482
1551
|
* Create an export stream
|
|
1483
1552
|
*
|
|
1484
|
-
* @author Jelle De Loecker <jelle@
|
|
1553
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1485
1554
|
* @since 1.0.5
|
|
1486
1555
|
* @version 1.0.5
|
|
1487
1556
|
*
|
|
@@ -1531,7 +1600,7 @@ Model.setMethod(function exportToStream(output, options) {
|
|
|
1531
1600
|
/**
|
|
1532
1601
|
* Import from a stream
|
|
1533
1602
|
*
|
|
1534
|
-
* @author Jelle De Loecker <jelle@
|
|
1603
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1535
1604
|
* @since 1.0.5
|
|
1536
1605
|
* @version 1.0.5
|
|
1537
1606
|
*
|
|
@@ -1704,99 +1773,44 @@ Model.setMethod(function importFromStream(input, options) {
|
|
|
1704
1773
|
/**
|
|
1705
1774
|
* Get a model
|
|
1706
1775
|
*
|
|
1707
|
-
* @author Jelle De Loecker
|
|
1776
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1708
1777
|
* @since 0.0.1
|
|
1709
|
-
* @version 1.
|
|
1778
|
+
* @version 1.4.0
|
|
1710
1779
|
*
|
|
1711
|
-
* @param
|
|
1712
|
-
* @param
|
|
1780
|
+
* @param {string} name
|
|
1781
|
+
* @param {boolean} init
|
|
1713
1782
|
*
|
|
1714
|
-
* @return
|
|
1783
|
+
* @return {Model}
|
|
1715
1784
|
*/
|
|
1716
1785
|
Model.get = function get(name, init, options) {
|
|
1717
1786
|
|
|
1718
|
-
|
|
1719
|
-
namespace,
|
|
1720
|
-
pieces,
|
|
1721
|
-
path,
|
|
1722
|
-
obj;
|
|
1723
|
-
|
|
1724
|
-
if (typeof name == 'function') {
|
|
1725
|
-
name = name.name;
|
|
1726
|
-
}
|
|
1727
|
-
|
|
1728
|
-
if (!name) {
|
|
1729
|
-
throw new TypeError('Model name should be a non-empty string');
|
|
1730
|
-
}
|
|
1731
|
-
|
|
1732
|
-
if (init && typeof init == 'object') {
|
|
1787
|
+
if (typeof init != 'boolean') {
|
|
1733
1788
|
options = init;
|
|
1734
1789
|
init = true;
|
|
1735
1790
|
}
|
|
1736
1791
|
|
|
1737
|
-
|
|
1738
|
-
options = {};
|
|
1739
|
-
}
|
|
1740
|
-
|
|
1741
|
-
if (nameCache[name]) {
|
|
1742
|
-
if (init === false) {
|
|
1743
|
-
return nameCache[name];
|
|
1744
|
-
} else {
|
|
1745
|
-
return new nameCache[name];
|
|
1746
|
-
}
|
|
1747
|
-
}
|
|
1748
|
-
|
|
1749
|
-
pieces = name.split('.');
|
|
1750
|
-
|
|
1751
|
-
if (pieces.length > 1) {
|
|
1752
|
-
// The first part is the namespace
|
|
1753
|
-
namespace = pieces.shift();
|
|
1754
|
-
|
|
1755
|
-
// The rest should be the path
|
|
1756
|
-
path = pieces.join('.');
|
|
1757
|
-
|
|
1758
|
-
obj = Classes[namespace];
|
|
1759
|
-
|
|
1760
|
-
if (!obj) {
|
|
1761
|
-
if (init === false) {
|
|
1762
|
-
return null;
|
|
1763
|
-
}
|
|
1764
|
-
|
|
1765
|
-
throw new TypeError('Namespace "' + namespace + '" could not be found');
|
|
1766
|
-
}
|
|
1767
|
-
} else {
|
|
1768
|
-
path = name;
|
|
1769
|
-
obj = Classes.Alchemy.Model;
|
|
1770
|
-
}
|
|
1771
|
-
|
|
1772
|
-
constructor = Object.path(obj, path) || obj[String(path).modelName()];
|
|
1792
|
+
let path = Blast.parseClassPath(name);
|
|
1773
1793
|
|
|
1774
|
-
|
|
1775
|
-
if (init === false) {
|
|
1776
|
-
return null;
|
|
1777
|
-
}
|
|
1794
|
+
let constructor = Object.path(Blast.Classes.Alchemy.Model, path) || Object.path(Blast.Classes, path);
|
|
1778
1795
|
|
|
1779
|
-
|
|
1796
|
+
if (!constructor) {
|
|
1797
|
+
throw new Error('Model "' + name + '" could not be found');
|
|
1780
1798
|
}
|
|
1781
1799
|
|
|
1782
|
-
|
|
1783
|
-
// so we don't have to perform the expensive #modelName() method again
|
|
1784
|
-
nameCache[name] = constructor;
|
|
1785
|
-
|
|
1786
|
-
if (init === false) {
|
|
1800
|
+
if (!init) {
|
|
1787
1801
|
return constructor;
|
|
1788
|
-
} else {
|
|
1789
|
-
return new constructor;
|
|
1790
1802
|
}
|
|
1803
|
+
|
|
1804
|
+
return new constructor(options);
|
|
1791
1805
|
};
|
|
1792
1806
|
|
|
1793
1807
|
/**
|
|
1794
1808
|
* Make the base Model class a global
|
|
1795
1809
|
*
|
|
1796
|
-
* @author Jelle De Loecker
|
|
1810
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
1797
1811
|
* @since 0.0.1
|
|
1798
1812
|
* @version 0.2.0
|
|
1799
1813
|
*
|
|
1800
|
-
* @type
|
|
1814
|
+
* @type {Object}
|
|
1801
1815
|
*/
|
|
1802
|
-
|
|
1816
|
+
DEFINE('Model', Model);
|