From e47545a7bb317d6cd74cc53324440676d0b8dc51 Mon Sep 17 00:00:00 2001 From: Darcy Ye Date: Thu, 21 Nov 2024 14:18:13 +0800 Subject: [PATCH] chore: update code --- .../ApplicationCreation/CreateForm/index.tsx | 24 ++++++++++++------- .../src/components/ApplicationIcon/index.tsx | 1 + .../console/src/components/Guide/hooks.ts | 1 + .../ItemPreview/ApplicationPreview.tsx | 1 + packages/console/src/consts/applications.ts | 11 +++++++-- .../ApplicationDetailsContent/index.tsx | 1 + .../IdpInitiatedAuth/ConfigForm.tsx | 11 +++++---- .../src/routes/applications/application.ts | 5 ++++ .../tests/api/application/application.test.ts | 2 +- packages/schemas/src/utils/application.ts | 2 ++ 10 files changed, 43 insertions(+), 16 deletions(-) diff --git a/packages/console/src/components/ApplicationCreation/CreateForm/index.tsx b/packages/console/src/components/ApplicationCreation/CreateForm/index.tsx index 8bf01d668..8e3d386b9 100644 --- a/packages/console/src/components/ApplicationCreation/CreateForm/index.tsx +++ b/packages/console/src/components/ApplicationCreation/CreateForm/index.tsx @@ -160,14 +160,22 @@ function CreateForm({ onChange={onChange} > {Object.values(ApplicationType) - // Other application types (e.g. "Protected") should not show up in the creation modal - .filter((value): value is Exclude => - [ - ApplicationType.Native, - ApplicationType.SPA, - ApplicationType.Traditional, - ApplicationType.MachineToMachine, - ].includes(value) + .filter( + ( + value + ): value is Extract< + ApplicationType, + | ApplicationType.Native + | ApplicationType.SPA + | ApplicationType.Traditional + | ApplicationType.MachineToMachine + > => + [ + ApplicationType.Native, + ApplicationType.SPA, + ApplicationType.Traditional, + ApplicationType.MachineToMachine, + ].includes(value) ) .map((type) => ( { // We have ensured that SAML applications are always third party in DB schema, we use `??` here to make TypeScript happy. + // TODO: @darcy fix this when SAML application is ready if (isThirdParty ?? type === ApplicationType.SAML) { return isLightMode ? thirdPartyApplicationIcon : thirdPartyApplicationIconDark; } diff --git a/packages/console/src/components/Guide/hooks.ts b/packages/console/src/components/Guide/hooks.ts index 3eceb14d2..804426c3e 100644 --- a/packages/console/src/components/Guide/hooks.ts +++ b/packages/console/src/components/Guide/hooks.ts @@ -100,6 +100,7 @@ export const useAppGuideMetadata = (): { } // We have ensured that SAML applications are always third party in DB schema, we use `||` here to make TypeScript happy. + // TODO: @darcy fix this when SAML third-party app guide is ready if (target === ApplicationType.SAML || isThirdParty) { return { ...accumulated, diff --git a/packages/console/src/components/ItemPreview/ApplicationPreview.tsx b/packages/console/src/components/ItemPreview/ApplicationPreview.tsx index 0639df6ee..0799a073d 100644 --- a/packages/console/src/components/ItemPreview/ApplicationPreview.tsx +++ b/packages/console/src/components/ItemPreview/ApplicationPreview.tsx @@ -22,6 +22,7 @@ function ApplicationPreview({ data: { id, name, isThirdParty, type } }: Props) { title={name} subtitle={ // We have ensured that SAML applications are always third party in DB schema, we use `||` here to make TypeScript happy. + // TODO: @darcy fix this when SAML app preview is ready isThirdParty || type === ApplicationType.SAML ? t(`${applicationTypeI18nKey.thirdParty}.title`) : t(`${applicationTypeI18nKey[type]}.title`) diff --git a/packages/console/src/consts/applications.ts b/packages/console/src/consts/applications.ts index 84fd807c6..a5cefc6a9 100644 --- a/packages/console/src/consts/applications.ts +++ b/packages/console/src/consts/applications.ts @@ -12,8 +12,15 @@ import TraditionalWebAppDark from '@/assets/icons/traditional-web-app-dark.svg?r import TraditionalWebApp from '@/assets/icons/traditional-web-app.svg?react'; type ApplicationIconMap = { - // TODO: Add SAML icon when we support SAML application in console - [key in Exclude]: SvgComponent; + // TODO: @darcy Add SAML icon when we support SAML application in console + [key in Extract< + ApplicationType, + | ApplicationType.Native + | ApplicationType.SPA + | ApplicationType.Traditional + | ApplicationType.MachineToMachine + | ApplicationType.Protected + >]: SvgComponent; }; export const lightModeApplicationIconMap: ApplicationIconMap = Object.freeze({ diff --git a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/index.tsx b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/index.tsx index 8804b452d..4c3485f65 100644 --- a/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/index.tsx +++ b/packages/console/src/pages/ApplicationDetails/ApplicationDetailsContent/index.tsx @@ -124,6 +124,7 @@ function ApplicationDetailsContent({ data, secrets, oidcConfig, onApplicationUpd title={data.name} primaryTag={ // We have ensured that SAML applications are always third party in DB schema, we use `||` here to make TypeScript happy. + // TODO: @darcy fix this when we add SAML apps details page data.isThirdParty || data.type === ApplicationType.SAML ? t(`${applicationTypeI18nKey.thirdParty}.title`) : t(`${applicationTypeI18nKey[data.type]}.title`) diff --git a/packages/console/src/pages/EnterpriseSsoDetails/IdpInitiatedAuth/ConfigForm.tsx b/packages/console/src/pages/EnterpriseSsoDetails/IdpInitiatedAuth/ConfigForm.tsx index 0beac2f20..d6ffd1fda 100644 --- a/packages/console/src/pages/EnterpriseSsoDetails/IdpInitiatedAuth/ConfigForm.tsx +++ b/packages/console/src/pages/EnterpriseSsoDetails/IdpInitiatedAuth/ConfigForm.tsx @@ -179,14 +179,15 @@ function ConfigForm({ )} options={applications .filter( - // See definition of `applicationsSearchUrl`, there is only non-third party SPA/Traditional applications here, and SAML applications are always third party secured by DB schema, we need to manually exclude other application types here to make TypeScript happy. ( application - ): application is Exclude & { - type: Extract; + ): application is Omit & { + type: Exclude; } => - application.type === ApplicationType.SPA || - application.type === ApplicationType.Traditional + /** + * See definition of `applicationsSearchUrl`, there is only non-third party SPA/Traditional applications here, and SAML applications are always third party secured by DB schema, we need to manually exclude other application types here to make TypeScript happy. + */ + application.type !== ApplicationType.SAML ) .map((application) => ({ value: application.id, diff --git a/packages/core/src/routes/applications/application.ts b/packages/core/src/routes/applications/application.ts index 14b49aec7..a89f4535c 100644 --- a/packages/core/src/routes/applications/application.ts +++ b/packages/core/src/routes/applications/application.ts @@ -346,6 +346,11 @@ export default function applicationRoutes( async (ctx, next) => { const { id } = ctx.guard.params; const { type, protectedAppMetadata } = await queries.applications.findApplicationById(id); + + if (type === ApplicationType.SAML) { + throw new RequestError('application.use_saml_app_api'); + } + if (type === ApplicationType.Protected && protectedAppMetadata) { assertThat( !protectedAppMetadata.customDomains || protectedAppMetadata.customDomains.length === 0, diff --git a/packages/integration-tests/src/tests/api/application/application.test.ts b/packages/integration-tests/src/tests/api/application/application.test.ts index bb6324ee7..2d8d6446b 100644 --- a/packages/integration-tests/src/tests/api/application/application.test.ts +++ b/packages/integration-tests/src/tests/api/application/application.test.ts @@ -35,7 +35,7 @@ describe('application APIs', () => { ); }); - it('should throw error when creating a non-third party SAML application', async () => { + it('should throw error when creating a SAML application', async () => { await expectRejects(createApplication('test-create-saml-app', ApplicationType.SAML), { code: 'application.use_saml_app_api', status: 400, diff --git a/packages/schemas/src/utils/application.ts b/packages/schemas/src/utils/application.ts index c42d65106..bb63a6e6f 100644 --- a/packages/schemas/src/utils/application.ts +++ b/packages/schemas/src/utils/application.ts @@ -6,4 +6,6 @@ export const hasSecrets = (type: ApplicationType) => ApplicationType.MachineToMachine, ApplicationType.Protected, ApplicationType.Traditional, + // SAML applications are used as traditional web applications. + ApplicationType.SAML, ].includes(type);