Fix call of onCompleted after all promises are resolved

This commit is contained in:
carlosmonastyrski
2025-03-14 12:26:20 -03:00
parent 4c5f3859d6
commit e39d1a0530
17 changed files with 117 additions and 57 deletions
@@ -866,7 +866,7 @@ export const OverviewPage = () => {
<Button <Button
leftIcon={<FontAwesomeIcon icon={faFingerprint} className="pr-2" />} leftIcon={<FontAwesomeIcon icon={faFingerprint} className="pr-2" />}
onClick={() => { onClick={() => {
if (subscription && subscription.dynamicSecret) { if (subscription?.dynamicSecret) {
handlePopUpOpen("addDynamicSecret"); handlePopUpOpen("addDynamicSecret");
return; return;
} }
@@ -655,7 +655,7 @@ export const ActionBar = ({
isOpen={popUp.addDynamicSecret.isOpen} isOpen={popUp.addDynamicSecret.isOpen}
onToggle={(isOpen) => handlePopUpToggle("addDynamicSecret", isOpen)} onToggle={(isOpen) => handlePopUpToggle("addDynamicSecret", isOpen)}
projectSlug={projectSlug} projectSlug={projectSlug}
environments={[{ slug: environment, name: "not-used", id: "not-used" }]} environments={[{ slug: environment, name: environment, id: "not-used" }]}
secretPath={secretPath} secretPath={secretPath}
/> />
<Modal <Modal
@@ -106,6 +106,7 @@ export const AwsElastiCacheInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
let hasErrors = false;
const promises = selectedEnvs.map(async (env) => { const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
@@ -117,15 +118,18 @@ export const AwsElastiCacheInputForm = ({
projectSlug, projectSlug,
environmentSlug: env.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
hasErrors = true;
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -83,7 +83,8 @@ export const AwsIamInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.AwsIam, inputs: provider }, provider: { type: DynamicSecretProviders.AwsIam, inputs: provider },
@@ -92,17 +93,20 @@ export const AwsIamInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
hasErrors = true;
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -116,8 +116,9 @@ export const AzureEntraIdInputForm = ({
environments: selectedEnvs environments: selectedEnvs
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
const promises = selectedEnvs.map(async (environment) => { if (createDynamicSecret.isPending) return;
if (createDynamicSecret.isPending) return; let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
selectedUsers.map(async (user: { id: string; name: string; email: string }) => { selectedUsers.map(async (user: { id: string; name: string; email: string }) => {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
@@ -136,18 +137,21 @@ export const AzureEntraIdInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -106,7 +106,8 @@ export const CassandraInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.Cassandra, inputs: provider }, provider: { type: DynamicSecretProviders.Cassandra, inputs: provider },
@@ -115,17 +116,20 @@ export const CassandraInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -126,7 +126,8 @@ export const ElasticSearchInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.ElasticSearch, inputs: provider }, provider: { type: DynamicSecretProviders.ElasticSearch, inputs: provider },
@@ -135,17 +136,20 @@ export const ElasticSearchInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
const selectedAuthType = watch("provider.auth.type"); const selectedAuthType = watch("provider.auth.type");
@@ -135,7 +135,8 @@ export const LdapInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.Ldap, inputs: provider }, provider: { type: DynamicSecretProviders.Ldap, inputs: provider },
@@ -144,17 +145,20 @@ export const LdapInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -137,7 +137,8 @@ export const MongoAtlasInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.MongoAtlas, inputs: provider }, provider: { type: DynamicSecretProviders.MongoAtlas, inputs: provider },
@@ -146,17 +147,20 @@ export const MongoAtlasInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -107,7 +107,8 @@ export const MongoDBDatabaseInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { provider: {
@@ -123,17 +124,20 @@ export const MongoDBDatabaseInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -115,7 +115,8 @@ export const RabbitMqInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.RabbitMq, inputs: provider }, provider: { type: DynamicSecretProviders.RabbitMq, inputs: provider },
@@ -124,17 +125,20 @@ export const RabbitMqInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
const selectedTags = watch("provider.tags"); const selectedTags = watch("provider.tags");
@@ -100,7 +100,8 @@ export const RedisInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.Redis, inputs: provider }, provider: { type: DynamicSecretProviders.Redis, inputs: provider },
@@ -109,17 +110,20 @@ export const RedisInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -101,7 +101,8 @@ sp_droplogin '{{username}}';`
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.SapAse, inputs: provider }, provider: { type: DynamicSecretProviders.SapAse, inputs: provider },
@@ -110,17 +111,20 @@ sp_droplogin '{{username}}';`
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -101,7 +101,8 @@ DROP USER {{username}};`,
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.SapHana, inputs: provider }, provider: { type: DynamicSecretProviders.SapHana, inputs: provider },
@@ -110,17 +111,20 @@ DROP USER {{username}};`,
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret in environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -104,7 +104,8 @@ export const SnowflakeInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.Snowflake, inputs: provider }, provider: { type: DynamicSecretProviders.Snowflake, inputs: provider },
@@ -113,17 +114,20 @@ export const SnowflakeInputForm = ({
path: secretPath, path: secretPath,
defaultTTL, defaultTTL,
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch (err) { } catch (err) {
createNotification({ createNotification({
type: "error", type: "error",
text: err instanceof Error ? err.message : "Failed to create dynamic secret" text: err instanceof Error ? err.message : "Failed to create dynamic secret"
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (
@@ -194,6 +194,7 @@ export const SqlDatabaseInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
let hasErrors = false;
const promises = selectedEnvs.map(async (env) => { const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
@@ -205,15 +206,18 @@ export const SqlDatabaseInputForm = ({
projectSlug, projectSlug,
environmentSlug: env.slug environmentSlug: env.slug
}); });
onCompleted();
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to create dynamic secret" text: `Failed to create dynamic secret for environment ${env.name}`
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
const handleDatabaseChange = (type: SqlProviders) => { const handleDatabaseChange = (type: SqlProviders) => {
@@ -107,7 +107,8 @@ export const TotpInputForm = ({
}: TForm) => { }: TForm) => {
// wait till previous request is finished // wait till previous request is finished
if (createDynamicSecret.isPending) return; if (createDynamicSecret.isPending) return;
const promises = selectedEnvs.map(async (environment) => { let hasErrors = false;
const promises = selectedEnvs.map(async (env) => {
try { try {
await createDynamicSecret.mutateAsync({ await createDynamicSecret.mutateAsync({
provider: { type: DynamicSecretProviders.Totp, inputs: provider }, provider: { type: DynamicSecretProviders.Totp, inputs: provider },
@@ -116,17 +117,20 @@ export const TotpInputForm = ({
path: secretPath, path: secretPath,
defaultTTL: "1m", defaultTTL: "1m",
projectSlug, projectSlug,
environmentSlug: environment.slug environmentSlug: env.slug
}); });
onCompleted();
} catch (err) { } catch (err) {
createNotification({ createNotification({
type: "error", type: "error",
text: err instanceof Error ? err.message : "Failed to create dynamic secret" text: err instanceof Error ? err.message : "Failed to create dynamic secret"
}); });
hasErrors = true;
} }
}); });
await Promise.all(promises); await Promise.all(promises);
if (hasErrors) {
onCompleted();
}
}; };
return ( return (