From b2fc4d5dc4855d7ef0d74b49044a76d3ed00c80d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 13 Feb 2015 18:16:36 -0500 Subject: [PATCH] #2002 --- src/controllers/categories.js | 71 +++++++++++++++++- src/controllers/index.js | 108 ++++++--------------------- src/controllers/templates.js | 90 ++++++++++++++++++++++ src/routes/api.js | 64 +--------------- src/routes/index.js | 1 + src/views/admin/settings/general.tpl | 14 ++++ 6 files changed, 200 insertions(+), 148 deletions(-) create mode 100644 src/controllers/templates.js diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 25690a6810..9ef288272c 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -3,6 +3,7 @@ var categoriesController = {}, async = require('async'), nconf = require('nconf'), + validator = require('validator'), privileges = require('../privileges'), user = require('../user'), categories = require('../categories'), @@ -22,7 +23,7 @@ categoriesController.recent = function(req, res, next) { } data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; - data['rssFeedUrl'] = nconf.get('relative_path') + '/recent.rss'; + data.rssFeedUrl = nconf.get('relative_path') + '/recent.rss'; data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[recent:title]]'}]); res.render('recent', data); }); @@ -92,6 +93,72 @@ categoriesController.unreadTotal = function(req, res, next) { }); }; +categoriesController.list = function(req, res, next) { + async.parallel({ + header: function (next) { + res.locals.metaTags = [{ + name: "title", + content: validator.escape(meta.config.title || 'NodeBB') + }, { + name: "description", + content: validator.escape(meta.config.description || '') + }, { + property: 'og:title', + content: 'Index | ' + validator.escape(meta.config.title || 'NodeBB') + }, { + property: 'og:type', + content: 'website' + }]; + + if(meta.config['brand:logo']) { + res.locals.metaTags.push({ + property: 'og:image', + content: meta.config['brand:logo'] + }); + } + + next(null); + }, + categories: function (next) { + var uid = req.user ? req.user.uid : 0; + categories.getCategoriesByPrivilege(uid, 'find', function (err, categoryData) { + if (err) { + return next(err); + } + var childCategories = []; + + for(var i=categoryData.length - 1; i>=0; --i) { + + if (Array.isArray(categoryData[i].children) && categoryData[i].children.length) { + childCategories.push.apply(childCategories, categoryData[i].children); + } + + if (categoryData[i].parent && categoryData[i].parent.cid) { + categoryData.splice(i, 1); + } + } + + async.parallel([ + function(next) { + categories.getRecentTopicReplies(categoryData, uid, next); + }, + function(next) { + categories.getRecentTopicReplies(childCategories, uid, next); + } + ], function(err) { + next(err, categoryData); + }); + }); + } + }, function (err, data) { + if (err) { + return next(err); + } + // TODO: template should be called categories.tpl + res.render('home', data); + }); +}; + categoriesController.get = function(req, res, next) { var cid = req.params.category_id, page = req.query.page || 1, @@ -259,7 +326,7 @@ categoriesController.get = function(req, res, next) { data.currentPage = page; data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; - data['rssFeedUrl'] = nconf.get('relative_path') + '/category/' + data.cid + '.rss'; + data.rssFeedUrl = nconf.get('relative_path') + '/category/' + data.cid + '.rss'; data.pagination = pagination.create(data.currentPage, data.pageCount); data.pagination.rel.forEach(function(rel) { diff --git a/src/controllers/index.js b/src/controllers/index.js index ff337250f4..805ba52d20 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -1,21 +1,10 @@ "use strict"; -var topicsController = require('./topics'), - categoriesController = require('./categories'), - tagsController = require('./tags'), - searchController = require('./search'), - usersController = require('./users'), - groupsController = require('./groups'), - accountsController = require('./accounts'), - staticController = require('./static'), - apiController = require('./api'), - adminController = require('./admin'), - helpers = require('./helpers'), - - async = require('async'), +var async = require('async'), nconf = require('nconf'), validator = require('validator'), winston = require('winston'), + auth = require('../routes/authentication'), meta = require('../meta'), user = require('../user'), @@ -23,85 +12,32 @@ var topicsController = require('./topics'), topics = require('../topics'), plugins = require('../plugins'), categories = require('../categories'), - privileges = require('../privileges'); + privileges = require('../privileges'), + helpers = require('./helpers'); var Controllers = { - topics: topicsController, - categories: categoriesController, - tags: tagsController, - search: searchController, - users: usersController, - groups: groupsController, - accounts: accountsController, - static: staticController, - api: apiController, - admin: adminController + topics: require('./topics'), + categories: require('./categories'), + tags: require('./tags'), + search: require('./search'), + users: require('./users'), + groups: require('./groups'), + accounts: require('./accounts'), + static: require('./static'), + api: require('./api'), + admin: require('./admin'), }; Controllers.home = function(req, res, next) { - async.parallel({ - header: function (next) { - res.locals.metaTags = [{ - name: "title", - content: validator.escape(meta.config.title || 'NodeBB') - }, { - name: "description", - content: validator.escape(meta.config.description || '') - }, { - property: 'og:title', - content: 'Index | ' + validator.escape(meta.config.title || 'NodeBB') - }, { - property: 'og:type', - content: 'website' - }]; - - if(meta.config['brand:logo']) { - res.locals.metaTags.push({ - property: 'og:image', - content: meta.config['brand:logo'] - }); - } - - next(null); - }, - categories: function (next) { - var uid = req.user ? req.user.uid : 0; - categories.getCategoriesByPrivilege(uid, 'find', function (err, categoryData) { - if (err) { - return next(err); - } - var childCategories = []; - - for(var i=categoryData.length - 1; i>=0; --i) { - - if (Array.isArray(categoryData[i].children) && categoryData[i].children.length) { - childCategories.push.apply(childCategories, categoryData[i].children); - } - - if (categoryData[i].parent && categoryData[i].parent.cid) { - categoryData.splice(i, 1); - } - } - - async.parallel([ - function(next) { - categories.getRecentTopicReplies(categoryData, uid, next); - }, - function(next) { - categories.getRecentTopicReplies(childCategories, uid, next); - } - ], function(err) { - next(err, categoryData); - }); - }); - } - }, function (err, data) { - if (err) { - return next(err); - } - res.render('home', data); - }); + var route = meta.config.homePageRoute || 'home'; + if (route === 'home') { + return Controllers.categories.list(req, res, next); + } else if (route === 'recent') { + Controllers.categories.recent(req, res, next); + } else if (route === 'popular') { + Controllers.categories.popular(req, res, next); + } }; Controllers.reset = function(req, res, next) { diff --git a/src/controllers/templates.js b/src/controllers/templates.js new file mode 100644 index 0000000000..311f1d37a7 --- /dev/null +++ b/src/controllers/templates.js @@ -0,0 +1,90 @@ +"use strict"; + +var async = require('async'), + nconf = require('nconf'), + fs = require('fs'), + path = require('path'), + meta = require('../meta'), + plugins = require('../plugins'), + utils = require('../../public/src/utils'), + templatesController = {}; + + +var availableTemplatesCache = null; +var configCache = null; + +templatesController.getTemplatesListing = function(req, res, next) { + async.parallel({ + availableTemplates: function(next) { + getAvailableTemplates(next); + }, + templatesConfig: function(next) { + async.waterfall([ + function(next) { + readConfigFile(next); + }, + function(config, next) { + config.custom_mapping['^/?$'] = meta.config.homePageRoute || 'home'; + + plugins.fireHook('filter:templates.get_config', config, next); + } + ], next); + }, + }, function(err, results) { + if (err) { + return next(err); + } + + res.json(results); + }); +}; + +function readConfigFile(callback) { + if (configCache) { + return callback(null, configCache); + } + fs.readFile(path.join(nconf.get('views_dir'), 'config.json'), function(err, config) { + if (err) { + return callback(err); + } + try { + config = JSON.parse(config.toString()); + } catch (err) { + return callback(err); + } + configCache = config; + callback(null, config); + }); +} + +function getAvailableTemplates(callback) { + if (availableTemplatesCache) { + return callback(null, availableTemplatesCache); + } + + async.parallel({ + views: function(next) { + utils.walk(nconf.get('views_dir'), next); + }, + extended: function(next) { + plugins.fireHook('filter:templates.get_virtual', [], next); + } + }, function(err, results) { + if (err) { + return callback(err); + } + var availableTemplates = results.views.filter(function(value, index, self) { + return value && self.indexOf(value) === index; + }).map(function(el) { + return el && el.replace(nconf.get('views_dir') + '/', ''); + }); + + availableTemplatesCache = availableTemplates = availableTemplates.concat(results.extended); + callback(null, availableTemplates) + }); + +} + + + +module.exports = templatesController; diff --git a/src/routes/api.js b/src/routes/api.js index da281280cc..47632ccce7 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -1,17 +1,11 @@ "use strict"; -var path = require('path'), - async = require('async'), - fs = require('fs'), - nconf = require('nconf'), - express = require('express'), +var express = require('express'), posts = require('../posts'), categories = require('../categories'), - plugins = require('../plugins'), - utils = require('../../public/src/utils'), - uploadsController = require('../controllers/uploads'); - + uploadsController = require('../controllers/uploads'), + templatesController = require('../controllers/templates'); module.exports = function(app, middleware, controllers) { @@ -22,7 +16,7 @@ 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('/get_templates_listing', getTemplatesListing); + router.get('/get_templates_listing', templatesController.getTemplatesListing); router.get('/categories/:cid/moderators', getModerators); router.get('/recent/posts/:term?', getRecentPosts); @@ -40,56 +34,6 @@ function getModerators(req, res, next) { }); } -var templatesListingCache = {}; - -function getTemplatesListing(req, res, next) { - if (templatesListingCache.availableTemplates && templatesListingCache.templatesConfig) { - return res.json(templatesListingCache); - } - - async.parallel({ - views: function(next) { - utils.walk(nconf.get('views_dir'), next); - }, - extended: function(next) { - plugins.fireHook('filter:templates.get_virtual', [], next); - }, - config: function(next) { - fs.readFile(path.join(nconf.get('views_dir'), 'config.json'), function(err, config) { - if (err) { - return next(err); - } - - try { - config = JSON.parse(config.toString()); - } catch (err) { - return next(err); - } - - plugins.fireHook('filter:templates.get_config', config, next); - }); - }, - }, function(err, results) { - if (err) { - return next(err); - } - - var data = results.views.filter(function(value, index, self) { - return value && self.indexOf(value) === index; - }).map(function(el) { - return el && el.replace(nconf.get('views_dir') + '/', ''); - }); - - data = data.concat(results.extended); - - templatesListingCache = { - availableTemplates: data, - templatesConfig: results.config - }; - - res.json(templatesListingCache); - }); -} function getRecentPosts(req, res, next) { var uid = (req.user) ? req.user.uid : 0; diff --git a/src/routes/index.js b/src/routes/index.js index f8012c9456..94767dcc36 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -50,6 +50,7 @@ function tagRoutes(app, middleware, controllers) { } function categoryRoutes(app, middleware, controllers) { + setupPageRoute(app, '/categories', middleware, [], controllers.categories.list); setupPageRoute(app, '/popular/:term?', middleware, [], controllers.categories.popular); setupPageRoute(app, '/recent', middleware, [], controllers.categories.recent); setupPageRoute(app, '/unread', middleware, [middleware.authenticate], controllers.categories.unread); diff --git a/src/views/admin/settings/general.tpl b/src/views/admin/settings/general.tpl index 5c35ea8542..66a27dee61 100644 --- a/src/views/admin/settings/general.tpl +++ b/src/views/admin/settings/general.tpl @@ -28,6 +28,20 @@ +
+
Home Page
+
+
+ + +
+
+
+
Site Logo