ui/lib/global-admin/addon/accounts/detail/controller.js

121 lines
3.8 KiB
JavaScript

import { inject as service } from '@ember/service';
import Controller from '@ember/controller';
import { get, computed /* , set */ } from '@ember/object';
export default Controller.extend({
router: service(),
sortGlobalBy: 'name',
globalHeaders: [
{
name: 'enabled',
searchField: null,
width: 30
},
{
name: 'name',
sort: ['globalRole.displayName'],
searchField: 'globalRole.displayName',
translationKey: 'accountsPage.detail.table.headers.permission',
},
{
name: 'created',
searchField: null,
sort: ['createdTs'],
translationKey: 'accountsPage.detail.table.headers.created',
width: 200,
},
],
sortClusterBy: 'name',
clusterHeaders: [
{
name: 'clusterName',
searchField: 'cluster.displayName',
sort: ['cluster.displayName', 'project.displayName'],
translationKey: 'accountsPage.detail.table.headers.clusterName',
},
{
name: 'name',
searchField: 'roleTemplate.displayName',
sort: ['roleTemplate.displayNAme'],
translationKey: 'accountsPage.detail.table.headers.role',
},
{
name: 'created',
searchField: null,
sort: ['createdTs'],
translationKey: 'accountsPage.detail.table.headers.created',
width: 200,
},
],
sortProjectBy: 'projectName',
projectHeaders: [
{
name: 'projectName',
searchField: 'project.displayName',
sort: ['project.displayName', 'displayName'],
translationKey: 'accountsPage.detail.table.headers.projectName',
},
{
name: 'name',
searchField: 'roleTemplate.displayName',
sort: ['roleTemplate.displayName', 'project.displayName'],
translationKey: 'accountsPage.detail.table.headers.role',
},
{
name: 'created',
searchField: null,
sort: ['createdTs'],
translationKey: 'accountsPage.detail.table.headers.created',
width: 200,
},
],
hasPermission: function (globalRoleRules, permission) {
return globalRoleRules.find(gRule =>
((get(gRule, 'apiGroups') || []).indexOf('*') > -1 || (get(gRule, 'apiGroups') || []).indexOf(permission.apiGroup) > -1) &&
((get(gRule, 'resources') || []).indexOf('*') > -1 || (get(gRule, 'resources') || []).indexOf(permission.resource) > -1) &&
((get(gRule, 'verbs') || []).indexOf('*') > -1 || (get(gRule, 'verbs') || []).indexOf(permission.verb) > -1));
},
containsRule: function (globalRoleRules, rule) {
const apiGroups = (get(rule, 'apiGroups') || []);
const resources = (get(rule, 'resources') || []);
const verbs = (get(rule, 'verbs') || []);
const permissions = [];
apiGroups.forEach(apiGroup => resources.forEach(resource => verbs.forEach(verb => permissions.push({ apiGroup, resource, verb }))));
return permissions.every(permission => this.hasPermission(globalRoleRules, permission));
},
getEnabledRoles: function (globalRole, out) {
const globalRoleRules = (get(globalRole, 'rules') || []);
return out.filter(r => (get(r, 'role.rules') || []).every(rule => this.containsRule(globalRoleRules, rule)));
},
globalRoleMapping: computed('model.user.globalRoleBindings.[]', 'model.globalRoles', function () {
let out = (get(this, 'model.globalRoles') || []).filterBy('isHidden', false).map(role => {
return { role, enabled: false };
});
(get(this, 'model.user.globalRoleBindings') || []).forEach((binding) => {
const globalRole = get(binding, 'globalRole');
if (get(globalRole, 'isHidden')) {
this.getEnabledRoles(globalRole, out).forEach(r => {
r.enabled = true;
r.binding = binding;
});
} else {
let entry = out.findBy('role', globalRole);
if (entry) {
entry.enabled = true;
entry.binding = binding;
}
}
});
return out;
}),
});