diff --git a/src/controllers/api.js b/src/controllers/api.js index cc51bfce52..6f3563ceae 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -1,12 +1,18 @@ "use strict"; -var meta = require('./../meta'), - user = require('./../user'), - plugins = require('./../plugins'), - widgets = require('../widgets'), - +var async = require('async'), validator = require('validator'), - nconf = require('nconf'); + nconf = require('nconf'), + + meta = require('../meta'), + user = require('../user'), + posts = require('../posts'), + topics = require('../topics'), + categories = require('../categories'), + privileges = require('../privileges'), + plugins = require('../plugins'), + helpers = require('./helpers'), + widgets = require('../widgets'); var apiController = {}; @@ -126,4 +132,37 @@ apiController.renderWidgets = function(req, res, next) { }); }; +apiController.getObject = function(req, res, next) { + var methods = { + post: { + canRead: privileges.posts.can, + data: posts.getPostData + }, + topic: { + canRead: privileges.topics.can, + data: topics.getTopicData + }, + category: { + canRead: privileges.categories.can, + data: categories.getCategoryData + } + }; + if (!methods[req.params.type]) { + return next(); + } + async.parallel({ + canRead: async.apply(methods[req.params.type].canRead, 'read', req.params.id, req.uid), + data: async.apply(methods[req.params.type].data, req.params.id) + }, function (err, results) { + if (err || !results.data) { + return next(err); + } + if (!results.canRead) { + return helpers.notAllowed(req, res); + } + res.json(results.data); + }); +}; + + module.exports = apiController; diff --git a/src/controllers/index.js b/src/controllers/index.js index 0b99fea291..eb1f0d334b 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -15,7 +15,6 @@ var async = require('async'), helpers = require('./helpers'); var Controllers = { - posts: require('./posts'), topics: require('./topics'), categories: require('./categories'), unread: require('./unread'), diff --git a/src/controllers/posts.js b/src/controllers/posts.js deleted file mode 100644 index a2bbfab226..0000000000 --- a/src/controllers/posts.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; - -var async = require('async'), - - posts = require('../posts'), - privileges = require('../privileges'), - helpers = require('./helpers'), - postsController = {}; - -postsController.getPost = function(req, res, next) { - async.parallel({ - canRead: function(next) { - privileges.posts.can('read', req.params.pid, req.uid, next); - }, - postData: function(next) { - posts.getPostData(req.params.pid, next); - } - }, function(err, results) { - if (err) { - return next(err); - } - if (!results.postData) { - return helpers.notFound(req, res); - } - if (!results.canRead) { - return helpers.notAllowed(req, res); - } - - res.json(results.postData); - }); -}; - - - -module.exports = postsController; diff --git a/src/routes/api.js b/src/routes/api.js index dec27ea2d4..7528c7b917 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -15,7 +15,10 @@ module.exports = function(app, middleware, controllers) { router.get('/widgets/render', controllers.api.renderWidgets); router.get('/user/uid/:uid', middleware.checkGlobalPrivacySettings, controllers.accounts.getUserByUID); - router.get('/post/:pid', controllers.posts.getPost); + router.get('/:type/pid/:id', controllers.api.getObject); + router.get('/:type/tid/:id', controllers.api.getObject); + router.get('/:type/cid/:id', controllers.api.getObject); + router.get('/categories/:cid/moderators', getModerators); router.get('/recent/posts/:term?', getRecentPosts); router.get('/unread/total', middleware.authenticate, controllers.unread.unreadTotal);