mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 19:15:58 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			246 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var topicsController = require('./topics'),
 | |
| 	categoriesController = require('./categories'),
 | |
| 	usersController = require('./users'),
 | |
| 	accountsController = require('./accounts'),
 | |
| 	staticController = require('./static'),
 | |
| 	apiController = require('./api'),
 | |
| 	adminController = require('./admin'),
 | |
| 
 | |
| 	async = require('async'),
 | |
| 	nconf = require('nconf'),
 | |
| 	auth = require('./../routes/authentication'),
 | |
| 	meta = require('./../meta'),
 | |
| 	user = require('./../user'),
 | |
| 	plugins = require('./../plugins'),
 | |
| 	categories = require('./../categories'),
 | |
| 	categoryTools = require('./../categoryTools');
 | |
| 
 | |
| 
 | |
| 
 | |
| var Controllers = {
 | |
| 	topics: topicsController,
 | |
| 	categories: categoriesController,
 | |
| 	users: usersController,
 | |
| 	accounts: accountsController,
 | |
| 	static: staticController,
 | |
| 	api: apiController,
 | |
| 	admin: adminController
 | |
| };
 | |
| 
 | |
| 
 | |
| Controllers.home = function(req, res, next) {
 | |
| 	async.parallel({
 | |
| 		header: function (next) {
 | |
| 			res.locals.metaTags = [{
 | |
| 				name: "title",
 | |
| 				content: meta.config.title || 'NodeBB'
 | |
| 			}, {
 | |
| 				name: "description",
 | |
| 				content: meta.config.description || ''
 | |
| 			}, {
 | |
| 				property: 'og:title',
 | |
| 				content: 'Index | ' + (meta.config.title || 'NodeBB')
 | |
| 			}, {
 | |
| 				property: "og:type",
 | |
| 				content: 'website'
 | |
| 			}];
 | |
| 
 | |
| 			next(null);
 | |
| 		},
 | |
| 		categories: function (next) {
 | |
| 			var uid = (req.user) ? req.user.uid : 0;
 | |
| 			categories.getAllCategories(uid, function (err, data) {
 | |
| 				data.categories = data.categories.filter(function (category) {
 | |
| 					return !category.disabled;
 | |
| 				});
 | |
| 
 | |
| 				function canSee(category, next) {
 | |
| 					categoryTools.privileges(category.cid, ((req.user) ? req.user.uid || 0 : 0), function(err, privileges) {
 | |
| 						next(!err && privileges.read);
 | |
| 					});
 | |
| 				}
 | |
| 
 | |
| 				function getRecentReplies(category, callback) {
 | |
| 					categories.getRecentReplies(category.cid, uid, parseInt(category.numRecentReplies, 10), function (err, posts) {
 | |
| 						category.posts = posts;
 | |
| 						category.post_count = posts.length > 2 ? 2 : posts.length; // this was a hack to make metro work back in the day, post_count should just = length
 | |
| 						callback(null);
 | |
| 					});
 | |
| 				}
 | |
| 
 | |
| 				async.filter(data.categories, canSee, function(visibleCategories) {
 | |
| 					data.categories = visibleCategories;
 | |
| 
 | |
| 					async.each(data.categories, getRecentReplies, function (err) {
 | |
| 						next(err, data.categories);
 | |
| 					});
 | |
| 				});
 | |
| 			});
 | |
| 		}
 | |
| 	}, function (err, data) {
 | |
| 		if (res.locals.isAPI) {
 | |
| 			res.json(data);
 | |
| 		} else {
 | |
| 			res.render('home', data);
 | |
| 		}
 | |
| 	});
 | |
| };
 | |
| 
 | |
| Controllers.search = function(req, res, next) {
 | |
| 	var data = {
 | |
| 		show_no_topics: 'hide',
 | |
| 		show_no_posts: 'hide',
 | |
| 		show_results: 'hide',
 | |
| 		search_query: '',
 | |
| 		posts: [],
 | |
| 		topics: []
 | |
| 	};
 | |
| 
 | |
| 	if (res.locals.isAPI) {
 | |
| 		res.json(data);
 | |
| 	} else {
 | |
| 		res.render('search', data);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| Controllers.reset = function(req, res, next) {
 | |
| 	var data = {
 | |
| 		reset_code: req.params.code ? req.params.code : null
 | |
| 	}
 | |
| 
 | |
| 	if (res.locals.isAPI) {
 | |
| 		res.json(data);
 | |
| 	} else {
 | |
| 		res.render('reset', data);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| Controllers.login = function(req, res, next) {
 | |
| 	var data = {},
 | |
| 		login_strategies = auth.get_login_strategies(),
 | |
| 		num_strategies = login_strategies.length,
 | |
| 		emailersPresent = plugins.hasListeners('action:email.send');
 | |
| 
 | |
| 	if (num_strategies === 0) {
 | |
| 		data = {
 | |
| 			'login_window:spansize': 'col-md-12',
 | |
| 			'alternate_logins': false
 | |
| 		};
 | |
| 	} else {
 | |
| 		data = {
 | |
| 			'login_window:spansize': 'col-md-6',
 | |
| 			'alternate_logins': true
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	data.authentication = login_strategies;
 | |
| 	data.token = res.locals.csrf_token;
 | |
| 	data.showResetLink = emailersPresent;
 | |
| 
 | |
| 	if (res.locals.isAPI) {
 | |
| 		res.json(data);
 | |
| 	} else {
 | |
| 		res.render('login', data);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| Controllers.register = function(req, res, next) {
 | |
| 	var data = {},
 | |
| 		login_strategies = auth.get_login_strategies(),
 | |
| 		num_strategies = login_strategies.length;
 | |
| 
 | |
| 	if (num_strategies === 0) {
 | |
| 		data = {
 | |
| 			'register_window:spansize': 'col-md-12',
 | |
| 			'alternate_logins': false
 | |
| 		};
 | |
| 	} else {
 | |
| 		data = {
 | |
| 			'register_window:spansize': 'col-md-6',
 | |
| 			'alternate_logins': true
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	data.authentication = login_strategies;
 | |
| 
 | |
| 	data.token = res.locals.csrf_token;
 | |
| 	data.minimumUsernameLength = meta.config.minimumUsernameLength;
 | |
| 	data.maximumUsernameLength = meta.config.maximumUsernameLength;
 | |
| 	data.minimumPasswordLength = meta.config.minimumPasswordLength;
 | |
| 	data.termsOfUse = meta.config.termsOfUse;
 | |
| 	
 | |
| 	if (res.locals.isAPI) {
 | |
| 		res.json(data);
 | |
| 	} else {
 | |
| 		res.render('register', data);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| 
 | |
| Controllers.confirmEmail = function(req, res, next) {
 | |
| 	user.email.confirm(req.params.code, function (data) {
 | |
| 		if (data.status === 'ok') {
 | |
| 			data = {
 | |
| 				'alert-class': 'alert-success',
 | |
| 				title: 'Email Confirmed',
 | |
| 				text: 'Thank you for vaidating your email. Your account is now fully activated.'
 | |
| 			};
 | |
| 		} else {
 | |
| 			data = {
 | |
| 				'alert-class': 'alert-danger',
 | |
| 				title: 'An error occurred...',
 | |
| 				text: 'There was a problem validating your email address. Perhaps the code was invalid or has expired.'
 | |
| 			};
 | |
| 		}
 | |
| 
 | |
| 		if (res.locals.isAPI) {
 | |
| 			res.json(data);
 | |
| 		} else {
 | |
| 			res.render('confirm', data);
 | |
| 		}
 | |
| 	});
 | |
| };
 | |
| 
 | |
| Controllers.sitemap = function(req, res, next) {
 | |
| 	var sitemap = require('./../sitemap.js');
 | |
| 
 | |
| 	sitemap.render(function(xml) {
 | |
| 		res.header('Content-Type', 'application/xml');
 | |
| 		res.send(xml);
 | |
| 	});
 | |
| };
 | |
| 
 | |
| Controllers.robots = function (req, res) {
 | |
| 	res.set('Content-Type', 'text/plain');
 | |
| 
 | |
| 	if (meta.config["robots.txt"]) {
 | |
| 		res.send(meta.config["robots.txt"]);
 | |
| 	} else {
 | |
| 		res.send("User-agent: *\n" +
 | |
| 			"Disallow: /admin/\n" +
 | |
| 			"Sitemap: " + nconf.get('url') + "/sitemap.xml");
 | |
| 	}
 | |
| };
 | |
| 
 | |
| Controllers.outgoing = function(req, res, next) {
 | |
| 	var url = req.query.url,
 | |
| 		data = {
 | |
| 			url: url,
 | |
| 			title: meta.config.title
 | |
| 		};
 | |
| 
 | |
| 	if (url) {
 | |
| 		if (res.locals.isAPI) {
 | |
| 			res.json(data);
 | |
| 		} else {
 | |
| 			res.render('outgoing', data);
 | |
| 		}
 | |
| 	} else {
 | |
| 		res.status(404);
 | |
| 		res.redirect(nconf.get('relative_path') + '/404');
 | |
| 	}
 | |
| };
 | |
| 
 | |
| module.exports = Controllers; |