Skip to content

Commit

Permalink
optimize code and add unit test
Browse files Browse the repository at this point in the history
Signed-off-by: yubonluo <yubonluo@amazon.com>
  • Loading branch information
yubonluo committed Apr 3, 2024
1 parent a07dde0 commit 518cd75
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 23 deletions.
25 changes: 3 additions & 22 deletions src/plugins/workspace/server/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import {
SavedObjectsPermissionControlContract,
} from './permission_control/client';
import { WorkspacePluginConfigType } from '../config';
import { isRequestByDashboardAdmin } from './utils';

export class WorkspacePlugin implements Plugin<{}, {}> {
private readonly logger: Logger;
Expand Down Expand Up @@ -60,26 +61,6 @@ export class WorkspacePlugin implements Plugin<{}, {}> {
});
}

private isRequestByDashboardAdmin(
request: OpenSearchDashboardsRequest,
groups: string[],
users: string[],
configGroups: string[],
configUsers: string[]
) {
if (configGroups.length === 0 && configUsers.length === 0) {
updateWorkspaceState(request, {
isDashboardAdmin: false,
});
return;
}
const groupMatchAny = groups.some((group) => configGroups.includes(group)) || false;
const userMatchAny = users.some((user) => configUsers.includes(user)) || false;
updateWorkspaceState(request, {
isDashboardAdmin: groupMatchAny || userMatchAny,
});
}

private async setupPermission(
core: CoreSetup,
config: WorkspacePluginConfigType,
Expand Down Expand Up @@ -119,7 +100,7 @@ export class WorkspacePlugin implements Plugin<{}, {}> {
.catch(() => undefined),
]);

this.isRequestByDashboardAdmin(
isRequestByDashboardAdmin(
request,
groups,
users,
Expand All @@ -131,7 +112,7 @@ export class WorkspacePlugin implements Plugin<{}, {}> {

const configGroups = config.dashboardAdmin.groups || [];
const configUsers = config.dashboardAdmin.users || [];
this.isRequestByDashboardAdmin(request, groups, users, configGroups, configUsers);
isRequestByDashboardAdmin(request, groups, users, configGroups, configUsers);
return toolkit.next();
});

Expand Down
33 changes: 32 additions & 1 deletion src/plugins/workspace/server/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@

import { AuthStatus } from '../../../core/server';
import { httpServerMock, httpServiceMock } from '../../../core/server/mocks';
import { generateRandomId, getPrincipalsFromRequest } from './utils';
import { generateRandomId, getPrincipalsFromRequest, isRequestByDashboardAdmin } from './utils';
import { getWorkspaceState } from '../../../core/server/utils';

describe('workspace utils', () => {
const mockAuth = httpServiceMock.createAuth();
Expand Down Expand Up @@ -73,4 +74,34 @@ describe('workspace utils', () => {
'UNEXPECTED_AUTHORIZATION_STATUS'
);
});

it('should be dashboard admin when users match configUsers', () => {
const mockRequest = httpServerMock.createOpenSearchDashboardsRequest();
const groups: string[] = ['dashboard_admin'];
const users: string[] = [];
const configGroups: string[] = ['dashboard_admin'];
const configUsers: string[] = [];
isRequestByDashboardAdmin(mockRequest, groups, users, configGroups, configUsers);
expect(getWorkspaceState(mockRequest)?.isDashboardAdmin).toBe(true);
});

it('should be dashboard admin when groups match configGroups', () => {
const mockRequest = httpServerMock.createOpenSearchDashboardsRequest();
const groups: string[] = [];
const users: string[] = ['dashboard_admin'];
const configGroups: string[] = [];
const configUsers: string[] = ['dashboard_admin'];
isRequestByDashboardAdmin(mockRequest, groups, users, configGroups, configUsers);
expect(getWorkspaceState(mockRequest)?.isDashboardAdmin).toBe(true);
});

it('should be not dashboard admin when groups do not match configGroups', () => {
const mockRequest = httpServerMock.createOpenSearchDashboardsRequest();
const groups: string[] = ['dashboard_admin'];
const users: string[] = [];
const configGroups: string[] = [];
const configUsers: string[] = ['dashboard_admin'];
isRequestByDashboardAdmin(mockRequest, groups, users, configGroups, configUsers);
expect(getWorkspaceState(mockRequest)?.isDashboardAdmin).toBe(false);
});
});
21 changes: 21 additions & 0 deletions src/plugins/workspace/server/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
PrincipalType,
} from '../../../core/server';
import { AuthInfo } from './types';
import { updateWorkspaceState } from '../../../core/server/utils';

/**
* Generate URL friendly random ID
Expand Down Expand Up @@ -50,3 +51,23 @@ export const getPrincipalsFromRequest = (

throw new Error('UNEXPECTED_AUTHORIZATION_STATUS');
};

export const isRequestByDashboardAdmin = (
request: OpenSearchDashboardsRequest,
groups: string[],
users: string[],
configGroups: string[],
configUsers: string[]
) => {
if (configGroups.length === 0 && configUsers.length === 0) {
updateWorkspaceState(request, {
isDashboardAdmin: false,
});
return;
}
const groupMatchAny = groups.some((group) => configGroups.includes(group)) || false;
const userMatchAny = users.some((user) => configUsers.includes(user)) || false;
updateWorkspaceState(request, {
isDashboardAdmin: groupMatchAny || userMatchAny,
});
};

0 comments on commit 518cd75

Please sign in to comment.