diff --git a/red/api/index.js b/red/api/index.js index a84751573..6e0239e4e 100644 --- a/red/api/index.js +++ b/red/api/index.js @@ -126,12 +126,12 @@ function init(_server,_runtime) { adminApp.get("/nodes",needsPermission("nodes.read"),nodes.getAll,errorHandler); adminApp.post("/nodes",needsPermission("nodes.write"),nodes.post,errorHandler); - adminApp.get("/nodes/:mod",needsPermission("nodes.read"),nodes.getModule,errorHandler); - adminApp.put("/nodes/:mod",needsPermission("nodes.write"),nodes.putModule,errorHandler); - adminApp.delete("/nodes/:mod",needsPermission("nodes.write"),nodes.delete,errorHandler); + adminApp.get(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.read"),nodes.getModule,errorHandler); + adminApp.put(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.putModule,errorHandler); + adminApp.delete(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,needsPermission("nodes.write"),nodes.delete,errorHandler); - adminApp.get("/nodes/:mod/:set",needsPermission("nodes.read"),nodes.getSet,errorHandler); - adminApp.put("/nodes/:mod/:set",needsPermission("nodes.write"),nodes.putSet,errorHandler); + adminApp.get(/\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.read"),nodes.getSet,errorHandler); + adminApp.put(/\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,needsPermission("nodes.write"),nodes.putSet,errorHandler); adminApp.get('/credentials/:type/:id', needsPermission("credentials.read"),credentials.get,errorHandler); diff --git a/red/api/nodes.js b/red/api/nodes.js index c9de8e109..e5f9d8168 100644 --- a/red/api/nodes.js +++ b/red/api/nodes.js @@ -87,7 +87,7 @@ module.exports = { res.status(400).json({error:"settings_unavailable", message:"Settings unavailable"}); return; } - var mod = req.params.mod; + var mod = req.params[0]; try { var promise = null; var module = redNodes.getModuleInfo(mod); @@ -114,7 +114,7 @@ module.exports = { }, getSet: function(req,res) { - var id = req.params.mod + "/" + req.params.set; + var id = req.params[0] + "/" + req.params[2]; var result = null; if (req.get("accept") === "application/json") { result = redNodes.getNodeInfo(id); @@ -140,7 +140,7 @@ module.exports = { }, getModule: function(req,res) { - var module = req.params.mod; + var module = req.params[0]; var result = redNodes.getModuleInfo(module); if (result) { log.audit({event: "nodes.module.get",module:module},req); @@ -163,7 +163,7 @@ module.exports = { res.status(400).json({error:"invalid_request", message:"Invalid request"}); return; } - var id = req.params.mod + "/" + req.params.set; + var id = req.params[0] + "/" + req.params[2]; try { var node = redNodes.getNodeInfo(id); var info; @@ -195,7 +195,7 @@ module.exports = { res.status(400).json({error:"invalid_request", message:"Invalid request"}); return; } - var mod = req.params.mod; + var mod = req.params[0]; try { var module = redNodes.getModuleInfo(mod); if (!module) { diff --git a/red/runtime/nodes/registry/registry.js b/red/runtime/nodes/registry/registry.js index dd4f094c4..aa1e73e2e 100644 --- a/red/runtime/nodes/registry/registry.js +++ b/red/runtime/nodes/registry/registry.js @@ -67,11 +67,13 @@ function filterNodeInfo(n) { function getModule(id) { - return id.split("/")[0]; + var parts = id.split("/"); + return parts.slice(0,parts.length-1).join("/"); } function getNode(id) { - return id.split("/")[1]; + var parts = id.split("/"); + return parts[parts.length-1]; } function saveNodeList() { diff --git a/test/red/api/nodes_spec.js b/test/red/api/nodes_spec.js index 98305216a..84c8a1503 100644 --- a/test/red/api/nodes_spec.js +++ b/test/red/api/nodes_spec.js @@ -44,10 +44,10 @@ describe("nodes api", function() { app.use(bodyParser.json()); app.get("/nodes",nodes.getAll); app.post("/nodes",nodes.post); - app.get("/nodes/:mod",nodes.getModule); - app.get("/nodes/:mod/:set",nodes.getSet); - app.put("/nodes/:mod",nodes.putModule); - app.put("/nodes/:mod/:set",nodes.putSet); + app.get(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,nodes.getModule); + app.get(/\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,nodes.getSet); + app.put(/\/nodes\/((@[^\/]+\/)?[^\/]+)$/,nodes.putModule); + app.put(/\/nodes\/((@[^\/]+\/)?[^\/]+)\/([^\/]+)$/,nodes.putSet); app.delete("/nodes/:id",nodes.delete); sinon.stub(comms,"publish"); sinon.stub(locales,"determineLangFromHeaders", function() {