From 32acc370a44f3eeb47c7c834afc9a9caabf47fbf Mon Sep 17 00:00:00 2001 From: nafees nazik Date: Sat, 21 Oct 2023 01:36:23 +0530 Subject: [PATCH] feat: add delete method --- backend/src/integrations/sync.ts | 105 ++++++++++++++---- .../src/validation/hasuraCloudIntegration.ts | 11 ++ 2 files changed, 92 insertions(+), 24 deletions(-) diff --git a/backend/src/integrations/sync.ts b/backend/src/integrations/sync.ts index 7ef301527..cdc2ae193 100644 --- a/backend/src/integrations/sync.ts +++ b/backend/src/integrations/sync.ts @@ -65,7 +65,10 @@ import { Octokit } from "@octokit/rest"; import _ from "lodash"; import sodium from "libsodium-wrappers"; import { standardRequest } from "../config/request"; -import { ZGetTenantEnv } from "../validation/hasuraCloudIntegration"; +import { + ZGetTenantEnv, + ZUpdateTenantEnv +} from "../validation/hasuraCloudIntegration"; const getSecretKeyValuePair = ( secrets: Record @@ -3136,37 +3139,91 @@ const syncSecretsHasuraCloud = async ({ const { data: { - getTenantEnv: { hash: currentHash } + getTenantEnv: { hash, envVars } } } = ZGetTenantEnv.parse(res.data); - const envs = Object.keys(secrets).reduce<{ key: string; value: any }[]>((prev, key) => { - if (secrets?.[key]?.value) { - prev.push({ key, value: secrets[key].value }); + let currentEnvKeys = new Set(); + + if (envVars.environment) { + currentEnvKeys = new Set(Object.keys(envVars.environment)); + } + const keysToAdd = new Set(Object.keys(secrets)); + + const envKeysToDelete = new Set(); + const envs: { key: string; value: any }[] = []; + + for (const [key, value] of Object.entries(secrets)) { + if (value.value) { + envs.push({ key, value: value.value }); } - return prev; - }, []); + } - const variables = { - currentHash, - envs, - tenantId: integration.appId - }; + for (const currentKey of currentEnvKeys) { + if (!keysToAdd.has(currentKey)) { + envKeysToDelete.add(currentKey); + } + } - await standardRequest.post( - INTEGRATION_HASURA_CLOUD_API_URL, - { - query: - "mutation MyQuery($currentHash: String!, $envs: [UpdateEnvObject!]!, $tenantId: uuid!) { updateTenantEnv(currentHash: $currentHash, envs: $envs, tenantId: $tenantId) { hash envVars} }", - variables - }, - { - headers: { - Authorization: `pat ${accessToken}`, - "Content-Type": "application/json" + let currentHash = hash; + + if (envs.length) { + const addRequest = await standardRequest.post( + INTEGRATION_HASURA_CLOUD_API_URL, + { + query: + "mutation MyQuery($currentHash: String!, $envs: [UpdateEnvObject!]!, $tenantId: uuid!) { updateTenantEnv(currentHash: $currentHash, envs: $envs, tenantId: $tenantId) { hash envVars} }", + variables: { + currentHash, + envs, + tenantId: integration.appId + } + }, + { + headers: { + Authorization: `pat ${accessToken}`, + "Content-Type": "application/json" + } } + ); + + const addRequestResponse = ZUpdateTenantEnv.safeParse(addRequest.data); + if (addRequestResponse.success) { + currentHash = addRequestResponse.data.data.updateTenantEnv.hash; } - ); + } + + if (envKeysToDelete.size > 0) { + await standardRequest.post( + INTEGRATION_HASURA_CLOUD_API_URL, + { + query: ` + mutation deleteTenantEnv($id: uuid!, $currentHash: String!, $env: [String!]!) { + deleteTenantEnv(tenantId: $id, currentHash: $currentHash, deleteEnvs: $env) { + hash + envVars + } + } + + `, + variables: { + id: integration.appId, + currentHash, + env: Array.from(envKeysToDelete) + } + }, + { + headers: { + Authorization: `pat ${accessToken}`, + "Content-Type": "application/json" + } + } + ); + + + + + } }; export { syncSecrets }; diff --git a/backend/src/validation/hasuraCloudIntegration.ts b/backend/src/validation/hasuraCloudIntegration.ts index 7ff967f0c..63b037370 100644 --- a/backend/src/validation/hasuraCloudIntegration.ts +++ b/backend/src/validation/hasuraCloudIntegration.ts @@ -3,6 +3,17 @@ import * as z from "zod"; export const ZGetTenantEnv = z.object({ data: z.object({ getTenantEnv: z.object({ + hash: z.string(), + envVars: z.object({ + environment: z.record(z.any()).optional() + }) + }) + }) +}); + +export const ZUpdateTenantEnv = z.object({ + data: z.object({ + updateTenantEnv: z.object({ hash: z.string(), envVars: z.record(z.any()) })