diff --git a/modules/forums/server/controllers/forums.server.controller.js b/modules/forums/server/controllers/forums.server.controller.js index ad94c19b..6e60eaf7 100644 --- a/modules/forums/server/controllers/forums.server.controller.js +++ b/modules/forums/server/controllers/forums.server.controller.js @@ -125,6 +125,81 @@ exports.read = function (req, res) { res.json(req.forum); }; +/** + * forumsSearch + * @param req + * @param res + */ +exports.forumsSearch = function (req, res) { + var condition = {}; + var keysA = []; + var skip = 0; + var limit = 0; + + if (req.body.skip !== undefined) { + skip = parseInt(req.body.skip, 10); + } + if (req.body.limit !== undefined) { + limit = parseInt(req.body.limit, 10); + } + + if (req.body.keys && req.body.keys.length > 0) { + var keysS = req.body.keys + ''; + var keysT = keysS.split(' '); + + keysT.forEach(function (it) { + var ti = new RegExp(it, 'i'); + keysA.push(ti); + }); + } + + if (req.body.forumId) { + condition.forum = req.body.forumId + } + if (keysA.length > 0) { + condition.$or = [ + {title: {'$all': keysA}}, + {content: {'$all': keysA}}, + {'_replies.content': {'$all': keysA}} + ]; + } + + var countQuery = function (callback) { + Topic.count(condition, function (err, count) { + if (err) { + callback(err, null); + } else { + callback(null, count); + } + }); + }; + + var findQuery = function (callback) { + Topic.find(condition) + .sort('-lastReplyAt -createdAt') + .populate('user', 'username displayName profileImageURL uploaded downloaded') + .populate('lastUser', 'username displayName profileImageURL uploaded downloaded') + .populate('forum', 'name category') + .skip(skip) + .limit(limit) + .exec(function (err, topics) { + if (err) { + callback(err, null); + } else { + callback(null, topics); + } + }); + }; + + async.parallel([countQuery, findQuery], function (err, results) { + if (err) { + return res.status(422).send(err); + } else { + res.json({rows: results[1], total: results[0]}); + } + }); +}; + /** * listTopics * @param req diff --git a/modules/forums/server/policies/forums.server.policy.js b/modules/forums/server/policies/forums.server.policy.js index 17e5257e..4119419d 100644 --- a/modules/forums/server/policies/forums.server.policy.js +++ b/modules/forums/server/policies/forums.server.policy.js @@ -22,6 +22,7 @@ exports.invokeRolesPolicies = function () { {resources: '/api/attach/upload', permissions: '*'}, {resources: '/api/attach/:topicId', permissions: '*'}, {resources: '/api/attach/:topicId/:replyId', permissions: '*'}, + {resources: '/api/forums/search', permissions: '*'}, {resources: '/api/forums/:forumId', permissions: '*'}, {resources: '/api/topics/:forumId', permissions: '*'}, {resources: '/api/topics/:forumId/:topicId', permissions: '*'}, diff --git a/modules/forums/server/routes/forums.server.routes.js b/modules/forums/server/routes/forums.server.routes.js index 430cb52c..2161fd7e 100644 --- a/modules/forums/server/routes/forums.server.routes.js +++ b/modules/forums/server/routes/forums.server.routes.js @@ -21,6 +21,9 @@ module.exports = function (app) { app.route('/api/attach/:topicId/:replyId').all(forumsPolicy.isAllowed) .get(forums.attachDownload); + app.route('/api/forums/search').all(forumsPolicy.isAllowed) + .put(forums.forumsSearch); + app.route('/api/forums/:forumId').all(forumsPolicy.isAllowed) .get(forums.read);