From 199ca106e5f965ee8416148474eb44b829f978de Mon Sep 17 00:00:00 2001 From: Sachin Chaurasiya Date: Wed, 2 Feb 2022 21:30:02 +0530 Subject: [PATCH] UI : Integrating Permissions API to get permissions for LoggedIn user. (#2557) * UI : Integrating Permissions API to get permissions for LoggedIn user. * Adding permission check for Lineage * Adding Permission check for manage settings. * Adding permission check for entity level tags * Adding permission check for entities detail page. * Adding permission check on Tags page * Adding permission check for teams page * Addressing review comments --- .../src/main/resources/ui/src/AppState.ts | 7 +- .../ui/src/auth-provider/AuthProvider.tsx | 28 +++++- .../resources/ui/src/axiosAPIs/miscAPI.ts | 5 ++ .../DashboardDetails.component.tsx | 3 + .../EntityLineage/EntityLineage.component.tsx | 85 +++++++++++-------- .../EntityTable/EntityTable.component.tsx | 3 + .../ManageTab/ManageTab.component.tsx | 71 ++++++++++------ .../PipelineDetails.component.tsx | 2 + .../common/description/Description.tsx | 2 + .../common/entityPageInfo/EntityPageInfo.tsx | 2 + .../non-admin-action/NonAdminAction.tsx | 11 ++- .../main/resources/ui/src/hooks/authHooks.ts | 4 +- .../resources/ui/src/interface/types.d.ts | 9 ++ .../resources/ui/src/pages/tags/index.tsx | 3 + .../resources/ui/src/pages/teams/index.tsx | 20 +++-- 15 files changed, 181 insertions(+), 74 deletions(-) diff --git a/openmetadata-ui/src/main/resources/ui/src/AppState.ts b/openmetadata-ui/src/main/resources/ui/src/AppState.ts index fa1850a153b..2618e5e432e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/AppState.ts +++ b/openmetadata-ui/src/main/resources/ui/src/AppState.ts @@ -12,7 +12,7 @@ */ import { action, makeAutoObservable } from 'mobx'; -import { ClientAuth, NewUser } from 'Models'; +import { ClientAuth, NewUser, UserPermissions } from 'Models'; import { CurrentTourPageType } from './enums/tour.enum'; import { Role } from './generated/entity/teams/role'; import { @@ -33,6 +33,7 @@ class AppState { userDetails: User = {} as User; userTeams: Array = []; userRoles: Array = []; + userPermissions: UserPermissions = {} as UserPermissions; inPageSearchText = ''; explorePageTab = 'tables'; @@ -50,6 +51,7 @@ class AppState { updateAuthState: action, updateUserRole: action, updateUsers: action, + updateUserPermissions: action, }); } @@ -74,6 +76,9 @@ class AppState { updateAuthState(state: boolean) { this.authDisabled = state; } + updateUserPermissions(permissions: UserPermissions) { + this.userPermissions = permissions; + } } export default new AppState(); diff --git a/openmetadata-ui/src/main/resources/ui/src/auth-provider/AuthProvider.tsx b/openmetadata-ui/src/main/resources/ui/src/auth-provider/AuthProvider.tsx index e5283a73b3a..65f343967bc 100644 --- a/openmetadata-ui/src/main/resources/ui/src/auth-provider/AuthProvider.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/auth-provider/AuthProvider.tsx @@ -15,6 +15,7 @@ import { AxiosResponse } from 'axios'; import { CookieStorage } from 'cookie-storage'; import { isEmpty, isNil } from 'lodash'; import { observer } from 'mobx-react'; +import { UserPermissions } from 'Models'; import { UserManager, WebStorageStateStore } from 'oidc-client'; import React, { ComponentType, @@ -32,7 +33,10 @@ import { } from 'react-router-dom'; import appState from '../AppState'; import axiosClient from '../axiosAPIs'; -import { fetchAuthorizerConfig } from '../axiosAPIs/miscAPI'; +import { + fetchAuthorizerConfig, + getLoggedInUserPermissions, +} from '../axiosAPIs/miscAPI'; import { getLoggedInUser, getUserByName, @@ -130,6 +134,21 @@ const AuthProvider: FunctionComponent = ({ } }; + const getUserPermissions = () => { + setLoading(true); + getLoggedInUserPermissions() + .then((res: AxiosResponse) => { + appState.updateUserPermissions(res.data.metadataOperations); + }) + .catch(() => + showToast({ + variant: 'error', + body: 'Error while getting user permissions', + }) + ) + .finally(() => setLoading(false)); + }; + const fetchUserByEmail = (user: OidcUser) => { getUserByName(getNameFromEmail(user.profile.email), userAPIQueryFields) .then((res: AxiosResponse) => { @@ -137,6 +156,7 @@ const AuthProvider: FunctionComponent = ({ if (res.data?.isAdmin) { getUpdatedUser(res.data, user); } + getUserPermissions(); appState.updateUserDetails(res.data); fetchAllUsers(); handledVerifiedUser(); @@ -148,6 +168,7 @@ const AuthProvider: FunctionComponent = ({ if (err.response.data.code === 404) { appState.updateNewUser(user.profile); appState.updateUserDetails({} as User); + appState.updateUserPermissions({} as UserPermissions); history.push(ROUTES.SIGNUP); } }); @@ -155,6 +176,7 @@ const AuthProvider: FunctionComponent = ({ const resetUserDetails = () => { appState.updateUserDetails({} as User); + appState.updateUserPermissions({} as UserPermissions); cookieStorage.removeItem(oidcTokenKey); cookieStorage.removeItem( `oidc.user:${userManagerConfig?.authority}:${userManagerConfig?.client_id}` @@ -167,11 +189,12 @@ const AuthProvider: FunctionComponent = ({ getLoggedInUser(userAPIQueryFields) .then((res: AxiosResponse) => { if (res.data) { + getUserPermissions(); appState.updateUserDetails(res.data); } else { resetUserDetails(); + setLoading(false); } - setLoading(false); }) .catch((err) => { if (err.response.data.code === 404) { @@ -179,6 +202,7 @@ const AuthProvider: FunctionComponent = ({ } }); }; + const fetchAuthConfig = (): void => { fetchAuthorizerConfig() .then((res: AxiosResponse) => { diff --git a/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/miscAPI.ts b/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/miscAPI.ts index d6be2226ec5..6d42ff7554e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/miscAPI.ts +++ b/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/miscAPI.ts @@ -85,3 +85,8 @@ export const deleteLineageEdge: Function = ( `/lineage/${fromEntity}/${fromId}/${toEntity}/${toId}` ); }; + +export const getLoggedInUserPermissions: Function = + (): Promise => { + return APIClient.get('/permissions'); + }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DashboardDetails/DashboardDetails.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DashboardDetails/DashboardDetails.component.tsx index 38e5ec8e5e4..b598e955ac4 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DashboardDetails/DashboardDetails.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DashboardDetails/DashboardDetails.component.tsx @@ -18,6 +18,7 @@ import React, { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; import { getTeamDetailsPath } from '../../constants/constants'; import { Dashboard } from '../../generated/entity/data/dashboard'; +import { Operation } from '../../generated/entity/policies/accessControl/rule'; import { User } from '../../generated/entity/teams/user'; import { LabelType, State, TagLabel } from '../../generated/type/tagLabel'; import { useAuth } from '../../hooks/authHooks'; @@ -425,6 +426,7 @@ const DashboardDetails = ({ Boolean(owner) )} isOwner={hasEditAccess()} + permission={Operation.UpdateDescription} position="top">