mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
158 lines (157 loc) • 8.12 kB
JavaScript
;
// 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);
}