You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/routes/plugins.js

186 lines
4.6 KiB
JavaScript

"use strict";
var _ = require('underscore'),
nconf = require('nconf'),
path = require('path'),
fs = require('fs'),
11 years ago
validator = require('validator'),
async = require('async'),
plugins = require('../plugins'),
pluginRoutes = [];
function setupPluginRoutes(app) {
var custom_routes = {
'routes': [],
'api': [],
'templates': []
};
plugins.ready(function() {
/*
* TO BE DEPRECATED post 0.4x and replaced with something that isn't as complicated as this...
*/
/*plugins.fireHook('filter:server.create_routes', custom_routes, function(err, custom_routes) {
var route,
routes = custom_routes.routes;
pluginRoutes = custom_routes;
for (route in routes) {
if (routes.hasOwnProperty(route)) {
(function(route) {
app[routes[route].method || 'get'](routes[route].route, function(req, res) {
routes[route].options(req, res, function(options) {
app.build_header({
req: options.req || req,
res: options.res || res
}, function (err, header) {
//res.send(header + options.content + templates.footer);
});
});
});
}(route));
}
}
var apiRoutes = custom_routes.api;
for (route in apiRoutes) {
if (apiRoutes.hasOwnProperty(route)) {
(function(route) {
app[apiRoutes[route].method || 'get']('/api' + apiRoutes[route].route, function(req, res) {
apiRoutes[route].callback(req, res, function(data) {
res.json(data);
});
});
}(route));
}
}
var templateRoutes = custom_routes.templates;
for (route in templateRoutes) {
if (templateRoutes.hasOwnProperty(route)) {
(function(route) {
app.get('/templates/' + templateRoutes[route].template, function(req, res) {
res.send(templateRoutes[route].content);
});
}(route));
}
}
});*/
});
}
function setupPluginAdminRoutes(app) {
var custom_routes = {
'routes': [],
'api': []
};
plugins.ready(function() {
/*
* TO BE DEPRECATED post 0.4x and replaced with something that isn't as complicated as this...
*/
/*plugins.fireHook('filter:admin.create_routes', custom_routes, function(err, custom_routes) {
var route, routes = custom_routes.routes;
for (route in routes) {
if (routes.hasOwnProperty(route)) {
(function(route) {
app[routes[route].method || 'get']('/admin' + routes[route].route, function(req, res) {
routes[route].options(req, res, function(options) {
Admin.buildHeader(req, res, function (err, header) {
res.send(header + options.content + templates['admin/footer']);
});
});
});
}(route));
}
}
11 years ago
var apiRoutes = custom_routes.api;
for (route in apiRoutes) {
if (apiRoutes.hasOwnProperty(route)) {
(function(route) {
app[apiRoutes[route].method || 'get']('/api/admin' + apiRoutes[route].route, function(req, res) {
apiRoutes[route].callback(req, res, function(data) {
res.json(data);
});
});
}(route));
}
}
});*/
});
}
module.exports = function(app, middleware, controllers) {
/**
* GET/PUT /plugins/fireHook to be deprecated after 0.4.x
*
*/
app.get('/plugins/fireHook', function(req, res) {
// GET = filter
plugins.fireHook('filter:' + req.query.hook, req.query.args, function(err, returnData) {
if (typeof returnData === 'object') {
res.json(200, returnData);
} else {
res.send(200, validator.escape(returnData));
}
});
});
app.put('/plugins/fireHook', function(req, res) {
// PUT = action
var hook = 'action:' + req.body.hook;
if (plugins.hasListeners(hook)) {
// Hook executes
plugins.fireHook(hook, req.body.args);
}
res.send(200);
});
// Static Assets
app.get('/plugins/:id/*', function(req, res) {
var relPath = req._parsedUrl.pathname.replace(nconf.get('relative_path') + '/plugins/', ''),
matches = _.map(plugins.staticDirs, function(realPath, mappedPath) {
if (relPath.match(mappedPath)) {
return mappedPath;
} else {
return null;
}
}).filter(function(a) { return a; });
if (matches) {
async.map(matches, function(mappedPath, next) {
var filePath = path.join(plugins.staticDirs[mappedPath], decodeURIComponent(relPath.slice(mappedPath.length)));
fs.exists(filePath, function(exists) {
if (exists) {
next(null, filePath);
} else {
next();
}
});
}, function(err, matches) {
// Filter out the nulls
matches = matches.filter(function(a) {
return a;
});
if (matches.length) {
res.sendfile(matches[0]);
} else {
res.redirect('/404');
}
});
} else {
res.redirect('/404');
}
});
setupPluginRoutes(app);
setupPluginAdminRoutes(app);
};