-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathcomponents.js
92 lines (81 loc) · 2.44 KB
/
components.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
'use strict';
const _ = require('lodash'),
composer = require('./composer'),
uid = require('../uid'),
files = require('../files'),
models = require('./models'),
dbOps = require('./db-operations'),
{ getComponentName, replaceVersion } = require('clayutils');
/**
* @param {string} uri
* @param {object} [locals]
* @returns {Promise}
*/
function get(uri, locals) {
const name = getComponentName(uri),
model = name && files.getComponentModule(name),
callComponentHooks = _.get(locals, 'hooks') !== 'false',
reqExtension = _.get(locals, 'extension'),
renderModel = reqExtension && files.getComponentModule(name, reqExtension),
executeRender = model && _.isFunction(model.render) && callComponentHooks;
return models.get(model, renderModel, executeRender, uri, locals);
}
/**
* Given a component uri, its data and the locals
* check if there exists a model.js file for the
* component.
*
* If yes, run the model.js. If not, turn the component
* data into ops.
*
* @param {String} uri
* @param {String} data
* @param {Object} [locals]
* @returns {Promise}
*/
function put(uri, data, locals) {
let model = files.getComponentModule(getComponentName(uri)),
callHooks = _.get(locals, 'hooks') !== 'false',
result;
if (model && _.isFunction(model.save) && callHooks) {
result = models.put(model, uri, data, locals);
} else {
result = dbOps.putDefaultBehavior(uri, data);
}
return result;
}
/**
*
* @param {String} uri
* @param {Object} data
* @param {Object} [locals]
* @returns {Promise}
*/
function publish(uri, data, locals) {
if (data && _.size(data) > 0) {
return dbOps.cascadingPut(put)(uri, data, locals);
}
return get(replaceVersion(uri), locals)
.then(latestData => composer.resolveComponentReferences(latestData, locals, composer.filterBaseInstanceReferences))
.then(versionedData => dbOps.cascadingPut(put)(uri, versionedData, locals));
}
/**
* @param {String} uri
* @param {Object} data
* @param {Object} [locals]
* @returns {Promise}
*/
function post(uri, data, locals) {
uri += '/' + uid.get();
return dbOps.cascadingPut(put)(uri, data, locals)
.then(result => {
result._ref = uri;
return result;
});
}
// outsiders can act on components too
module.exports.get = get;
module.exports.put = dbOps.cascadingPut(put); // special: could lead to multiple put operations
module.exports.publish = publish;
module.exports.post = post;
module.exports.cmptPut = put;