mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Support multiple stores in context sidebar
This commit is contained in:
@@ -17,18 +17,58 @@
|
||||
var log;
|
||||
var redNodes;
|
||||
var util;
|
||||
var settings;
|
||||
|
||||
function exportContextStore(scope,ctx, store, result, callback) {
|
||||
ctx.keys(store,function(err, keys) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
result[store] = {};
|
||||
var c = keys.length;
|
||||
if (c === 0) {
|
||||
callback(null);
|
||||
} else {
|
||||
keys.forEach(function(key) {
|
||||
ctx.get(key,store,function(err, v) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
if (scope !== 'global' ||
|
||||
store === redNodes.listContextStores().default ||
|
||||
!settings.hasOwnProperty("functionGlobalContext") ||
|
||||
!settings.functionGlobalContext.hasOwnProperty(key) ||
|
||||
settings.functionGlobalContext[key] !== v) {
|
||||
result[store][key] = util.encodeObject({msg:v});
|
||||
}
|
||||
c--;
|
||||
if (c === 0) {
|
||||
callback(null);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
init: function(runtime) {
|
||||
redNodes = runtime.nodes;
|
||||
log = runtime.log;
|
||||
util = runtime.util;
|
||||
settings = runtime.settings;
|
||||
},
|
||||
|
||||
get: function(req,res) {
|
||||
var scope = req.params.scope;
|
||||
var id = req.params.id;
|
||||
var key = req.params[0];
|
||||
var availableStores = redNodes.listContextStores();
|
||||
//{ default: 'default', stores: [ 'default', 'file' ] }
|
||||
var store = req.query['store'];
|
||||
if (store && availableStores.stores.indexOf(store) === -1) {
|
||||
return res.status(404).end();
|
||||
}
|
||||
var ctx;
|
||||
if (scope === 'global') {
|
||||
ctx = redNodes.getContext('global');
|
||||
@@ -42,28 +82,49 @@ module.exports = {
|
||||
}
|
||||
if (ctx) {
|
||||
if (key) {
|
||||
ctx.get(key,function(err, v) {
|
||||
res.json(util.encodeObject({msg:v}));
|
||||
store = store || availableStores.default;
|
||||
ctx.get(key,store,function(err, v) {
|
||||
var encoded = util.encodeObject({msg:v});
|
||||
if (store !== availableStores.default) {
|
||||
encoded.store = store;
|
||||
}
|
||||
res.json(encoded);
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
ctx.keys(function(err, keys) {
|
||||
var result = {};
|
||||
var c = keys.length;
|
||||
if (c === 0) {
|
||||
res.json(result);
|
||||
} else {
|
||||
keys.forEach(function(key) {
|
||||
ctx.get(key,function(err, v) {
|
||||
result[key] = util.encodeObject({msg:v});
|
||||
c--;
|
||||
if (c === 0) {
|
||||
res.json(result);
|
||||
var stores;
|
||||
if (!store) {
|
||||
stores = availableStores.stores;
|
||||
} else {
|
||||
stores = [store];
|
||||
}
|
||||
|
||||
var result = {};
|
||||
var c = stores.length;
|
||||
var errorReported = false;
|
||||
stores.forEach(function(store) {
|
||||
exportContextStore(scope,ctx,store,result,function(err) {
|
||||
if (err) {
|
||||
// TODO: proper error reporting
|
||||
if (!errorReported) {
|
||||
errorReported = true;
|
||||
res.end(400);
|
||||
}
|
||||
return;
|
||||
}
|
||||
c--;
|
||||
if (c === 0) {
|
||||
if (!errorReported) {
|
||||
if (stores.length > 1 && scope === 'global') {
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
res.json(result);
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
|
||||
}
|
||||
} else {
|
||||
res.json({});
|
||||
|
Reference in New Issue
Block a user