Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 18 additions & 7 deletions src/config/ability.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import {Program} from "@/breeding-insight/model/Program";
type DefinePermissions = (user: User, builder: AbilityBuilder<AppAbility>) => void;

const rolePermissions: Record<string, DefinePermissions> = {
member(user, { can }) {
readonly(user, { can }) {
},
breeder(user, { can }) {
programadministrator(user, { can }) {
can('create', 'ProgramUser');
can('update', 'ProgramUser');
can('archive', 'ProgramUser');
Expand All @@ -41,7 +41,7 @@ const rolePermissions: Record<string, DefinePermissions> = {
can('create', 'ProgramConfiguration');
can('update', 'ProgramConfiguration');
},
admin(user, { can }) {
systemadministrator(user, { can }) {
can('create', 'ProgramUser');
can('update', 'ProgramUser');
can('archive', 'ProgramUser');
Expand All @@ -51,27 +51,38 @@ const rolePermissions: Record<string, DefinePermissions> = {
}
};

//Helper method to convert domain name to associated rolePermissions function
//Necessary as functions depend on no whitespace and present domain names have whitespace
function toRoleFunctionName(domain: String){
return domain.replace(/\s/g, "").toLowerCase();
}

export function defineAbilityFor(user: User | undefined, program: Program | undefined): AppAbility {
const builder = new AbilityBuilder<AppAbility>();

if (user) {
let roleFunctionName = "";
// Check system roles
if (user.roleName) {
if (typeof rolePermissions[user.roleName] === 'function') {
rolePermissions[user.roleName](user, builder);
roleFunctionName = toRoleFunctionName(user.roleName);
if (typeof rolePermissions[roleFunctionName] === 'function') {
rolePermissions[roleFunctionName](user, builder);
}
}

if (program) {
// Check program roles
if (user.programRoles) {
for (const programRole of user.programRoles) {
if (programRole.domain) {
roleFunctionName = toRoleFunctionName(programRole.domain);
}
if (programRole.program && programRole.program.id &&
programRole.program.id === program.id && programRole.domain &&
programRole.active &&
typeof rolePermissions[programRole.domain] === 'function') {
typeof rolePermissions[roleFunctionName] === 'function') {

rolePermissions[programRole.domain](user, builder);
rolePermissions[roleFunctionName](user, builder);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/views/program/ProgramSelection.vue
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<div class="columns">
<div class="column is-narrow">
<div class="buttons is-block">
<template v-if="activeUser && activeUser.hasRole('admin')">
<template v-if="activeUser && activeUser.hasRole('System Administrator')">
<router-link
v-bind:to="{name: 'admin'}"
class="button is-primary is-light is-block is-outlined mr-0"
Expand Down
12 changes: 6 additions & 6 deletions tests/unit/components/program/ProgramUsersTable.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,17 @@ function setup() {
roleDAO.getAll.mockResolvedValue(rolesResponse);

const systemUser = {'id':'1', 'name':'Test user', 'email':'testuser@test.com', 'active':'true',
'systemRoles': [{'id':'1', 'domain':'admin'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'member'}}]};
'systemRoles': [{'id':'1', 'domain':'System Administrator'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'Read Only'}}]};
const systemUser1 = {
'id':'2', 'name':'Test user 2', 'email':'testuser1@test.com', 'active':'true', 'orcid': '123',
'systemRoles': [{'id':'1', 'domain':'admin'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'member'}}]
'systemRoles': [{'id':'1', 'domain':'System Administrator'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'Read Only'}}]
};
const systemUser2 = {
'id':'2', 'name':'Test user 2', 'email':'testuse2@test.com', 'active':'true', 'orcid': '456',
'systemRoles': [{'id':'1', 'domain':'admin'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'member'}}]
'systemRoles': [{'id':'1', 'domain':'System Administrator'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'Read Only'}}]
}
systemUsers.push(systemUser, systemUser1, systemUser2);
const systemUsersResponse = DaoUtils.formatBiResponse(systemUsers);
Expand Down
16 changes: 8 additions & 8 deletions tests/unit/components/tables/ExpandableTable.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,24 +69,24 @@ function setup() {
roleDAO.getAll.mockResolvedValue(rolesResponse);

const systemUser = {'id':'1', 'name':'Test user', 'email':'testuser@test.com', 'active':'true',
'systemRoles': [{'id':'1', 'domain':'admin'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'member'}}]};
'systemRoles': [{'id':'1', 'domain':'System Administrator'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'Read Only'}}]};
const systemUser1 = {
'id':'2', 'name':'Test user 2', 'email':'testuser1@test.com', 'active':'true', 'orcid': '123',
'systemRoles': [{'id':'1', 'domain':'admin'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'member'}}]
'systemRoles': [{'id':'1', 'domain':'System Administrator'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'Read Only'}}]
};
const systemUser2 = {
'id':'2', 'name':'Test user 2', 'email':'testuse2@test.com', 'active':'true', 'orcid': '456',
'systemRoles': [{'id':'1', 'domain':'admin'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'member'}}]
'systemRoles': [{'id':'1', 'domain':'System Administrator'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'Read Only'}}]
}
systemUsers.push(systemUser, systemUser1, systemUser2);
users.forEach(user => {
systemUsers.push({
'id':user.id, 'name':user.name, 'email':user.email, 'active':'true', 'orcid': `456-${user.id}`,
'systemRoles': [{'id':'1', 'domain':'admin'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'member'}}]
'systemRoles': [{'id':'1', 'domain':'System Administrator'}],
'programRoles': [{'active':'true', 'program':{'id':'1', 'name':'Test Program'}, 'roles':{'id':'1','domain':'Read Only'}}]
})
})
const systemUsersResponse = DaoUtils.formatBiResponse(systemUsers);
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ export const defaultStore = new Vuex.Store({
});

const fakeUser: User = new User('1', 'Test User','1', 'email@email.com',
new Role('1', 'admin'),
[new ProgramUser('1', 'Test User', 'email@email.com', '1', 'breeder', fakeProgram, true)]);
new Role('1', 'System Administrator'),
[new ProgramUser('1', 'Test User', 'email@email.com', '1', 'Program Administrator', fakeProgram, true)]);
localVue.use(abilitiesPlugin, defineAbilityFor(fakeUser, fakeProgram));

export default localVue;