feat: cloudflare pages integration sync

This commit is contained in:
Stijn-Kuijper
2023-06-19 15:14:57 +02:00
parent 1a54bf34ef
commit 17097965d9
2 changed files with 75 additions and 2 deletions
+71 -1
View File
@@ -37,7 +37,9 @@ import {
INTEGRATION_SUPABASE_API_URL, INTEGRATION_SUPABASE_API_URL,
INTEGRATION_CHECKLY, INTEGRATION_CHECKLY,
INTEGRATION_CHECKLY_API_URL, INTEGRATION_CHECKLY_API_URL,
INTEGRATION_HASHICORP_VAULT INTEGRATION_HASHICORP_VAULT,
INTEGRATION_CLOUDFLARE_PAGES,
INTEGRATION_CLOUDFLARE_PAGES_API_URL
} from "../variables"; } from "../variables";
import { standardRequest} from '../config/request'; import { standardRequest} from '../config/request';
@@ -210,6 +212,14 @@ const syncSecrets = async ({
accessToken accessToken
}); });
break; break;
case INTEGRATION_CLOUDFLARE_PAGES:
await syncSecretsCloudflarePages({
integration,
secrets,
accessId,
accessToken
});
break;
} }
}; };
@@ -1833,4 +1843,64 @@ const syncSecretsHashiCorpVault = async ({
); );
}; };
const syncSecretsCloudflarePages = async ({
integration,
secrets,
accessId,
accessToken,
}: {
integration: IIntegration;
secrets: any;
accessId: string | null;
accessToken: string;
}) => {
// get secrets from cloudflare pages
const getSecretsRes = (
await standardRequest.get(
`${INTEGRATION_CLOUDFLARE_PAGES_API_URL}/client/v4/accounts/${accessId}/pages/projects/${integration.app}`,
{
headers: {
Authorization: `Bearer ${accessToken}`,
"Accept": "application/json",
},
}
)
)
.data.result['deployment_configs'].production['env_vars'];
// copy the secrets object, so we can set deleted keys to null
const secretsObj: any = {...secrets};
for (const [key, val] of Object.entries(secretsObj)) {
secretsObj[key] = { value: val };
}
for await (const key of Object.keys(getSecretsRes)) {
if (!(key in secrets)) {
// case: secret deos not exist in infisical
// -> delete secret from cloudflare pages
secretsObj[key] = null;
}
}
await standardRequest.patch(
`${INTEGRATION_CLOUDFLARE_PAGES_API_URL}/client/v4/accounts/${accessId}/pages/projects/${integration.app}`,
{
data: {
"deployment_configs": {
"production": {
"env_vars": secretsObj
}
}
}
},
{
headers: {
Authorization: `Bearer ${accessToken}`,
"Accept": "application/json",
},
}
)
}
export { syncSecrets }; export { syncSecrets };
+4 -1
View File
@@ -16,6 +16,7 @@ import {
INTEGRATION_SUPABASE, INTEGRATION_SUPABASE,
INTEGRATION_CHECKLY, INTEGRATION_CHECKLY,
INTEGRATION_HASHICORP_VAULT, INTEGRATION_HASHICORP_VAULT,
INTEGRATION_CLOUDFLARE_PAGES
} from "../variables"; } from "../variables";
export interface IIntegration { export interface IIntegration {
@@ -50,7 +51,8 @@ export interface IIntegration {
| "travisci" | "travisci"
| "supabase" | "supabase"
| "checkly" | "checkly"
| "hashicorp-vault"; | "hashicorp-vault"
| "cloudflare-pages";
integrationAuth: Types.ObjectId; integrationAuth: Types.ObjectId;
} }
@@ -138,6 +140,7 @@ const integrationSchema = new Schema<IIntegration>(
INTEGRATION_SUPABASE, INTEGRATION_SUPABASE,
INTEGRATION_CHECKLY, INTEGRATION_CHECKLY,
INTEGRATION_HASHICORP_VAULT, INTEGRATION_HASHICORP_VAULT,
INTEGRATION_CLOUDFLARE_PAGES,
], ],
required: true, required: true,
}, },