frontend/src/utils/projectPermissions.js (128 lines of code) (raw):

export function userCanMap(user, project, userTeams = [], userOrgs = []) { if (user.role === 'READ_ONLY') return false; if (user.role === 'ADMIN') return true; // project author can map it if (user.username && user.username === project.author) return true; if (project.organisation && userOrgs.includes(project.organisation)) return true; const projectTeamsIds = project.teams .filter((team) => ['MAPPER', 'VALIDATOR', 'PROJECT_MANAGER'].includes(team.role)) .map((team) => team.teamId); const isUserMemberOfATeam = userTeams.filter((team) => projectTeamsIds.includes(team.teamId)).length > 0; const isUserExperienced = ['INTERMEDIATE', 'ADVANCED'].includes(user.mappingLevel); // check for private projects if (project.private) { if (project.allowedUsernames.includes(user.username) || isUserMemberOfATeam) { return true; } else { return false; } } // if mappingPermission is ANY, all users can map if (project.mappingPermission === 'ANY') return true; // if mappingPermission is level, only INTERMEDIATE and ADVANCED users can map if (project.mappingPermission === 'LEVEL') { return isUserExperienced; } // if mappingPermission is team, only members of a project team can map if (project.mappingPermission === 'TEAMS') { return isUserMemberOfATeam; } // if mappingPermission is team, only INTERMEDIATE and ADVANCED members of a project team can map if (project.mappingPermission === 'TEAMS_LEVEL') { return isUserMemberOfATeam && isUserExperienced; } } export function userCanValidate(user, project, userTeams = [], userOrgs = []) { if (user.role === 'READ_ONLY') return false; if (user.role === 'ADMIN') return true; // project author can validate it if (user.username && user.username === project.author) return true; if (project.organisation && userOrgs.includes(project.organisation)) return true; const projectTeamsIds = project.teams .filter((team) => ['VALIDATOR', 'PROJECT_MANAGER'].includes(team.role)) .map((team) => team.teamId); const isUserMemberOfATeam = userTeams.filter((team) => projectTeamsIds.includes(team.teamId)).length > 0; const isUserExperienced = ['INTERMEDIATE', 'ADVANCED'].includes(user.mappingLevel); // check for private projects if (project.private) { if (project.allowedUsernames.includes(user.username) || isUserMemberOfATeam) { return true; } else { return false; } } // if validationPermission is ANY, all users can validate if (project.validationPermission === 'ANY') return true; // if validationPermission is level, only INTERMEDIATE and ADVANCED users can validate if (project.validationPermission === 'LEVEL') { return isUserExperienced; } // if validationPermission is team, only members of a project team can validate if (project.validationPermission === 'TEAMS') { return isUserMemberOfATeam; } // if validationPermission is team, only INTERMEDIATE and ADVANCED members of a project team can validate if (project.validationPermission === 'TEAMS_LEVEL') { return isUserMemberOfATeam && isUserExperienced; } } export function getMessageOnMappingContext(taskStatus) { if (taskStatus) { if (['READY', 'INVALIDATED'].includes(taskStatus)) { return 'mapSelectedTask'; } return 'mapAnotherTask'; } else { return 'mapATask'; } } export function getMessageOnValidationContext(mappingIsPossible, taskStatus) { if (taskStatus === 'MAPPED') { return 'validateSelectedTask'; } if (['VALIDATED', 'LOCKED_FOR_VALIDATION'].includes(taskStatus)) { return 'validateAnotherTask'; } if (mappingIsPossible) { return getMessageOnMappingContext(taskStatus); } return 'validateATask'; } export function getTaskAction(user, project, taskStatus, userTeams = [], userOrgs = []) { // nothing more to do if all tasks are validated or set as BADIMAGERY if (project.percentValidated >= 100) { return 'projectIsComplete'; } const validationIsPossible = userCanValidate(user, project, userTeams, userOrgs); const mappingIsPossible = userCanMap(user, project, userTeams, userOrgs) && project.percentMapped < 100; if (validationIsPossible) { return getMessageOnValidationContext(mappingIsPossible, taskStatus); } if (mappingIsPossible) { return getMessageOnMappingContext(taskStatus); } if (project.percentMapped >= 100) { return 'mappingIsComplete'; } return 'selectAnotherProject'; } export function getPermissionErrorMessage(project, userLevel) { if (project.percentMapped < 100) { if ( project.mappingPermission === 'LEVEL' || (project.mappingPermission === 'TEAMS_LEVEL' && userLevel === 'BEGINNER') ) { return 'userLevelToMap'; } if ( project.mappingPermission === 'TEAMS' || (project.mappingPermission === 'TEAMS_LEVEL' && userLevel !== 'BEGINNER') ) { return 'userIsNotMappingTeamMember'; } } if (project.percentValidated < 100) { if ( project.validationPermission === 'LEVEL' || (project.validationPermission === 'TEAMS_LEVEL' && userLevel === 'BEGINNER') ) { return 'userLevelToValidate'; } if ( project.validationPermission === 'TEAMS' || (project.validationPermission === 'TEAMS_LEVEL' && userLevel !== 'BEGINNER') ) { return 'userIsNotValidationTeamMember'; } } }