UNPKG

mattermost-redux

Version:

Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client

158 lines (157 loc) 8.12 kB
"use strict"; // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. Object.defineProperty(exports, "__esModule", { value: true }); exports.haveIGroupPermission = exports.getRolesById = exports.getMyTeamRoles = exports.getGroupListPermissions = exports.getMyGroupRoles = exports.getGroupMemberships = exports.haveISystemPermission = exports.getRoles = exports.getMySystemRoles = exports.getMySystemPermissions = void 0; exports.getMyChannelRoles = getMyChannelRoles; exports.haveITeamPermission = haveITeamPermission; exports.haveIChannelPermission = haveIChannelPermission; exports.haveICurrentTeamPermission = haveICurrentTeamPermission; exports.haveICurrentChannelPermission = haveICurrentChannelPermission; const constants_1 = require("mattermost-redux/constants"); const create_selector_1 = require("mattermost-redux/selectors/create_selector"); const common_1 = require("mattermost-redux/selectors/entities/common"); const roles_helpers_1 = require("mattermost-redux/selectors/entities/roles_helpers"); const teams_1 = require("mattermost-redux/selectors/entities/teams"); const group_utils_1 = require("mattermost-redux/utils/group_utils"); // Re-define these types to ensure that these are typed correctly when mattermost-redux is published exports.getMySystemPermissions = roles_helpers_1.getMySystemPermissions; exports.getMySystemRoles = roles_helpers_1.getMySystemRoles; exports.getRoles = roles_helpers_1.getRoles; exports.haveISystemPermission = roles_helpers_1.haveISystemPermission; exports.getGroupMemberships = (0, create_selector_1.createSelector)('getGroupMemberships', (state) => state.entities.groups.myGroups, common_1.getCurrentUserId, (myGroupIDs, currentUserID) => { const groupMemberships = {}; myGroupIDs.forEach((groupID) => { groupMemberships[groupID] = { user_id: currentUserID, roles: constants_1.General.CUSTOM_GROUP_USER_ROLE }; }); return groupMemberships; }); exports.getMyGroupRoles = (0, create_selector_1.createSelector)('getMyGroupRoles', exports.getGroupMemberships, (groupMemberships) => { const roles = {}; if (groupMemberships) { for (const key in groupMemberships) { if (Object.hasOwn(groupMemberships, key) && groupMemberships[key].roles) { roles[key] = new Set(groupMemberships[key].roles.split(' ')); } } } return roles; }); /** * Returns a map of permissions, keyed by group id, for all groups that are mentionable and not deleted. */ exports.getGroupListPermissions = (0, create_selector_1.createSelector)('getGroupListPermissions', exports.getMyGroupRoles, exports.getRoles, exports.getMySystemPermissions, (state) => state.entities.groups.groups, (myGroupRoles, roles, systemPermissions, allGroups) => { const groups = Object.entries(allGroups).filter((entry) => (entry[1].allow_reference)).map((entry) => entry[1]); const permissions = new Set(); groups.forEach((group) => { const roleNames = myGroupRoles[group.id]; if (roleNames) { for (const roleName of roleNames) { if (roles[roleName]) { for (const permission of roles[roleName].permissions) { permissions.add(permission); } } } } }); for (const permission of systemPermissions) { permissions.add(permission); } const groupPermissionsMap = {}; groups.forEach((g) => { groupPermissionsMap[g.id] = { can_delete: permissions.has(constants_1.Permissions.DELETE_CUSTOM_GROUP) && !(0, group_utils_1.isSyncableSource)(g.source) && g.delete_at === 0, can_manage_members: permissions.has(constants_1.Permissions.MANAGE_CUSTOM_GROUP_MEMBERS) && !(0, group_utils_1.isSyncableSource)(g.source) && g.delete_at === 0, can_restore: permissions.has(constants_1.Permissions.RESTORE_CUSTOM_GROUP) && !(0, group_utils_1.isSyncableSource)(g.source) && g.delete_at !== 0, }; }); return groupPermissionsMap; }); exports.getMyTeamRoles = (0, create_selector_1.createSelector)('getMyTeamRoles', teams_1.getTeamMemberships, (teamsMemberships) => { const roles = {}; if (teamsMemberships) { for (const key in teamsMemberships) { if (Object.hasOwn(teamsMemberships, key) && teamsMemberships[key].roles) { roles[key] = new Set(teamsMemberships[key].roles.split(' ')); } } } return roles; }); function getMyChannelRoles(state) { return state.entities.channels.roles; } exports.getRolesById = (0, create_selector_1.createSelector)('getRolesById', exports.getRoles, (rolesByName) => { const rolesById = {}; for (const role of Object.values(rolesByName)) { rolesById[role.id] = role; } return rolesById; }); const getMyPermissionsByTeam = (0, create_selector_1.createSelector)('getMyPermissionsByTeam', exports.getMyTeamRoles, exports.getRoles, (myTeamRoles, allRoles) => { const permissionsByTeam = {}; for (const [teamId, roles] of Object.entries(myTeamRoles)) { permissionsByTeam[teamId] = (0, roles_helpers_1.getPermissionsForRoles)(allRoles, roles); } return permissionsByTeam; }); const getMyPermissionsByGroup = (0, create_selector_1.createSelector)('getMyPermissionsByGroup', exports.getMyGroupRoles, exports.getRoles, (myGroupRoles, allRoles) => { const permissionsByGroup = {}; for (const [groupId, roles] of Object.entries(myGroupRoles)) { permissionsByGroup[groupId] = (0, roles_helpers_1.getPermissionsForRoles)(allRoles, roles); } return permissionsByGroup; }); const getMyPermissionsByChannel = (0, create_selector_1.createSelector)('getMyPermissionsByChannel', getMyChannelRoles, exports.getRoles, (myChannelRoles, allRoles) => { const permissionsByChannel = {}; for (const [channelId, roles] of Object.entries(myChannelRoles)) { permissionsByChannel[channelId] = (0, roles_helpers_1.getPermissionsForRoles)(allRoles, roles); } return permissionsByChannel; }); function haveITeamPermission(state, teamId, permission) { if ((0, exports.getMySystemPermissions)(state).has(permission)) { return true; } if (!teamId) { return false; } return getMyPermissionsByTeam(state)[teamId]?.has(permission); } exports.haveIGroupPermission = (0, create_selector_1.createSelector)('haveIGroupPermission', exports.getMySystemPermissions, getMyPermissionsByGroup, (state, groupID) => state.entities.groups.groups[groupID], (state, groupID, permission) => permission, (systemPermissions, permissionGroups, group, permission) => { if (permission === constants_1.Permissions.RESTORE_CUSTOM_GROUP) { if ((!(0, group_utils_1.isSyncableSource)(group.source) && group.delete_at !== 0) && (systemPermissions.has(permission) || (permissionGroups[group.id] && permissionGroups[group.id].has(permission)))) { return true; } return false; } if ((0, group_utils_1.isSyncableSource)(group.source) || group.delete_at !== 0) { return false; } if (systemPermissions.has(permission)) { return true; } if (permissionGroups[group.id] && permissionGroups[group.id].has(permission)) { return true; } return false; }); function haveIChannelPermission(state, teamId, channelId, permission) { if ((0, exports.getMySystemPermissions)(state).has(permission)) { return true; } if (teamId && getMyPermissionsByTeam(state)[teamId]?.has(permission)) { return true; } if (channelId && getMyPermissionsByChannel(state)[channelId]?.has(permission)) { return true; } return false; } function haveICurrentTeamPermission(state, permission) { return haveITeamPermission(state, (0, teams_1.getCurrentTeamId)(state), permission); } function haveICurrentChannelPermission(state, permission) { return haveIChannelPermission(state, (0, teams_1.getCurrentTeamId)(state), (0, common_1.getCurrentChannelId)(state), permission); }