mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
210 lines (192 loc) • 7.18 kB
text/typescript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {createSelector} from 'reselect';
import {getCurrentChannelId} from 'selectors/entities/common';
import {
getMySystemPermissions,
getMySystemRoles,
getRoles,
PermissionsOptions,
} from 'selectors/entities/roles_helpers';
import {getTeamMemberships, getCurrentTeamId} from 'selectors/entities/teams';
import {Role} from 'types/roles';
import {GlobalState} from 'types/store';
import {Dictionary} from 'types/utilities';
export {getMySystemPermissions, getMySystemRoles, getRoles};
export const getMyTeamRoles: (state: GlobalState) => Dictionary<Set<string>> = createSelector(
getTeamMemberships,
(teamsMemberships) => {
const roles: Dictionary<Set<string>> = {};
if (teamsMemberships) {
for (const key in teamsMemberships) {
if (teamsMemberships.hasOwnProperty(key) && teamsMemberships[key].roles) {
roles[key] = new Set<string>(teamsMemberships[key].roles.split(' '));
}
}
}
return roles;
},
);
export const getMyChannelRoles: (state: GlobalState) => Dictionary<Set<string>> = createSelector(
(state: GlobalState) => state.entities.channels.myMembers,
(channelsMemberships) => {
const roles: Dictionary<Set<string>> = {};
if (channelsMemberships) {
for (const key in channelsMemberships) {
if (channelsMemberships.hasOwnProperty(key) && channelsMemberships[key].roles) {
roles[key] = new Set<string>(channelsMemberships[key].roles.split(' '));
}
}
}
return roles;
},
);
export const getMyRoles: (state: GlobalState) => {
system: Set<string>;
team: Dictionary<Set<string>>;
channel: Dictionary<Set<string>>;
} = createSelector(
getMySystemRoles,
getMyTeamRoles,
getMyChannelRoles,
(systemRoles, teamRoles, channelRoles) => {
return {
system: systemRoles,
team: teamRoles,
channel: channelRoles,
};
},
);
export const getRolesById: (state: GlobalState) => Dictionary<Role> = createSelector(
getRoles,
(rolesByName) => {
const rolesById: Dictionary<Role> = {};
for (const role of Object.values(rolesByName)) {
rolesById[role.id] = role;
}
return rolesById;
},
);
export const getMyCurrentTeamPermissions: (state: GlobalState) => Set<string> = createSelector(
getMyTeamRoles,
getRoles,
getMySystemPermissions,
getCurrentTeamId,
(myTeamRoles, roles, systemPermissions, teamId) => {
const permissions = new Set<string>();
if (myTeamRoles[teamId]) {
for (const roleName of myTeamRoles[teamId]) {
if (roles[roleName]) {
for (const permission of roles[roleName].permissions) {
permissions.add(permission);
}
}
}
}
for (const permission of systemPermissions) {
permissions.add(permission);
}
return permissions;
},
);
export const getMyCurrentChannelPermissions: (state: GlobalState) => Set<string> = createSelector(
getMyChannelRoles,
getRoles,
getMyCurrentTeamPermissions,
getCurrentChannelId,
(myChannelRoles, roles, teamPermissions, channelId) => {
const permissions = new Set<string>();
if (myChannelRoles[channelId]) {
for (const roleName of myChannelRoles[channelId]) {
if (roles[roleName]) {
for (const permission of roles[roleName].permissions) {
permissions.add(permission);
}
}
}
}
for (const permission of teamPermissions) {
permissions.add(permission);
}
return permissions;
},
);
export const getMyTeamPermissions: (state: GlobalState, options: PermissionsOptions) => Set<string> = createSelector(
getMyTeamRoles,
getRoles,
getMySystemPermissions,
(state: GlobalState, options: PermissionsOptions) => options.team,
(myTeamRoles, roles, systemPermissions, teamId) => {
const permissions = new Set<string>();
if (myTeamRoles[teamId!]) {
for (const roleName of myTeamRoles[teamId!]) {
if (roles[roleName]) {
for (const permission of roles[roleName].permissions) {
permissions.add(permission);
}
}
}
}
for (const permission of systemPermissions) {
permissions.add(permission);
}
return permissions;
},
);
export const getMyChannelPermissions: (state: GlobalState, options: PermissionsOptions) => Set<string> = createSelector(
getMyChannelRoles,
getRoles,
getMyTeamPermissions,
(state, options: PermissionsOptions) => options.channel,
(myChannelRoles, roles, teamPermissions, channelId) => {
const permissions = new Set<string>();
if (myChannelRoles[channelId!]) {
for (const roleName of myChannelRoles[channelId!]) {
if (roles[roleName]) {
for (const permission of roles[roleName].permissions) {
permissions.add(permission);
}
}
}
}
for (const permission of teamPermissions) {
permissions.add(permission);
}
return permissions;
},
);
export const haveISystemPermission: (state: GlobalState, options: PermissionsOptions) => boolean = createSelector(
getMySystemPermissions,
(state: GlobalState, options: PermissionsOptions) => options.permission,
(permissions, permission) => {
return permissions.has(permission);
},
);
export const haveITeamPermission: (state: GlobalState, options: PermissionsOptions) => boolean = createSelector(
getMyTeamPermissions,
(state, options) => options.permission,
(permissions, permission) => {
return permissions.has(permission);
},
);
export const haveIChannelPermission: (state: GlobalState, options: PermissionsOptions) => boolean = createSelector(
getMyChannelPermissions,
(state, options) => options.permission,
(permissions, permission) => {
return permissions.has(permission);
},
);
export const haveICurrentTeamPermission: (state: GlobalState, options: PermissionsOptions) => boolean = createSelector(
getMyCurrentTeamPermissions,
(state: GlobalState, options: PermissionsOptions) => options.permission,
(permissions, permission) => {
return permissions.has(permission);
},
);
export const haveICurrentChannelPermission: (state: GlobalState, options: PermissionsOptions) => boolean = createSelector(
getMyCurrentChannelPermissions,
(state: GlobalState, options: PermissionsOptions) => options.permission,
(permissions, permission) => {
return permissions.has(permission);
},
);