From 9c22ff485ae2e065ae705fd5066fda6d508cf236 Mon Sep 17 00:00:00 2001 From: Pawel Kowalczyk Date: Thu, 29 Nov 2018 11:52:54 +0100 Subject: [PATCH] add-isAdmin-to-store Feature #14498 Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk --- package.json | 2 +- src/models/user.ts | 1 + src/services/auth-service/auth-service.ts | 10 +++++++--- src/store/auth/auth-actions.test.ts | 7 +++++-- src/store/auth/auth-reducer.test.ts | 7 +++++-- .../virtual-machines/virtual-machines-actions.ts | 1 - .../virtual-machine-panel/virtual-machine-panel.tsx | 12 +++++++----- 7 files changed, 26 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 89458046..c99aa1ab 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "scripts": { "start": "react-scripts-ts start", "build": "REACT_APP_BUILD_NUMBER=$BUILD_NUMBER REACT_APP_GIT_COMMIT=$GIT_COMMIT react-scripts-ts build", - "test": "CI=true react-scripts-ts test --env=jsdom", + "test": "react-scripts-ts test --env=jsdom", "eject": "react-scripts-ts eject", "lint": "tslint src/** -t verbose", "build-css": "node-sass-chokidar src/ -o src/", diff --git a/src/models/user.ts b/src/models/user.ts index c2f21e58..9f9c5347 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -10,6 +10,7 @@ export interface User { lastName: string; uuid: string; ownerUuid: string; + isAdmin: boolean; } export const getUserFullname = (user?: User) => { diff --git a/src/services/auth-service/auth-service.ts b/src/services/auth-service/auth-service.ts index 50760bb4..247869e1 100644 --- a/src/services/auth-service/auth-service.ts +++ b/src/services/auth-service/auth-service.ts @@ -13,6 +13,7 @@ export const USER_FIRST_NAME_KEY = 'userFirstName'; export const USER_LAST_NAME_KEY = 'userLastName'; export const USER_UUID_KEY = 'userUuid'; export const USER_OWNER_UUID_KEY = 'userOwnerUuid'; +export const USER_IS_ADMIN = 'userIsAdmin'; export interface UserDetailsResponse { email: string; @@ -56,9 +57,10 @@ export class AuthService { const lastName = localStorage.getItem(USER_LAST_NAME_KEY); const uuid = localStorage.getItem(USER_UUID_KEY); const ownerUuid = localStorage.getItem(USER_OWNER_UUID_KEY); + const isAdmin = Boolean(localStorage.getItem(USER_IS_ADMIN)); - return email && firstName && lastName && uuid && ownerUuid - ? { email, firstName, lastName, uuid, ownerUuid } + return email && firstName && lastName && uuid && ownerUuid && isAdmin + ? { email, firstName, lastName, uuid, ownerUuid, isAdmin } : undefined; } @@ -68,6 +70,7 @@ export class AuthService { localStorage.setItem(USER_LAST_NAME_KEY, user.lastName); localStorage.setItem(USER_UUID_KEY, user.uuid); localStorage.setItem(USER_OWNER_UUID_KEY, user.ownerUuid); + localStorage.setItem(USER_IS_ADMIN, JSON.stringify(user.isAdmin)); } public removeUser() { @@ -100,7 +103,8 @@ export class AuthService { firstName: resp.data.first_name, lastName: resp.data.last_name, uuid: resp.data.uuid, - ownerUuid: resp.data.owner_uuid + ownerUuid: resp.data.owner_uuid, + isAdmin: resp.data.is_admin }; }) .catch(e => { diff --git a/src/store/auth/auth-actions.test.ts b/src/store/auth/auth-actions.test.ts index 231c37b4..4f1b3cf3 100644 --- a/src/store/auth/auth-actions.test.ts +++ b/src/store/auth/auth-actions.test.ts @@ -10,7 +10,8 @@ import { USER_FIRST_NAME_KEY, USER_LAST_NAME_KEY, USER_OWNER_UUID_KEY, - USER_UUID_KEY + USER_UUID_KEY, + USER_IS_ADMIN } from "~/services/auth-service/auth-service"; import 'jest-localstorage-mock'; @@ -42,6 +43,7 @@ describe('auth-actions', () => { localStorage.setItem(USER_LAST_NAME_KEY, "Doe"); localStorage.setItem(USER_UUID_KEY, "uuid"); localStorage.setItem(USER_OWNER_UUID_KEY, "ownerUuid"); + localStorage.setItem(USER_IS_ADMIN, "isAdmin"); store.dispatch(initAuth()); @@ -53,7 +55,8 @@ describe('auth-actions', () => { firstName: "John", lastName: "Doe", uuid: "uuid", - ownerUuid: "ownerUuid" + ownerUuid: "ownerUuid", + isAdmin: true } }); }); diff --git a/src/store/auth/auth-reducer.test.ts b/src/store/auth/auth-reducer.test.ts index 8cde3245..3dd486b3 100644 --- a/src/store/auth/auth-reducer.test.ts +++ b/src/store/auth/auth-reducer.test.ts @@ -29,7 +29,8 @@ describe('auth-reducer', () => { firstName: "John", lastName: "Doe", uuid: "uuid", - ownerUuid: "ownerUuid" + ownerUuid: "ownerUuid", + isAdmin: true }; const state = reducer(initialState, authActions.INIT({ user, token: "token" })); expect(state).toEqual({ @@ -58,7 +59,8 @@ describe('auth-reducer', () => { firstName: "John", lastName: "Doe", uuid: "uuid", - ownerUuid: "ownerUuid" + ownerUuid: "ownerUuid", + isAdmin: true }; const state = reducer(initialState, authActions.USER_DETAILS_SUCCESS(user)); @@ -71,6 +73,7 @@ describe('auth-reducer', () => { lastName: "Doe", uuid: "uuid", ownerUuid: "ownerUuid", + isAdmin: true } }); }); diff --git a/src/store/virtual-machines/virtual-machines-actions.ts b/src/store/virtual-machines/virtual-machines-actions.ts index 9bd79884..ae753562 100644 --- a/src/store/virtual-machines/virtual-machines-actions.ts +++ b/src/store/virtual-machines/virtual-machines-actions.ts @@ -35,7 +35,6 @@ const loadRequestedDate = () => dispatch(virtualMachinesActions.SET_REQUESTED_DATE(date)); }; - export const loadVirtualMachinesData = () => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { dispatch(loadRequestedDate()); diff --git a/src/views/virtual-machine-panel/virtual-machine-panel.tsx b/src/views/virtual-machine-panel/virtual-machine-panel.tsx index c94c3a74..5eb9b191 100644 --- a/src/views/virtual-machine-panel/virtual-machine-panel.tsx +++ b/src/views/virtual-machine-panel/virtual-machine-panel.tsx @@ -9,7 +9,7 @@ import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/st import { ArvadosTheme } from '~/common/custom-theme'; import { DefaultCodeSnippet } from '~/components/default-code-snippet/default-code-snippet'; import { Link } from 'react-router-dom'; -import { Dispatch, compose } from 'redux'; +import { compose } from 'redux'; import { saveRequestedDate, loadVirtualMachinesData } from '~/store/virtual-machines/virtual-machines-actions'; import { RootState } from '~/store/store'; import { ListResults } from '~/services/common-service/common-resource-service'; @@ -58,9 +58,10 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ } }); -const mapStateToProps = ({ virtualMachines }: RootState) => { +const mapStateToProps = ({ virtualMachines, auth }: RootState) => { return { requestedDate: virtualMachines.date, + isAdmin: auth.user!.isAdmin, ...virtualMachines }; }; @@ -75,6 +76,7 @@ interface VirtualMachinesPanelDataProps { virtualMachines: ListResults; logins: VirtualMachinesLoginsResource[]; links: ListResults; + isAdmin: string; } interface VirtualMachinesPanelActionProps { @@ -91,12 +93,12 @@ export const VirtualMachinePanel = compose( componentDidMount() { this.props.loadVirtualMachinesData(); } - + render() { - const { virtualMachines, links } = this.props; + const { virtualMachines, links, isAdmin } = this.props; return ( - {virtualMachines.itemsAvailable === 0 && } + {isAdmin && } {virtualMachines.itemsAvailable > 0 && links.itemsAvailable > 0 && } {} -- 2.30.2