| 
									
										
										
										
											2014-11-15 23:22:57 -05:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-05 20:24:03 +03:00
										 |  |  | var nconf = require('nconf'); | 
					
						
							|  |  |  | var async = require('async'); | 
					
						
							|  |  |  | var validator = require('validator'); | 
					
						
							| 
									
										
										
										
											2016-07-11 13:03:47 +03:00
										 |  |  | var winston = require('winston'); | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-03 13:06:21 +03:00
										 |  |  | var user = require('../user'); | 
					
						
							|  |  |  | var privileges = require('../privileges'); | 
					
						
							| 
									
										
										
										
											2016-05-05 20:24:03 +03:00
										 |  |  | var categories = require('../categories'); | 
					
						
							|  |  |  | var plugins = require('../plugins'); | 
					
						
							|  |  |  | var meta = require('../meta'); | 
					
						
							| 
									
										
										
										
											2014-11-15 23:22:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | var helpers = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | helpers.notAllowed = function (req, res, error) { | 
					
						
							| 
									
										
										
										
											2016-06-22 14:58:46 -04:00
										 |  |  | 	plugins.fireHook('filter:helpers.notAllowed', { | 
					
						
							|  |  |  | 		req: req, | 
					
						
							|  |  |  | 		res: res, | 
					
						
							|  |  |  | 		error: error | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	}, function (err, data) { | 
					
						
							| 
									
										
										
										
											2016-07-11 13:03:47 +03:00
										 |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return winston.error(err); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-06-22 14:58:46 -04:00
										 |  |  | 		if (req.uid) { | 
					
						
							|  |  |  | 			if (res.locals.isAPI) { | 
					
						
							|  |  |  | 				res.status(403).json({ | 
					
						
							|  |  |  | 					path: req.path.replace(/^\/api/, ''), | 
					
						
							| 
									
										
										
										
											2016-12-02 14:05:54 +03:00
										 |  |  | 					loggedIn: !!req.uid, | 
					
						
							|  |  |  | 					error: error, | 
					
						
							| 
									
										
										
										
											2016-06-22 14:58:46 -04:00
										 |  |  | 					title: '[[global:403.title]]' | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				res.status(403).render('403', { | 
					
						
							|  |  |  | 					path: req.path, | 
					
						
							| 
									
										
										
										
											2016-12-02 14:05:54 +03:00
										 |  |  | 					loggedIn: !!req.uid, | 
					
						
							|  |  |  | 					error: error, | 
					
						
							| 
									
										
										
										
											2016-06-22 14:58:46 -04:00
										 |  |  | 					title: '[[global:403.title]]' | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-11-15 23:22:57 -05:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2016-06-22 14:58:46 -04:00
										 |  |  | 			if (res.locals.isAPI) { | 
					
						
							|  |  |  | 				req.session.returnTo = nconf.get('relative_path') + req.url.replace(/^\/api/, ''); | 
					
						
							|  |  |  | 				res.status(401).json('not-authorized'); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				req.session.returnTo = nconf.get('relative_path') + req.url; | 
					
						
							|  |  |  | 				res.redirect(nconf.get('relative_path') + '/login'); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-11-15 23:22:57 -05:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-06-22 14:58:46 -04:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-11-15 23:22:57 -05:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | helpers.redirect = function (res, url) { | 
					
						
							| 
									
										
										
										
											2015-03-09 18:22:44 -04:00
										 |  |  | 	if (res.locals.isAPI) { | 
					
						
							| 
									
										
										
										
											2015-09-11 22:50:09 -04:00
										 |  |  | 		res.status(308).json(url); | 
					
						
							| 
									
										
										
										
											2015-03-09 18:22:44 -04:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2016-03-20 15:11:32 -05:00
										 |  |  | 		res.redirect(nconf.get('relative_path') + encodeURI(url)); | 
					
						
							| 
									
										
										
										
											2015-03-09 18:22:44 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | helpers.buildCategoryBreadcrumbs = function (cid, callback) { | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | 	var breadcrumbs = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	async.whilst(function () { | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | 		return parseInt(cid, 10); | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	}, function (next) { | 
					
						
							|  |  |  | 		categories.getCategoryFields(cid, ['name', 'slug', 'parentCid', 'disabled'], function (err, data) { | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return next(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-27 19:08:59 -04:00
										 |  |  | 			if (!parseInt(data.disabled, 10)) { | 
					
						
							|  |  |  | 				breadcrumbs.unshift({ | 
					
						
							| 
									
										
										
										
											2016-08-27 15:45:15 +03:00
										 |  |  | 					text: validator.escape(String(data.name)), | 
					
						
							| 
									
										
										
										
											2015-05-27 19:08:59 -04:00
										 |  |  | 					url: nconf.get('relative_path') + '/category/' + data.slug | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			cid = data.parentCid; | 
					
						
							|  |  |  | 			next(); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	}, function (err) { | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return callback(err); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-21 11:40:40 -04:00
										 |  |  | 		if (!meta.config.homePageRoute && meta.config.homePageCustom) { | 
					
						
							|  |  |  | 			breadcrumbs.unshift({ | 
					
						
							|  |  |  | 				text: '[[global:header.categories]]', | 
					
						
							|  |  |  | 				url: nconf.get('relative_path') + '/categories' | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-29 01:06:48 -05:00
										 |  |  | 		breadcrumbs.unshift({ | 
					
						
							|  |  |  | 			text: '[[global:home]]', | 
					
						
							|  |  |  | 			url: nconf.get('relative_path') + '/' | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-01-29 01:06:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		callback(null, breadcrumbs); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | helpers.buildBreadcrumbs = function (crumbs) { | 
					
						
							| 
									
										
										
										
											2015-01-29 01:06:48 -05:00
										 |  |  | 	var breadcrumbs = [ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			text: '[[global:home]]', | 
					
						
							|  |  |  | 			url: nconf.get('relative_path') + '/' | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	crumbs.forEach(function (crumb) { | 
					
						
							| 
									
										
										
										
											2015-01-29 01:06:48 -05:00
										 |  |  | 		if (crumb) { | 
					
						
							|  |  |  | 			if (crumb.url) { | 
					
						
							|  |  |  | 				crumb.url = nconf.get('relative_path') + crumb.url; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			breadcrumbs.push(crumb); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2015-01-29 01:06:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return breadcrumbs; | 
					
						
							| 
									
										
										
										
											2014-12-11 22:55:00 -05:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-11-15 23:22:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | helpers.buildTitle = function (pageTitle) { | 
					
						
							| 
									
										
										
										
											2015-09-23 01:59:13 -04:00
										 |  |  | 	var titleLayout = meta.config.titleLayout || '{pageTitle} | {browserTitle}'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-27 15:45:15 +03:00
										 |  |  | 	var browserTitle = validator.escape(String(meta.config.browserTitle || meta.config.title || 'NodeBB')); | 
					
						
							| 
									
										
										
										
											2015-09-23 01:59:13 -04:00
										 |  |  | 	pageTitle = pageTitle || ''; | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	var title = titleLayout.replace('{pageTitle}', function () { | 
					
						
							| 
									
										
										
										
											2016-03-22 11:19:33 +02:00
										 |  |  | 		return pageTitle; | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	}).replace('{browserTitle}', function () { | 
					
						
							| 
									
										
										
										
											2016-03-22 11:19:33 +02:00
										 |  |  | 		return browserTitle; | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2015-09-23 01:59:13 -04:00
										 |  |  | 	return title; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-03 13:25:29 +03:00
										 |  |  | helpers.getWatchedCategories = function (uid, selectedCid, callback) { | 
					
						
							| 
									
										
										
										
											2016-11-03 13:06:21 +03:00
										 |  |  | 	async.waterfall([ | 
					
						
							|  |  |  | 		function (next) { | 
					
						
							|  |  |  | 			user.getWatchedCategories(uid, next); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		function (cids, next) { | 
					
						
							|  |  |  | 			privileges.categories.filterCids('read', cids, uid, next); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		function (cids, next) { | 
					
						
							|  |  |  | 			categories.getCategoriesFields(cids, ['cid', 'name', 'slug', 'icon', 'link', 'color', 'bgColor', 'parentCid'], next); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		function (categoryData, next) { | 
					
						
							|  |  |  | 			categoryData = categoryData.filter(function (category) { | 
					
						
							|  |  |  | 				return category && !category.link; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var selectedCategory; | 
					
						
							|  |  |  | 			categoryData.forEach(function (category) { | 
					
						
							|  |  |  | 				category.selected = parseInt(category.cid, 10) === parseInt(selectedCid, 10); | 
					
						
							|  |  |  | 				if (category.selected) { | 
					
						
							|  |  |  | 					selectedCategory = category; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var categoriesData = []; | 
					
						
							|  |  |  | 			var tree = categories.getTree(categoryData, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			tree.forEach(function (category) { | 
					
						
							|  |  |  | 				recursive(category, categoriesData, ''); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			next(null, {categories: categoriesData, selectedCategory: selectedCategory}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	], callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function recursive(category, categoriesData, level) { | 
					
						
							|  |  |  | 	category.level = level; | 
					
						
							|  |  |  | 	categoriesData.push(category); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	category.children.forEach(function (child) { | 
					
						
							|  |  |  | 		recursive(child, categoriesData, '    ' + level); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-20 15:11:32 -05:00
										 |  |  | module.exports = helpers; |