From e5584f21b39c9c67cc5cf7ae9f4eec613676ae14 Mon Sep 17 00:00:00 2001 From: Pablo Lara Date: Tue, 17 Jun 2025 14:46:00 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20make=20user=20and=20password=20fields?= =?UTF-8?q?=20optional=20but=20mutually=20required=20fo=E2=80=A6=20(#8044)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../via-credentials/m365-credentials-form.tsx | 4 +- ui/types/components.ts | 8 +- ui/types/formSchemas.ts | 108 ++++++++++-------- 3 files changed, 69 insertions(+), 51 deletions(-) diff --git a/ui/components/providers/workflow/forms/via-credentials/m365-credentials-form.tsx b/ui/components/providers/workflow/forms/via-credentials/m365-credentials-form.tsx index d7c2d0bef1..a34b8ff166 100644 --- a/ui/components/providers/workflow/forms/via-credentials/m365-credentials-form.tsx +++ b/ui/components/providers/workflow/forms/via-credentials/m365-credentials-form.tsx @@ -59,7 +59,7 @@ export const M365CredentialsForm = ({ labelPlacement="inside" placeholder="Enter the User" variant="bordered" - isRequired + isRequired={false} isInvalid={!!control._formState.errors.user} /> diff --git a/ui/types/components.ts b/ui/types/components.ts index 6d9512f65e..9257897d28 100644 --- a/ui/types/components.ts +++ b/ui/types/components.ts @@ -211,16 +211,16 @@ export type M365Credentials = { [ProviderCredentialFields.CLIENT_ID]: string; [ProviderCredentialFields.CLIENT_SECRET]: string; [ProviderCredentialFields.TENANT_ID]: string; - [ProviderCredentialFields.USER]: string; - [ProviderCredentialFields.PASSWORD]: string; - providerId: string; + [ProviderCredentialFields.USER]?: string; + [ProviderCredentialFields.PASSWORD]?: string; + [ProviderCredentialFields.PROVIDER_ID]: string; }; export type GCPDefaultCredentials = { client_id: string; client_secret: string; refresh_token: string; - providerId: string; + [ProviderCredentialFields.PROVIDER_ID]: string; }; export type GCPServiceAccountKey = { diff --git a/ui/types/formSchemas.ts b/ui/types/formSchemas.ts index 5feca84f37..32a58f9336 100644 --- a/ui/types/formSchemas.ts +++ b/ui/types/formSchemas.ts @@ -88,7 +88,6 @@ export const addProviderFormSchema = z providerType: z.literal("m365"), [ProviderCredentialFields.PROVIDER_ALIAS]: z.string(), providerUid: z.string(), - awsCredentialsType: z.string().optional(), }), z.object({ providerType: z.literal("gcp"), @@ -106,32 +105,21 @@ export const addProviderFormSchema = z ); export const addCredentialsFormSchema = (providerType: string) => - z.object({ - [ProviderCredentialFields.PROVIDER_ID]: z.string(), - [ProviderCredentialFields.PROVIDER_TYPE]: z.string(), - ...(providerType === "aws" - ? { - [ProviderCredentialFields.AWS_ACCESS_KEY_ID]: z - .string() - .nonempty("AWS Access Key ID is required"), - [ProviderCredentialFields.AWS_SECRET_ACCESS_KEY]: z - .string() - .nonempty("AWS Secret Access Key is required"), - [ProviderCredentialFields.AWS_SESSION_TOKEN]: z.string().optional(), - } - : providerType === "azure" + z + .object({ + [ProviderCredentialFields.PROVIDER_ID]: z.string(), + [ProviderCredentialFields.PROVIDER_TYPE]: z.string(), + ...(providerType === "aws" ? { - [ProviderCredentialFields.CLIENT_ID]: z + [ProviderCredentialFields.AWS_ACCESS_KEY_ID]: z .string() - .nonempty("Client ID is required"), - [ProviderCredentialFields.CLIENT_SECRET]: z + .nonempty("AWS Access Key ID is required"), + [ProviderCredentialFields.AWS_SECRET_ACCESS_KEY]: z .string() - .nonempty("Client Secret is required"), - [ProviderCredentialFields.TENANT_ID]: z - .string() - .nonempty("Tenant ID is required"), + .nonempty("AWS Secret Access Key is required"), + [ProviderCredentialFields.AWS_SESSION_TOKEN]: z.string().optional(), } - : providerType === "gcp" + : providerType === "azure" ? { [ProviderCredentialFields.CLIENT_ID]: z .string() @@ -139,36 +127,66 @@ export const addCredentialsFormSchema = (providerType: string) => [ProviderCredentialFields.CLIENT_SECRET]: z .string() .nonempty("Client Secret is required"), - [ProviderCredentialFields.REFRESH_TOKEN]: z + [ProviderCredentialFields.TENANT_ID]: z .string() - .nonempty("Refresh Token is required"), + .nonempty("Tenant ID is required"), } - : providerType === "kubernetes" + : providerType === "gcp" ? { - [ProviderCredentialFields.KUBECONFIG_CONTENT]: z + [ProviderCredentialFields.CLIENT_ID]: z .string() - .nonempty("Kubeconfig Content is required"), + .nonempty("Client ID is required"), + [ProviderCredentialFields.CLIENT_SECRET]: z + .string() + .nonempty("Client Secret is required"), + [ProviderCredentialFields.REFRESH_TOKEN]: z + .string() + .nonempty("Refresh Token is required"), } - : providerType === "m365" + : providerType === "kubernetes" ? { - [ProviderCredentialFields.CLIENT_ID]: z + [ProviderCredentialFields.KUBECONFIG_CONTENT]: z .string() - .nonempty("Client ID is required"), - [ProviderCredentialFields.CLIENT_SECRET]: z - .string() - .nonempty("Client Secret is required"), - [ProviderCredentialFields.TENANT_ID]: z - .string() - .nonempty("Tenant ID is required"), - [ProviderCredentialFields.USER]: z - .string() - .nonempty("User is required"), - [ProviderCredentialFields.PASSWORD]: z - .string() - .nonempty("Password is required"), + .nonempty("Kubeconfig Content is required"), } - : {}), - }); + : providerType === "m365" + ? { + [ProviderCredentialFields.CLIENT_ID]: z + .string() + .nonempty("Client ID is required"), + [ProviderCredentialFields.CLIENT_SECRET]: z + .string() + .nonempty("Client Secret is required"), + [ProviderCredentialFields.TENANT_ID]: z + .string() + .nonempty("Tenant ID is required"), + [ProviderCredentialFields.USER]: z.string().optional(), + [ProviderCredentialFields.PASSWORD]: z.string().optional(), + } + : {}), + }) + .superRefine((data: Record, ctx) => { + if (providerType === "m365") { + const hasUser = !!data[ProviderCredentialFields.USER]; + const hasPassword = !!data[ProviderCredentialFields.PASSWORD]; + + if (hasUser && !hasPassword) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "If you provide a user, you must also provide a password", + path: [ProviderCredentialFields.PASSWORD], + }); + } + + if (hasPassword && !hasUser) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "If you provide a password, you must also provide a user", + path: [ProviderCredentialFields.USER], + }); + } + } + }); export const addCredentialsRoleFormSchema = (providerType: string) => providerType === "aws"