diff --git a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/SearchIndexDetails.spec.ts b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/SearchIndexDetails.spec.ts deleted file mode 100644 index 9e5fb1f6da3..00000000000 --- a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/SearchIndexDetails.spec.ts +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Copyright 2023 Collate. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - addTableFieldTags, - deleteEntity, - interceptURL, - removeTableFieldTags, - updateTableFieldDescription, - verifyResponseStatusCode, -} from '../../common/common'; -import { - createSingleLevelEntity, - hardDeleteService, -} from '../../common/EntityUtils'; -import { visitEntityDetailsPage } from '../../common/Utils/Entity'; -import { getToken } from '../../common/Utils/LocalStorage'; -import { BASE_URL } from '../../constants/constants'; -import { EntityType } from '../../constants/Entity.interface'; -import { - POLICY_DETAILS, - ROLE_DETAILS, - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST, - SEARCH_INDEX_DISPLAY_NAME, - SEARCH_SERVICE_DETAILS, - TAG_1, - UPDATE_FIELD_DESCRIPTION, - USER_CREDENTIALS, -} from '../../constants/SearchIndexDetails.constants'; - -const performCommonOperations = () => { - // User should be able to edit search index field tags - addTableFieldTags( - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.fields[0].fullyQualifiedName, - TAG_1.classification, - TAG_1.tag, - 'searchIndexes' - ); - removeTableFieldTags( - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.fields[0].fullyQualifiedName, - TAG_1.classification, - TAG_1.tag, - 'searchIndexes' - ); - - // User should be able to edit search index field description - updateTableFieldDescription( - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.fields[0].fullyQualifiedName, - UPDATE_FIELD_DESCRIPTION, - 'searchIndexes' - ); - - cy.get( - `[data-row-key="${SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.fields[0].fullyQualifiedName}"] [data-testid="description"]` - ).contains(UPDATE_FIELD_DESCRIPTION); - - updateTableFieldDescription( - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.fields[0].fullyQualifiedName, - ' ', - 'searchIndexes' - ); - - cy.get( - `[data-row-key="${SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.fields[0].fullyQualifiedName}"] [data-testid="description"]` - ).contains('No Description'); -}; - -describe( - 'SearchIndexDetails page should work properly for data consumer role', - { tags: 'DataAssets' }, - () => { - const data = { user: { id: '' } }; - - before(() => { - cy.login(); - cy.getAllLocalStorage().then((storageData) => { - const token = getToken(storageData); - - // Create search index entity - createSingleLevelEntity({ - token, - ...SEARCH_SERVICE_DETAILS, - }); - - // Create a new user - cy.request({ - method: 'POST', - url: `/api/v1/users/signup`, - headers: { Authorization: `Bearer ${token}` }, - body: USER_CREDENTIALS, - }).then((response) => { - data.user = response.body; - }); - - cy.logout(); - }); - }); - - after(() => { - cy.login(); - - cy.getAllLocalStorage().then((storageData) => { - const token = getToken(storageData); - - // Delete search index - hardDeleteService({ - token, - serviceFqn: SEARCH_SERVICE_DETAILS.service.name, - serviceType: SEARCH_SERVICE_DETAILS.serviceType, - }); - - // Delete created user - cy.request({ - method: 'DELETE', - url: `/api/v1/users/${data.user.id}?hardDelete=true&recursive=false`, - headers: { Authorization: `Bearer ${token}` }, - }); - }); - }); - - beforeEach(() => { - // Login with the created user - cy.login(USER_CREDENTIALS.email, USER_CREDENTIALS.password); - - cy.url().should('eq', `${BASE_URL}/my-data`); - }); - - it('All permissible actions on search index details page should work properly', () => { - visitEntityDetailsPage({ - term: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.name, - serviceName: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.service, - entity: EntityType.SearchIndex, - }); - - // Edit domain option should not be available - cy.get( - `[data-testid="entity-page-header"] [data-testid="add-domain"]` - ).should('not.exist'); - - // Manage button should not be visible on service page - cy.get( - '[data-testid="asset-header-btn-group"] [data-testid="manage-button"]' - ).should('not.exist'); - - performCommonOperations(); - - cy.logout(); - }); - } -); - -describe('SearchIndexDetails page should work properly for data steward role', () => { - const data = { - user: { id: '' }, - policy: { id: '' }, - role: { id: '', name: '' }, - }; - - before(() => { - cy.login(); - cy.getAllLocalStorage().then((storageData) => { - const token = getToken(storageData); - - // Create search index entity - createSingleLevelEntity({ - token, - ...SEARCH_SERVICE_DETAILS, - }); - - // Create Data Steward Policy - cy.request({ - method: 'POST', - url: `/api/v1/policies`, - headers: { Authorization: `Bearer ${token}` }, - body: POLICY_DETAILS, - }).then((policyResponse) => { - data.policy = policyResponse.body; - - // Create Data Steward Role - cy.request({ - method: 'POST', - url: `/api/v1/roles`, - headers: { Authorization: `Bearer ${token}` }, - body: ROLE_DETAILS, - }).then((roleResponse) => { - data.role = roleResponse.body; - - // Create a new user - cy.request({ - method: 'POST', - url: `/api/v1/users/signup`, - headers: { Authorization: `Bearer ${token}` }, - body: USER_CREDENTIALS, - }).then((userResponse) => { - data.user = userResponse.body; - - // Assign data steward role to the user - cy.request({ - method: 'PATCH', - url: `/api/v1/users/${data.user.id}`, - headers: { - Authorization: `Bearer ${token}`, - 'Content-Type': 'application/json-patch+json', - }, - body: [ - { - op: 'add', - path: '/roles/0', - value: { - id: data.role.id, - type: 'role', - name: data.role.name, - }, - }, - ], - }); - }); - }); - }); - - cy.logout(); - }); - }); - - after(() => { - cy.login(); - - cy.getAllLocalStorage().then((storageData) => { - const token = getToken(storageData); - - // Delete created user - cy.request({ - method: 'DELETE', - url: `/api/v1/users/${data.user.id}?hardDelete=true&recursive=false`, - headers: { Authorization: `Bearer ${token}` }, - }); - - // Delete policy - cy.request({ - method: 'DELETE', - url: `/api/v1/policies/${data.policy.id}?hardDelete=true&recursive=false`, - headers: { Authorization: `Bearer ${token}` }, - }); - - // Delete role - cy.request({ - method: 'DELETE', - url: `/api/v1/roles/${data.role.id}?hardDelete=true&recursive=false`, - headers: { Authorization: `Bearer ${token}` }, - }); - - // Delete search index - hardDeleteService({ - token, - serviceFqn: SEARCH_SERVICE_DETAILS.service.name, - serviceType: SEARCH_SERVICE_DETAILS.serviceType, - }); - }); - }); - - beforeEach(() => { - // Login with the created user - cy.login(USER_CREDENTIALS.email, USER_CREDENTIALS.password); - - cy.url().should('eq', `${BASE_URL}/my-data`); - }); - - it('All permissible actions on search index details page should work properly', () => { - visitEntityDetailsPage({ - term: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.name, - serviceName: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.service, - entity: EntityType.SearchIndex, - }); - - // Edit domain option should not be available - cy.get(`[data-testid="entity-page-header"]`).then(($body) => { - const editDomain = $body.find(`[data-testid="add-domain"]`); - - expect(editDomain.length).to.equal(0); - }); - - // Manage button should be visible on service page - cy.get('[data-testid="manage-button"]').click(); - - // Announcement and Delete options should not be visible - cy.get('.manage-dropdown-list-container').then(($body) => { - const announcementButton = $body.find( - `[data-testid="announcement-button"]` - ); - const deleteButton = $body.find(`[data-testid="delete-button"]`); - - expect(announcementButton.length).to.equal(0); - expect(deleteButton.length).to.equal(0); - }); - - // Rename search index flow should work properly - cy.get('[data-testid="rename-button"]').click({ waitForAnimations: true }); - - cy.get('#displayName').clear().type(SEARCH_INDEX_DISPLAY_NAME); - - interceptURL('PATCH', `/api/v1/searchIndexes/*`, 'updateDisplayName'); - - cy.get('[data-testid="save-button"]').click(); - - verifyResponseStatusCode('@updateDisplayName', 200); - - cy.get('[data-testid="entity-header-display-name"]').contains( - SEARCH_INDEX_DISPLAY_NAME - ); - - performCommonOperations(); - }); -}); - -describe('SearchIndexDetails page should work properly for admin role', () => { - before(() => { - cy.login(); - cy.getAllLocalStorage().then((storageData) => { - const token = getToken(storageData); - - // Create search index entity - createSingleLevelEntity({ - token, - ...SEARCH_SERVICE_DETAILS, - }); - }); - }); - - after(() => { - cy.login(); - - cy.getAllLocalStorage().then((storageData) => { - const token = getToken(storageData); - - // Delete search index - hardDeleteService({ - token, - serviceFqn: SEARCH_SERVICE_DETAILS.service.name, - serviceType: SEARCH_SERVICE_DETAILS.serviceType, - }); - }); - }); - - beforeEach(() => { - cy.login(); - }); - - it('All permissible actions on search index details page should work properly', () => { - visitEntityDetailsPage({ - term: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.name, - serviceName: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.service, - entity: EntityType.SearchIndex, - }); - performCommonOperations(); - }); - - it('Soft delete workflow should work properly', () => { - visitEntityDetailsPage({ - term: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.name, - serviceName: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.service, - entity: EntityType.SearchIndex, - }); - deleteEntity( - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.name, - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.service, - EntityType.SearchIndex, - 'Search Index', - 'soft' - ); - - cy.get('[data-testid="deleted-badge"]').should('be.visible'); - - // Edit options for domain owner and tier should not be visible - cy.get('[data-testid="add-domain"]').should('not.exist'); - cy.get('[data-testid="edit-owner"]').should('not.exist'); - cy.get('[data-testid="edit-tier"]').should('not.exist'); - - // Edit description button should not be visible - cy.get('[data-testid="edit-description"]').should('not.exist'); - - // Edit tags button should not be visible - cy.get( - `[data-testid="entity-right-panel"] [data-testid="tags-container"] [data-testid="add-tag"]` - ).should('not.exist'); - - // Edit description and tags button for fields should not be visible - cy.get( - `[data-row-key="${SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.fields[0].fullyQualifiedName}"]` - ).then(($body) => { - const addTag = $body.find( - `[data-testid="tags-container"] [data-testid="add-tag"]` - ); - const editDescription = $body.find( - `[data-testid="description"] [data-testid="edit-button"]` - ); - - expect(addTag.length).to.equal(0); - expect(editDescription.length).to.equal(0); - - // Restore search index flow should work properly - cy.get('[data-testid="manage-button"]').click(); - - cy.get('[data-testid="restore-button"]').click(); - - interceptURL( - 'PUT', - `/api/v1/searchIndexes/restore`, - 'restoreSearchIndex' - ); - - cy.get('[data-testid="restore-asset-modal"] .ant-btn-primary') - .contains('Restore') - .click(); - - verifyResponseStatusCode('@restoreSearchIndex', 200); - }); - }); - - it('Hard delete workflow should work properly', () => { - visitEntityDetailsPage({ - term: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.name, - serviceName: SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.service, - entity: EntityType.SearchIndex, - }); - deleteEntity( - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.name, - SEARCH_INDEX_DETAILS_FOR_DETAILS_PAGE_TEST.service, - EntityType.SearchIndex, - 'Search Index' - ); - }); -}); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts index b0b870bc234..ef6d563b7d0 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts @@ -181,12 +181,13 @@ test.describe('Domains', () => { await afterAction(); }); - test('Switch domain from navbar and check domain query call warp in quotes', async ({ + test('Switch domain from navbar and check domain query call wrap in quotes', async ({ page, }) => { const { afterAction, apiContext } = await getApiContext(page); const domain = new Domain(); await domain.create(apiContext); + await page.reload(); await page.getByTestId('domain-dropdown').click(); await page .locator( @@ -217,8 +218,8 @@ test.describe('Domains', () => { const { assets, assetCleanup } = await setupAssetsForDomain(page); const domain = new Domain(); await domain.create(apiContext); - await sidebarClick(page, SidebarItem.DOMAIN); await page.reload(); + await sidebarClick(page, SidebarItem.DOMAIN); await addAssetsToDomain(page, domain.data, assets); await page.getByTestId('documentation').click(); const updatedDomainName = 'PW Domain Updated'; @@ -275,10 +276,12 @@ test.describe('Domains Rbac', () => { test.beforeAll('Setup pre-requests', async ({ browser }) => { const { apiContext, afterAction, page } = await performAdminLogin(browser); - await domain1.create(apiContext); - await domain2.create(apiContext); - await domain3.create(apiContext); - await user1.create(apiContext); + await Promise.all([ + domain1.create(apiContext), + domain2.create(apiContext), + domain3.create(apiContext), + user1.create(apiContext), + ]); const domainPayload: Operation[] = [ { @@ -322,6 +325,8 @@ test.describe('Domains Rbac', () => { }); test('Domain Rbac', async ({ browser }) => { + test.slow(true); + const { page, afterAction, apiContext } = await performAdminLogin(browser); const { page: userPage, afterAction: afterActionUser1 } = await performUserLogin(browser, user1); @@ -363,6 +368,19 @@ test.describe('Domains Rbac', () => { .locator('span') ).toBeVisible(); + // Visit explore page and verify if domain is passed in the query + const queryRes = userPage.waitForResponse( + '/api/v1/search/query?*index=dataAsset*' + ); + await sidebarClick(userPage, SidebarItem.EXPLORE); + await queryRes.then(async (res) => { + const queryString = new URL(res.request().url()).search; + const urlParams = new URLSearchParams(queryString); + const qParam = urlParams.get('q'); + + await expect(qParam).toContain(`domain.fullyQualifiedName:`); + }); + for (const asset of domainAssset2) { const fqn = encodeURIComponent( get(asset, 'entityResponseData.fullyQualifiedName', '') @@ -384,10 +402,13 @@ test.describe('Domains Rbac', () => { await afterActionUser1(); }); - await domain1.delete(apiContext); - await domain2.delete(apiContext); - await domain3.delete(apiContext); - await user1.delete(apiContext); + await Promise.all([ + domain1.delete(apiContext), + domain2.delete(apiContext), + domain3.delete(apiContext), + user1.delete(apiContext), + ]); + await assetCleanup1(); await assetCleanup2(); await afterAction(); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/EntityDataSteward.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/EntityDataSteward.spec.ts index a99c09e3ad1..2ac740bd0ce 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/EntityDataSteward.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/EntityDataSteward.spec.ts @@ -179,6 +179,10 @@ entities.forEach((EntityClass) => { await entity.followUnfollowEntity(page, entityName); }); + test(`Update displayName`, async ({ page }) => { + await entity.renameEntity(page, entity.entity.name); + }); + test.afterAll('Cleanup', async ({ browser }) => { const { apiContext, afterAction } = await performAdminLogin(browser); await user.delete(apiContext); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/advancedSearch.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/advancedSearch.ts index bbcca1b9004..869252bdd6d 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/advancedSearch.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/advancedSearch.ts @@ -182,7 +182,7 @@ export const fillRule = async ( } await page - .locator(`.ant-select-dropdown [title="${searchData}"]`) + .locator(`.ant-select-dropdown:visible [title="${searchData}"]`) .click(); } diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/domain.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/domain.ts index c0fdc7bb235..27b46c8bbf3 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/domain.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/domain.ts @@ -299,7 +299,10 @@ export const addAssetsToDomain = async ( const searchRes = page.waitForResponse( `/api/v1/search/query?q=${name}&index=all&from=0&size=25&*` ); - await page.getByTestId('searchbar').fill(name); + await page + .getByTestId('asset-selection-modal') + .getByTestId('searchbar') + .fill(name); await searchRes; await page.locator(`[data-testid="table-data-card_${fqn}"] input`).check(); @@ -380,14 +383,18 @@ export const setupAssetsForDomain = async (page: Page) => { const table = new TableClass(); const topic = new TopicClass(); const dashboard = new DashboardClass(); - await table.create(apiContext); - await topic.create(apiContext); - await dashboard.create(apiContext); + await Promise.all([ + table.create(apiContext), + topic.create(apiContext), + dashboard.create(apiContext), + ]); const assetCleanup = async () => { - await table.create(apiContext); - await topic.create(apiContext); - await dashboard.create(apiContext); + await Promise.all([ + table.delete(apiContext), + topic.delete(apiContext), + dashboard.delete(apiContext), + ]); await afterAction(); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.test.tsx index 044c34a793b..e5c82195eea 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.test.tsx @@ -13,7 +13,6 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; import { MemoryRouter } from 'react-router-dom'; -import { getDomainList } from '../../rest/domainAPI'; import { getLimitConfig } from '../../rest/limitsAPI'; import applicationsClassBase from '../Settings/Applications/AppDetails/ApplicationsClassBase'; import AppContainer from './AppContainer'; @@ -85,14 +84,4 @@ describe('AppContainer', () => { expect(getLimitConfig).toHaveBeenCalled(); }); - - it('should call domain list to cache domains', () => { - render( - - - - ); - - expect(getDomainList).toHaveBeenCalled(); - }); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.tsx index 4920f110bc3..054095da098 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.tsx @@ -15,11 +15,8 @@ import { Layout } from 'antd'; import classNames from 'classnames'; import React, { useCallback, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { ES_MAX_PAGE_SIZE } from '../../constants/constants'; import { useLimitStore } from '../../context/LimitsProvider/useLimitsStore'; import { useApplicationStore } from '../../hooks/useApplicationStore'; -import { useDomainStore } from '../../hooks/useDomainStore'; -import { getDomainList } from '../../rest/domainAPI'; import { getLimitConfig } from '../../rest/limitsAPI'; import applicationRoutesClass from '../../utils/ApplicationRoutesClassBase'; import Appbar from '../AppBar/Appbar'; @@ -32,27 +29,11 @@ const AppContainer = () => { const { i18n } = useTranslation(); const { Header, Sider, Content } = Layout; const { currentUser } = useApplicationStore(); - const { updateDomains, updateDomainLoading } = useDomainStore(); const AuthenticatedRouter = applicationRoutesClass.getRouteElements(); const ApplicationExtras = applicationsClassBase.getApplicationExtension(); const isDirectionRTL = useMemo(() => i18n.dir() === 'rtl', [i18n]); const { setConfig, bannerDetails } = useLimitStore(); - const fetchDomainList = useCallback(async () => { - try { - updateDomainLoading(true); - const { data } = await getDomainList({ - limit: ES_MAX_PAGE_SIZE, - fields: 'parent', - }); - updateDomains(data); - } catch (error) { - // silent fail - } finally { - updateDomainLoading(false); - } - }, [currentUser]); - const fetchLimitConfig = useCallback(async () => { try { const response = await getLimitConfig(); @@ -65,7 +46,6 @@ const AppContainer = () => { useEffect(() => { if (currentUser?.id) { - fetchDomainList(); fetchLimitConfig(); } }, [currentUser?.id]); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/AuthProvider.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/AuthProvider.tsx index c29fd2d9667..9f925dc2c68 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/AuthProvider.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Auth/AuthProviders/AuthProvider.tsx @@ -41,6 +41,7 @@ import { useTranslation } from 'react-i18next'; import { useHistory, useLocation } from 'react-router-dom'; import { DEFAULT_DOMAIN_VALUE, + ES_MAX_PAGE_SIZE, REDIRECT_PATHNAME, ROUTES, } from '../../../constants/constants'; @@ -56,6 +57,7 @@ import { AuthProvider as AuthProviderEnum } from '../../../generated/settings/se import { useApplicationStore } from '../../../hooks/useApplicationStore'; import { useDomainStore } from '../../../hooks/useDomainStore'; import axiosClient from '../../../rest'; +import { getDomainList } from '../../../rest/domainAPI'; import { fetchAuthenticationConfig, fetchAuthorizerConfig, @@ -135,7 +137,7 @@ export const AuthProvider = ({ isApplicationLoading, setApplicationLoading, } = useApplicationStore(); - const { activeDomain } = useDomainStore(); + const { updateDomains, updateDomainLoading } = useDomainStore(); const location = useLocation(); const history = useHistory(); @@ -183,6 +185,21 @@ export const AuthProvider = ({ return authenticatorRef.current?.renewIdToken(); }; + const fetchDomainList = useCallback(async () => { + try { + updateDomainLoading(true); + const { data } = await getDomainList({ + limit: ES_MAX_PAGE_SIZE, + fields: 'parent', + }); + updateDomains(data); + } catch (error) { + // silent fail + } finally { + updateDomainLoading(false); + } + }, []); + const handledVerifiedUser = () => { if (!isProtectedRoute(location.pathname)) { history.push(ROUTES.HOME); @@ -223,6 +240,8 @@ export const AuthProvider = ({ if (res) { setCurrentUser(res); setIsAuthenticated(true); + // Fetch domains at the start + await fetchDomainList(); } else { resetUserDetails(); } @@ -397,6 +416,9 @@ export const AuthProvider = ({ setCurrentUser(res); } + // Fetch domains at the start + await fetchDomainList(); + handledVerifiedUser(); // Start expiry timer on successful login startTokenExpiryTimer(); @@ -470,6 +492,7 @@ export const AuthProvider = ({ // eslint-disable-next-line @typescript-eslint/no-explicit-any const withDomainFilter = (config: InternalAxiosRequestConfig) => { const isGetRequest = config.method === 'get'; + const activeDomain = useDomainStore.getState().activeDomain; const hasActiveDomain = activeDomain !== DEFAULT_DOMAIN_VALUE; const currentPath = window.location.pathname; const shouldNotIntercept = [