diff --git a/openmetadata-ui/src/main/resources/ui/src/components/BotListV1/BotListV1.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/BotListV1/BotListV1.component.tsx index fbdb8920158..208476eb9b9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/BotListV1/BotListV1.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/BotListV1/BotListV1.component.tsx @@ -59,10 +59,15 @@ const BotListV1 = ({ const [handleErrorPlaceholder, setHandleErrorPlaceholder] = useState(false); const [searchedData, setSearchedData] = useState([]); - const createPermission = checkPermission( - Operation.Create, - ResourceEntity.BOT, - permissions + /** + * Bot creation is two step process so here we should check for + * Create User and Create Bot both permissions + */ + const createPermission = useMemo( + () => + checkPermission(Operation.Create, ResourceEntity.BOT, permissions) && + checkPermission(Operation.Create, ResourceEntity.USER, permissions), + [permissions] ); const deletePermission = useMemo( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Users/Users.component.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Users/Users.component.test.tsx index fc4fb38b099..4fac643f7a1 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Users/Users.component.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Users/Users.component.test.tsx @@ -105,6 +105,32 @@ const mockUserData = { ], }; +const mockUserRole = { + data: [ + { + id: '3ed7b995-ce8b-4720-9beb-6f4a9c626920', + name: 'DataConsumer', + fullyQualifiedName: 'DataConsumer', + displayName: 'Data Consumer', + description: + 'Users with Data Consumer role use different data assets for their day to day work.', + version: 0.1, + updatedAt: 1663825430544, + updatedBy: 'admin', + href: 'http://localhost:8585/api/v1/roles/3ed7b995-ce8b-4720-9beb-6f4a9c626920', + allowDelete: false, + deleted: false, + }, + ], + paging: { + total: 1, + }, +}; + +jest.mock('../../axiosAPIs/rolesAPIV1.ts', () => ({ + getRoles: jest.fn().mockImplementation(() => Promise.resolve(mockUserRole)), +})); + jest.mock('../common/ProfilePicture/ProfilePicture', () => { return jest.fn().mockReturnValue(

ProfilePicture

); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/jsons/en.ts b/openmetadata-ui/src/main/resources/ui/src/jsons/en.ts index 44957337ce4..1817c00998c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/jsons/en.ts +++ b/openmetadata-ui/src/main/resources/ui/src/jsons/en.ts @@ -25,6 +25,7 @@ const jsonData = { 'check-status-airflow': 'Error while connecting to Airflow instance!', 'create-user-error': 'Error while creating user!', + 'create-bot-error': 'Error while creating bot!', 'create-conversation-error': 'Error while creating conversation!', 'create-message-error': 'Error while creating message!', 'create-role-error': 'Error While creating role!', diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/CreateUserPage/CreateUserPage.component.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/CreateUserPage/CreateUserPage.component.tsx index 4c43788120f..e488485d536 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/CreateUserPage/CreateUserPage.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/CreateUserPage/CreateUserPage.component.tsx @@ -87,15 +87,22 @@ const CreateUserPage = () => { name: res.name, displayName: res.displayName, description: res.description, - } as Bot).then((res) => { - setStatus('success'); - res && showSuccessToast(`Bot created successfully`); - setTimeout(() => { - setStatus('initial'); + } as Bot) + .then((res) => { + setStatus('success'); + res && showSuccessToast(`Bot created successfully`); + setTimeout(() => { + setStatus('initial'); - goToUserListPage(); - }, 500); - }); + goToUserListPage(); + }, 500); + }) + .catch((err: AxiosError) => { + handleSaveFailure( + err, + jsonData['api-error-messages']['create-bot-error'] + ); + }); } else { setStatus('success'); setTimeout(() => { diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/CreateUserPage/CreateUserPage.test.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/CreateUserPage/CreateUserPage.test.tsx index ea6b9e5f0f4..0efc4aaf727 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/CreateUserPage/CreateUserPage.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/CreateUserPage/CreateUserPage.test.tsx @@ -23,6 +23,32 @@ import { MemoryRouter } from 'react-router-dom'; import { createUser } from '../../axiosAPIs/userAPI'; import AddUserPageComponent from './CreateUserPage.component'; +const mockUserRole = { + data: [ + { + id: '3ed7b995-ce8b-4720-9beb-6f4a9c626920', + name: 'DataConsumer', + fullyQualifiedName: 'DataConsumer', + displayName: 'Data Consumer', + description: + 'Users with Data Consumer role use different data assets for their day to day work.', + version: 0.1, + updatedAt: 1663825430544, + updatedBy: 'admin', + href: 'http://localhost:8585/api/v1/roles/3ed7b995-ce8b-4720-9beb-6f4a9c626920', + allowDelete: false, + deleted: false, + }, + ], + paging: { + total: 1, + }, +}; + +jest.mock('../../axiosAPIs/rolesAPIV1', () => ({ + getRoles: jest.fn().mockImplementation(() => Promise.resolve(mockUserRole)), +})); + jest.mock('../../components/containers/PageContainerV1', () => { return jest .fn() @@ -53,7 +79,6 @@ jest.mock('../../axiosAPIs/userAPI', () => ({ jest.mock('../../AppState', () => jest.fn().mockReturnValue({ - userRoles: [], userTeams: [], }) ); diff --git a/openmetadata-ui/src/main/resources/ui/src/router/AuthenticatedAppRouter.tsx b/openmetadata-ui/src/main/resources/ui/src/router/AuthenticatedAppRouter.tsx index c862cbf2802..149a721b0fa 100644 --- a/openmetadata-ui/src/main/resources/ui/src/router/AuthenticatedAppRouter.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/router/AuthenticatedAppRouter.tsx @@ -238,6 +238,13 @@ const AuthenticatedAppRouter: FunctionComponent = () => { [permissions] ); + const createBotPermission = useMemo( + () => + checkPermission(Operation.Create, ResourceEntity.USER, permissions) && + checkPermission(Operation.Create, ResourceEntity.BOT, permissions), + [permissions] + ); + return ( @@ -412,11 +419,7 @@ const AuthenticatedAppRouter: FunctionComponent = () => {