123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- import groupBy from 'lodash/groupBy';
- import invertBy from 'lodash/invertBy';
- import pick from 'lodash/pick';
- import {Permissions} from 'app/types';
- const PERMISSION_LEVELS = {
- read: 0,
- write: 1,
- admin: 2,
- };
- const HUMAN_RESOURCE_NAMES = {
- project: 'Project',
- team: 'Team',
- release: 'Release',
- event: 'Event',
- org: 'Organization',
- member: 'Member',
- };
- const DEFAULT_RESOURCE_PERMISSIONS: Permissions = {
- Project: 'no-access',
- Team: 'no-access',
- Release: 'no-access',
- Event: 'no-access',
- Organization: 'no-access',
- Member: 'no-access',
- };
- const PROJECT_RELEASES = 'project:releases';
- type PermissionLevelResources = {
- read: string[];
- write: string[];
- admin: string[];
- };
- const permissionLevel = (scope: string): number => {
- const permission = scope.split(':')[1];
- return PERMISSION_LEVELS[permission];
- };
- const compareScopes = (a: string, b: string) => permissionLevel(a) - permissionLevel(b);
- function topScopes(scopeList: string[]) {
- return Object.values(groupBy(scopeList, scope => scope.split(':')[0]))
- .map(scopes => scopes.sort(compareScopes))
- .map(scopes => scopes.pop());
- }
- function toResourcePermissions(scopes: string[]): Permissions {
- const permissions = {...DEFAULT_RESOURCE_PERMISSIONS};
- let filteredScopes = [...scopes];
-
-
-
- if (scopes.includes(PROJECT_RELEASES)) {
- permissions.Release = 'admin';
- filteredScopes = scopes.filter((scope: string) => scope !== PROJECT_RELEASES);
- }
- topScopes(filteredScopes).forEach((scope: string | undefined) => {
- if (scope) {
- const [resource, permission] = scope.split(':');
- permissions[HUMAN_RESOURCE_NAMES[resource]] = permission;
- }
- });
- return permissions;
- }
- function toPermissions(scopes: string[]): PermissionLevelResources {
- const defaultPermissions = {read: [], write: [], admin: []};
- const resourcePermissions = toResourcePermissions(scopes);
-
- const permissions = pick(invertBy(resourcePermissions), ['read', 'write', 'admin']);
- return {...defaultPermissions, ...permissions};
- }
- export {toPermissions, toResourcePermissions};
|