diff --git a/src/controllers/admin/groups.js b/src/controllers/admin/groups.js index 1a7dc950c7..a1a7c6fd1c 100644 --- a/src/controllers/admin/groups.js +++ b/src/controllers/admin/groups.js @@ -42,7 +42,6 @@ groupsController.get = async function (req, res, next) { if (!group || groupName === groups.BANNED_USERS) { return next(); } - group.isOwner = true; const groupNameData = groupNames.map(name => ({ encodedName: encodeURIComponent(name), diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 3cdb435f9c..6a21610748 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -72,7 +72,6 @@ groupsController.details = async function (req, res, next) { if (!groupData) { return next(); } - groupData.isOwner = groupData.isOwner || isAdmin || (isGlobalMod && !groupData.system); res.render('groups/details', { title: `[[pages:group, ${groupData.displayName}]]`, diff --git a/src/groups/index.js b/src/groups/index.js index ec92f05fb1..7faf8d692a 100644 --- a/src/groups/index.js +++ b/src/groups/index.js @@ -3,6 +3,7 @@ const user = require('../user'); const db = require('../database'); const plugins = require('../plugins'); +const privileges = require('../privileges'); const slugify = require('../slugify'); const Groups = module.exports; @@ -130,30 +131,37 @@ Groups.get = async function (groupName, options) { stop = (parseInt(options.userListCount, 10) || 4) - 1; } - const [groupData, members, pending, invited, isMember, isPending, isInvited, isOwner] = await Promise.all([ + const [groupData, members, isMember, isPending, isInvited, isOwner, isAdmin, isGlobalMod] = await Promise.all([ Groups.getGroupData(groupName), Groups.getOwnersAndMembers(groupName, options.uid, 0, stop), - Groups.getPending(groupName), - Groups.getInvites(groupName), Groups.isMember(options.uid, groupName), Groups.isPending(options.uid, groupName), Groups.isInvited(options.uid, groupName), Groups.ownership.isOwner(options.uid, groupName), + privileges.admin.can('admin:groups', options.uid), + user.isGlobalModerator(options.uid), ]); if (!groupData) { return null; } + + groupData.isOwner = isOwner || isAdmin || (isGlobalMod && !groupData.system); + if (groupData.isOwner) { + ([groupData.pending, groupData.invited] = await Promise.all([ + Groups.getPending(groupName), + Groups.getInvites(groupName), + ])); + } + + const descriptionParsed = await plugins.hooks.fire('filter:parse.raw', String(groupData.description || '')); groupData.descriptionParsed = descriptionParsed; groupData.members = members; groupData.membersNextStart = stop + 1; - groupData.pending = pending.filter(Boolean); - groupData.invited = invited.filter(Boolean); groupData.isMember = isMember; groupData.isPending = isPending; groupData.isInvited = isInvited; - groupData.isOwner = isOwner; const results = await plugins.hooks.fire('filter:group.get', { group: groupData }); return results.group; }; diff --git a/src/groups/user.js b/src/groups/user.js index 4238296a37..d3911f07aa 100644 --- a/src/groups/user.js +++ b/src/groups/user.js @@ -4,13 +4,10 @@ const db = require('../database'); const user = require('../user'); module.exports = function (Groups) { - Groups.getUsersFromSet = async function (set, fields) { + Groups.getUsersFromSet = async function (set, fields = []) { const uids = await db.getSetMembers(set); - - if (fields) { - return await user.getUsersFields(uids, fields); - } - return await user.getUsersData(uids); + const userData = await user.getUsersFields(uids, fields); + return userData.filter(u => u && u.uid); }; Groups.getUserGroups = async function (uids) {