Skip to content

Commit

Permalink
feat: #8493, plugin helper for standardised link/button injection
Browse files Browse the repository at this point in the history
  • Loading branch information
samt authored and julianlam committed Aug 7, 2020
1 parent d6297b2 commit 0bbb813
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 83 deletions.
132 changes: 50 additions & 82 deletions src/controllers/accounts/helpers.js
@@ -1,7 +1,6 @@
'use strict';

const validator = require('validator');
const winston = require('winston');
const nconf = require('nconf');

const user = require('../../user');
Expand All @@ -12,6 +11,7 @@ const utils = require('../../utils');
const privileges = require('../../privileges');
const translator = require('../../translator');
const messaging = require('../../messaging');
const { buildLinks } = require('../helpers');

const helpers = module.exports;

Expand Down Expand Up @@ -83,7 +83,55 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID) {
userData['reputation:disabled'] = meta.config['reputation:disabled'] === 1;
userData['downvote:disabled'] = meta.config['downvote:disabled'] === 1;
userData['email:confirmed'] = !!userData['email:confirmed'];
userData.profile_links = filterLinks(results.profile_menu.links, {

const profileMenuLinks = [{
id: 'info',
route: 'info',
name: '[[user:account_info]]',
icon: 'fa-info',
visibility: {
self: false,
other: false,
moderator: false,
globalMod: false,
admin: true,
canViewInfo: true,
},
}, {
id: 'sessions',
route: 'sessions',
name: '[[pages:account/sessions]]',
icon: 'fa-group',
visibility: {
self: true,
other: false,
moderator: false,
globalMod: false,
admin: false,
canViewInfo: false,
},
}];

if (meta.config.gdpr_enabled) {
profileMenuLinks.push({
id: 'consent',
route: 'consent',
name: '[[user:consent.title]]',
icon: 'fa-thumbs-o-up',
visibility: {
self: true,
other: false,
moderator: false,
globalMod: false,
admin: false,
canViewInfo: false,
},
});
}

const { links } = await plugins.fireHook('filter:user.profileMenu', { uid, callerUID, links: profileMenuLinks });

userData.profile_links = await buildLinks('accounts/profile', links, {
self: isSelf,
other: !isSelf,
moderator: isModerator,
Expand Down Expand Up @@ -127,7 +175,6 @@ async function getAllData(uid, callerUID) {
isModerator: user.isModeratorOfAnyCategory(callerUID),
isFollowing: user.isFollowing(callerUID, uid),
ips: user.getIPs(uid, 4),
profile_menu: getProfileMenu(uid, callerUID),
groups: groups.getUserGroups([uid]),
sso: plugins.fireHook('filter:auth.list', { uid: uid, associations: [] }),
canEdit: privileges.users.canEdit(callerUID, uid),
Expand All @@ -138,59 +185,6 @@ async function getAllData(uid, callerUID) {
});
}

async function getProfileMenu(uid, callerUID) {
const links = [{
id: 'info',
route: 'info',
name: '[[user:account_info]]',
icon: 'fa-info',
visibility: {
self: false,
other: false,
moderator: false,
globalMod: false,
admin: true,
canViewInfo: true,
},
}, {
id: 'sessions',
route: 'sessions',
name: '[[pages:account/sessions]]',
icon: 'fa-group',
visibility: {
self: true,
other: false,
moderator: false,
globalMod: false,
admin: false,
canViewInfo: false,
},
}];

if (meta.config.gdpr_enabled) {
links.push({
id: 'consent',
route: 'consent',
name: '[[user:consent.title]]',
icon: 'fa-thumbs-o-up',
visibility: {
self: true,
other: false,
moderator: false,
globalMod: false,
admin: false,
canViewInfo: false,
},
});
}

return await plugins.fireHook('filter:user.profileMenu', {
uid: uid,
callerUID: callerUID,
links: links,
});
}

async function parseAboutMe(userData) {
if (!userData.aboutme) {
userData.aboutme = '';
Expand All @@ -202,30 +196,4 @@ async function parseAboutMe(userData) {
userData.aboutmeParsed = translator.escape(parsed);
}

function filterLinks(links, states) {
return links.filter(function (link, index) {
// "public" is the old property, if visibility is defined, discard `public`
if (link.hasOwnProperty('public') && !link.hasOwnProperty('visibility')) {
winston.warn('[account/profileMenu (' + link.id + ')] Use of the `.public` property is deprecated, use `visibility` now');
return link && (link.public || states.self);
}

// Default visibility
link.visibility = { self: true,
other: true,
moderator: true,
globalMod: true,
admin: true,
canViewInfo: true,
...link.visibility };

var permit = Object.keys(states).some(function (state) {
return states[state] && link.visibility[state];
});

links[index].public = permit;
return permit;
});
}

require('../../promisify')(helpers);
29 changes: 29 additions & 0 deletions src/controllers/helpers.js
@@ -1,5 +1,6 @@
'use strict';

const winston = require('winston');
const nconf = require('nconf');
const validator = require('validator');
const querystring = require('querystring');
Expand Down Expand Up @@ -218,6 +219,34 @@ helpers.buildTitle = function (pageTitle) {
return title;
};

helpers.buildLinks = async function (event, links, states) {
const filtered = await plugins.fireHook(`filter:buildLinks.${event}`, { links, states });

return filtered.links.filter(function (link, index) {
// "public" is the old property, if visibility is defined, discard `public`
if (link.hasOwnProperty('public') && !link.hasOwnProperty('visibility')) {
winston.warn('[account/profileMenu (' + link.id + ')] Use of the `.public` property is deprecated, use `visibility` now');
return link && (link.public || filtered.states.self);
}

// Default visibility
link.visibility = { self: true,
other: true,
moderator: true,
globalMod: true,
admin: true,
canViewInfo: true,
...link.visibility };

var permit = Object.keys(filtered.states).some(function (state) {
return filtered.states[state] && link.visibility[state];
});

filtered.links[index].public = permit;
return permit;
});
};

helpers.getCategories = async function (set, uid, privilege, selectedCid) {
const cids = await categories.getCidsByPrivilege(set, uid, privilege);
return await getCategoryData(cids, uid, selectedCid);
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/hooks.js
Expand Up @@ -6,7 +6,7 @@ const utils = require('../utils');

module.exports = function (Plugins) {
Plugins.deprecatedHooks = {

'filter:user.profileMenu': 'filter:buildLinks.accounts/profile',
};

Plugins.internals = {
Expand Down

0 comments on commit 0bbb813

Please sign in to comment.