From 6905029455550879c08b32ccbb18036d16e75d2a Mon Sep 17 00:00:00 2001 From: carlosmonastyrski Date: Fri, 14 Mar 2025 14:59:19 -0300 Subject: [PATCH] Change overview dynamic secret creation modal to set only one env --- .../AwsElastiCacheInputForm.tsx | 50 ++++++------- .../AwsIamInputForm.tsx | 51 ++++++-------- .../AzureEntraIdInputForm.tsx | 70 ++++++++----------- .../CassandraInputForm.tsx | 51 ++++++-------- .../ElasticSearchInputForm.tsx | 50 ++++++------- .../CreateDynamicSecretForm/LdapInputForm.tsx | 50 ++++++------- .../MongoAtlasInputForm.tsx | 50 ++++++------- .../MongoDBInputForm.tsx | 64 ++++++++--------- .../RabbitMqInputForm.tsx | 50 ++++++------- .../RedisInputForm.tsx | 50 ++++++------- .../SapAseInputForm.tsx | 50 ++++++------- .../SapHanaInputForm.tsx | 50 ++++++------- .../SnowflakeInputForm.tsx | 50 ++++++------- .../SqlDatabaseInputForm.tsx | 51 ++++++-------- .../CreateDynamicSecretForm/TotpInputForm.tsx | 54 ++++++-------- 15 files changed, 335 insertions(+), 456 deletions(-) diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AwsElastiCacheInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AwsElastiCacheInputForm.tsx index ae3ddac05..c326f9dbe 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AwsElastiCacheInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AwsElastiCacheInputForm.tsx @@ -53,7 +53,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -91,7 +91,7 @@ export const AwsElastiCacheInputForm = ({ "UserId": "{{username}}" }` }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -102,33 +102,26 @@ export const AwsElastiCacheInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.AwsElastiCache, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - hasErrors = true; - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.AwsElastiCache, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -319,19 +312,18 @@ export const AwsElastiCacheInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} /> diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AwsIamInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AwsIamInputForm.tsx index 1f2e5b0a8..ad8cd1b0e 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AwsIamInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AwsIamInputForm.tsx @@ -42,7 +42,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -68,7 +68,7 @@ export const AwsIamInputForm = ({ } = useForm({ resolver: zodResolver(formSchema), defaultValues: { - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -79,33 +79,27 @@ export const AwsIamInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.AwsIam, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - hasErrors = true; - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - } - }); - await Promise.all(promises); - if (!hasErrors) { + + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.AwsIam, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -307,19 +301,18 @@ export const AwsIamInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AzureEntraIdInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AzureEntraIdInputForm.tsx index f681a75a9..4df6d7b5a 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AzureEntraIdInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/AzureEntraIdInputForm.tsx @@ -62,7 +62,7 @@ const formSchema = z.object({ .string() .min(1) .refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -89,7 +89,7 @@ export const AzureEntraIdInputForm = ({ } = useForm({ resolver: zodResolver(formSchema), defaultValues: { - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); const tenantId = watch("provider.tenantId"); @@ -113,44 +113,37 @@ export const AzureEntraIdInputForm = ({ provider, maxTTL, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - selectedUsers.map(async (user: { id: string; name: string; email: string }) => { - await createDynamicSecret.mutateAsync({ - provider: { - type: DynamicSecretProviders.AzureEntraId, - inputs: { - userId: user.id, - tenantId: provider.tenantId, - email: user.email, - applicationId: provider.applicationId, - clientSecret: provider.clientSecret - } - }, - maxTTL, - name: `${name}-${user.name}`, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); + try { + selectedUsers.map(async (user: { id: string; name: string; email: string }) => { + await createDynamicSecret.mutateAsync({ + provider: { + type: DynamicSecretProviders.AzureEntraId, + inputs: { + userId: user.id, + tenantId: provider.tenantId, + email: user.email, + applicationId: provider.applicationId, + clientSecret: provider.clientSecret + } + }, + maxTTL, + name: `${name}-${user.name}`, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -389,19 +382,18 @@ export const AzureEntraIdInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/CassandraInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/CassandraInputForm.tsx index a770d67b2..cd8486337 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/CassandraInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/CassandraInputForm.tsx @@ -55,7 +55,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -91,7 +91,7 @@ export const CassandraInputForm = ({ resolver: zodResolver(formSchema), defaultValues: { provider: getSqlStatements(), - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -102,33 +102,27 @@ export const CassandraInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.Cassandra, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.Cassandra, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -365,19 +359,18 @@ export const CassandraInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/ElasticSearchInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/ElasticSearchInputForm.tsx index 0fddf332c..eea23a2e5 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/ElasticSearchInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/ElasticSearchInputForm.tsx @@ -76,7 +76,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -111,7 +111,7 @@ export const ElasticSearchInputForm = ({ roles: ["superuser"], port: 443 }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -122,33 +122,26 @@ export const ElasticSearchInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.ElasticSearch, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.ElasticSearch, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -426,19 +419,18 @@ export const ElasticSearchInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/LdapInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/LdapInputForm.tsx index cfa9fd45f..ca0e1befb 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/LdapInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/LdapInputForm.tsx @@ -79,7 +79,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -118,7 +118,7 @@ export const LdapInputForm = ({ rollbackLdif: "", credentialType: CredentialType.Dynamic }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -131,33 +131,26 @@ export const LdapInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.Ldap, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.Ldap, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -396,19 +389,18 @@ export const LdapInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx index 53c716200..524f086d4 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx @@ -66,7 +66,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -112,7 +112,7 @@ export const MongoAtlasInputForm = ({ provider: { roles: [{ databaseName: "", roleName: "" }] }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -133,33 +133,26 @@ export const MongoAtlasInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.MongoAtlas, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.MongoAtlas, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -458,19 +451,18 @@ export const MongoAtlasInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/MongoDBInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/MongoDBInputForm.tsx index 46597291a..87747c4db 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/MongoDBInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/MongoDBInputForm.tsx @@ -56,7 +56,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -87,7 +87,7 @@ export const MongoDBDatabaseInputForm = ({ provider: { roles: [{ roleName: "readWrite" }] }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -103,40 +103,33 @@ export const MongoDBDatabaseInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { - type: DynamicSecretProviders.MongoDB, - inputs: { - ...provider, - port: provider?.port ? provider.port : undefined, - roles: provider.roles.map((el) => el.roleName) - } - }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { + type: DynamicSecretProviders.MongoDB, + inputs: { + ...provider, + port: provider?.port ? provider.port : undefined, + roles: provider.roles.map((el) => el.roleName) + } + }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -348,19 +341,18 @@ export const MongoDBDatabaseInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/RabbitMqInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/RabbitMqInputForm.tsx index ffe2164e8..fdecd23ab 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/RabbitMqInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/RabbitMqInputForm.tsx @@ -60,7 +60,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -100,7 +100,7 @@ export const RabbitMqInputForm = ({ }, tags: [] }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -111,33 +111,26 @@ export const RabbitMqInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.RabbitMq, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.RabbitMq, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -432,19 +425,18 @@ export const RabbitMqInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/RedisInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/RedisInputForm.tsx index 82a5f2bdf..b0f7bd5d6 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/RedisInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/RedisInputForm.tsx @@ -53,7 +53,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -85,7 +85,7 @@ export const RedisInputForm = ({ creationStatement: "ACL SETUSER {{username}} on >{{password}} ~* &* +@all", revocationStatement: "ACL DELUSER {{username}}" }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -96,33 +96,26 @@ export const RedisInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.Redis, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.Redis, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -333,19 +326,18 @@ export const RedisInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SapAseInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SapAseInputForm.tsx index 126b95712..0d8aad9b8 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SapAseInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SapAseInputForm.tsx @@ -51,7 +51,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -86,7 +86,7 @@ sp_role 'grant', 'mon_role', '{{username}}';`, revocationStatement: `sp_dropuser '{{username}}'; sp_droplogin '{{username}}';` }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -97,33 +97,26 @@ sp_droplogin '{{username}}';` maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.SapAse, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.SapAse, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -311,19 +304,18 @@ sp_droplogin '{{username}}';` {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SapHanaInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SapHanaInputForm.tsx index d4d45ea75..565dc849f 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SapHanaInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SapHanaInputForm.tsx @@ -53,7 +53,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -86,7 +86,7 @@ GRANT "MONITORING" TO {{username}};`, DROP USER {{username}};`, renewStatement: "ALTER USER {{username}} VALID UNTIL '{{expiration}}';" }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -97,33 +97,26 @@ DROP USER {{username}};`, maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.SapHana, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret in environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.SapHana, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -331,19 +324,18 @@ DROP USER {{username}};`, {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SnowflakeInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SnowflakeInputForm.tsx index d7e55c183..e9442cbc3 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SnowflakeInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SnowflakeInputForm.tsx @@ -57,7 +57,7 @@ const formSchema = z.object({ .trim() .min(1) .refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -89,7 +89,7 @@ export const SnowflakeInputForm = ({ revocationStatement: "DROP USER {{username}};", renewStatement: "ALTER USER {{username}} SET DAYS_TO_EXPIRY = {{expiration}};" }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -100,33 +100,26 @@ export const SnowflakeInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.Snowflake, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch (err) { - createNotification({ - type: "error", - text: err instanceof Error ? err.message : "Failed to create dynamic secret" - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.Snowflake, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch (err) { + createNotification({ + type: "error", + text: err instanceof Error ? err.message : "Failed to create dynamic secret" + }); } }; @@ -334,19 +327,18 @@ export const SnowflakeInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SqlDatabaseInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SqlDatabaseInputForm.tsx index d80d92c4a..d5088f364 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SqlDatabaseInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/SqlDatabaseInputForm.tsx @@ -82,7 +82,7 @@ const formSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); }), name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -176,7 +176,7 @@ export const SqlDatabaseInputForm = ({ allowedSymbols: "-_.~!*" } }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : undefined } }); @@ -190,33 +190,27 @@ export const SqlDatabaseInputForm = ({ maxTTL, provider, defaultTTL, - environments: selectedEnvs + environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.SqlDatabase, inputs: provider }, - maxTTL, - name, - path: secretPath, - defaultTTL, - projectSlug, - environmentSlug: env.slug - }); - } catch { - createNotification({ - type: "error", - text: `Failed to create dynamic secret for environment ${env.name}` - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.SqlDatabase, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); } }; @@ -669,19 +663,18 @@ export const SqlDatabaseInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top" diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/TotpInputForm.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/TotpInputForm.tsx index 4609d2604..8207a117e 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/TotpInputForm.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/components/ActionBar/CreateDynamicSecretForm/TotpInputForm.tsx @@ -61,7 +61,7 @@ const formSchema = z.object({ .trim() .min(1) .refine((val) => val.toLowerCase() === val, "Must be lowercase"), - environments: z.object({ name: z.string(), slug: z.string() }).array() + environment: z.object({ name: z.string(), slug: z.string() }) }); type TForm = z.infer; @@ -92,7 +92,7 @@ export const TotpInputForm = ({ provider: { configType: ConfigType.URL }, - environments: environments.length === 1 ? environments : [] + environment: environments.length === 1 ? environments[0] : environments[0] } }); @@ -100,36 +100,25 @@ export const TotpInputForm = ({ const createDynamicSecret = useCreateDynamicSecret(); - const handleCreateDynamicSecret = async ({ - name, - provider, - environments: selectedEnvs - }: TForm) => { + const handleCreateDynamicSecret = async ({ name, provider, environment }: TForm) => { // wait till previous request is finished if (createDynamicSecret.isPending) return; - let hasErrors = false; - const promises = selectedEnvs.map(async (env) => { - try { - await createDynamicSecret.mutateAsync({ - provider: { type: DynamicSecretProviders.Totp, inputs: provider }, - maxTTL: "24h", - name, - path: secretPath, - defaultTTL: "1m", - projectSlug, - environmentSlug: env.slug - }); - } catch (err) { - createNotification({ - type: "error", - text: err instanceof Error ? err.message : "Failed to create dynamic secret" - }); - hasErrors = true; - } - }); - await Promise.all(promises); - if (!hasErrors) { + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.Totp, inputs: provider }, + maxTTL: "24h", + name, + path: secretPath, + defaultTTL: "1m", + projectSlug, + environmentSlug: environment.slug + }); onCompleted(); + } catch (err) { + createNotification({ + type: "error", + text: err instanceof Error ? err.message : "Failed to create dynamic secret" + }); } }; @@ -319,19 +308,18 @@ export const TotpInputForm = ({ {environments.length > 1 && ( ( option.name} getOptionValue={(option) => option.slug} menuPlacement="top"