Files
NodeBB/src/controllers/helpers.js

181 lines
4.5 KiB
JavaScript
Raw Normal View History

2014-11-15 23:22:57 -05:00
'use strict';
var nconf = require('nconf');
var async = require('async');
var validator = require('validator');
2016-07-11 13:03:47 +03:00
var winston = require('winston');
2016-11-03 13:06:21 +03:00
var user = require('../user');
var privileges = require('../privileges');
var categories = require('../categories');
var plugins = require('../plugins');
var meta = require('../meta');
2017-05-12 17:53:23 -04:00
var middleware = require('../middleware');
2014-11-15 23:22:57 -05:00
2017-05-12 17:53:23 -04:00
var helpers = module.exports;
2014-11-15 23:22:57 -05:00
helpers.notAllowed = function (req, res, error) {
2016-06-22 14:58:46 -04:00
plugins.fireHook('filter:helpers.notAllowed', {
req: req,
res: res,
2017-02-17 19:31:21 -07:00
error: error,
2017-02-18 15:05:36 -07:00
}, function (err) {
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/, ''),
loggedIn: !!req.uid,
error: error,
2017-02-17 19:31:21 -07:00
title: '[[global:403.title]]',
2016-06-22 14:58:46 -04:00
});
} else {
2017-05-12 17:53:23 -04:00
middleware.buildHeader(req, res, function () {
res.status(403).render('403', {
path: req.path,
loggedIn: !!req.uid,
error: error,
title: '[[global:403.title]]',
});
2016-06-22 14:58:46 -04:00
});
}
2017-02-18 14:32:35 -07:00
} else if (res.locals.isAPI) {
req.session.returnTo = nconf.get('relative_path') + req.url.replace(/^\/api/, '');
res.status(401).json('not-authorized');
2014-11-15 23:22:57 -05:00
} else {
2017-02-18 14:32:35 -07:00
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
};
helpers.redirect = function (res, url) {
2015-03-09 18:22:44 -04:00
if (res.locals.isAPI) {
2017-07-05 11:36:35 -04:00
res.set('X-Redirect', encodeURI(url)).status(200).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
}
};
helpers.buildCategoryBreadcrumbs = function (cid, callback) {
var breadcrumbs = [];
async.whilst(function () {
return parseInt(cid, 10);
}, function (next) {
2017-05-29 17:12:02 -04:00
categories.getCategoryFields(cid, ['name', 'slug', 'parentCid', 'disabled', 'isSection'], function (err, data) {
if (err) {
return next(err);
}
2017-05-29 17:12:02 -04:00
if (!parseInt(data.disabled, 10) && !parseInt(data.isSection, 10)) {
breadcrumbs.unshift({
text: validator.escape(String(data.name)),
2017-02-17 19:31:21 -07:00
url: nconf.get('relative_path') + '/category/' + data.slug,
});
}
cid = data.parentCid;
next();
});
}, function (err) {
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]]',
2017-02-17 19:31:21 -07:00
url: nconf.get('relative_path') + '/categories',
2016-04-21 11:40:40 -04:00
});
}
2015-01-29 01:06:48 -05:00
breadcrumbs.unshift({
text: '[[global:home]]',
2017-02-17 19:31:21 -07:00
url: nconf.get('relative_path') + '/',
});
2015-01-29 01:06:48 -05:00
callback(null, breadcrumbs);
});
};
helpers.buildBreadcrumbs = function (crumbs) {
2015-01-29 01:06:48 -05:00
var breadcrumbs = [
{
text: '[[global:home]]',
2017-02-17 19:31:21 -07:00
url: nconf.get('relative_path') + '/',
},
2015-01-29 01:06:48 -05: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);
}
});
2015-01-29 01:06:48 -05:00
return breadcrumbs;
};
2014-11-15 23:22:57 -05:00
helpers.buildTitle = function (pageTitle) {
2015-09-23 01:59:13 -04:00
var titleLayout = meta.config.titleLayout || '{pageTitle} | {browserTitle}';
var browserTitle = validator.escape(String(meta.config.browserTitle || meta.config.title || 'NodeBB'));
2015-09-23 01:59:13 -04:00
pageTitle = pageTitle || '';
var title = titleLayout.replace('{pageTitle}', function () {
2016-03-22 11:19:33 +02:00
return pageTitle;
}).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, '');
});
2017-02-18 12:30:49 -07:00
next(null, { categories: categoriesData, selectedCategory: selectedCategory });
2017-02-17 19:31:21 -07:00
},
2016-11-03 13:06:21 +03:00
], callback);
};
function recursive(category, categoriesData, level) {
category.level = level;
categoriesData.push(category);
category.children.forEach(function (child) {
recursive(child, categoriesData, '    ' + level);
});
}