feat: added option for disabling github secret deletion

This commit is contained in:
Sheen Capadngan
2024-06-07 19:00:51 +08:00
parent c1ca2a6f8c
commit 76a424dcfb
2 changed files with 59 additions and 37 deletions
@@ -1363,38 +1363,41 @@ const syncSecretsGitHub = async ({
} }
} }
for await (const encryptedSecret of encryptedSecrets) { const metadata = z.record(z.any()).parse(integration.metadata);
if ( if (!metadata.shouldDisableDelete) {
!(encryptedSecret.name in secrets) && for await (const encryptedSecret of encryptedSecrets) {
!(appendices?.prefix !== undefined && !encryptedSecret.name.startsWith(appendices?.prefix)) && if (
!(appendices?.suffix !== undefined && !encryptedSecret.name.endsWith(appendices?.suffix)) !(encryptedSecret.name in secrets) &&
) { !(appendices?.prefix !== undefined && !encryptedSecret.name.startsWith(appendices?.prefix)) &&
switch (integration.scope) { !(appendices?.suffix !== undefined && !encryptedSecret.name.endsWith(appendices?.suffix))
case GithubScope.Org: { ) {
await octokit.request("DELETE /orgs/{org}/actions/secrets/{secret_name}", { switch (integration.scope) {
org: integration.owner as string, case GithubScope.Org: {
secret_name: encryptedSecret.name await octokit.request("DELETE /orgs/{org}/actions/secrets/{secret_name}", {
}); org: integration.owner as string,
break;
}
case GithubScope.Env: {
await octokit.request(
"DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}",
{
repository_id: Number(integration.appId),
environment_name: integration.targetEnvironmentId as string,
secret_name: encryptedSecret.name secret_name: encryptedSecret.name
} });
); break;
break; }
} case GithubScope.Env: {
default: { await octokit.request(
await octokit.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}", { "DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}",
owner: integration.owner as string, {
repo: integration.app as string, repository_id: Number(integration.appId),
secret_name: encryptedSecret.name environment_name: integration.targetEnvironmentId as string,
}); secret_name: encryptedSecret.name
break; }
);
break;
}
default: {
await octokit.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}", {
owner: integration.owner as string,
repo: integration.app as string,
secret_name: encryptedSecret.name
});
break;
}
} }
} }
} }
@@ -33,6 +33,7 @@ import {
Input, Input,
Select, Select,
SelectItem, SelectItem,
Switch,
Tab, Tab,
TabList, TabList,
TabPanel, TabPanel,
@@ -59,7 +60,7 @@ const schema = yup.object({
selectedSourceEnvironment: yup.string().trim().required("Project Environment is required"), selectedSourceEnvironment: yup.string().trim().required("Project Environment is required"),
secretPath: yup.string().trim().required("Secrets Path is required"), secretPath: yup.string().trim().required("Secrets Path is required"),
secretSuffix: yup.string().trim().optional(), secretSuffix: yup.string().trim().optional(),
shouldDisableDelete: yup.boolean().optional(),
scope: yup.mixed<TargetEnv>().oneOf(targetEnv.slice()).required(), scope: yup.mixed<TargetEnv>().oneOf(targetEnv.slice()).required(),
repoIds: yup.mixed().when("scope", { repoIds: yup.mixed().when("scope", {
@@ -98,7 +99,6 @@ type FormData = yup.InferType<typeof schema>;
export default function GitHubCreateIntegrationPage() { export default function GitHubCreateIntegrationPage() {
const router = useRouter(); const router = useRouter();
const { mutateAsync } = useCreateIntegration(); const { mutateAsync } = useCreateIntegration();
const integrationAuthId = const integrationAuthId =
(queryString.parse(router.asPath.split("?")[1]).integrationAuthId as string) ?? ""; (queryString.parse(router.asPath.split("?")[1]).integrationAuthId as string) ?? "";
@@ -120,7 +120,8 @@ export default function GitHubCreateIntegrationPage() {
defaultValues: { defaultValues: {
secretPath: "/", secretPath: "/",
scope: "github-repo", scope: "github-repo",
repoIds: [] repoIds: [],
shouldDisableDelete: false
} }
}); });
@@ -177,7 +178,8 @@ export default function GitHubCreateIntegrationPage() {
app: targetApp.name, // repo name app: targetApp.name, // repo name
owner: targetApp.owner, // repo owner owner: targetApp.owner, // repo owner
metadata: { metadata: {
secretSuffix: data.secretSuffix secretSuffix: data.secretSuffix,
shouldDisableDelete: data.shouldDisableDelete
} }
}); });
}) })
@@ -194,7 +196,8 @@ export default function GitHubCreateIntegrationPage() {
scope: data.scope, scope: data.scope,
owner: integrationAuthOrgs?.find((e) => e.orgId === data.orgId)?.name, owner: integrationAuthOrgs?.find((e) => e.orgId === data.orgId)?.name,
metadata: { metadata: {
secretSuffix: data.secretSuffix secretSuffix: data.secretSuffix,
shouldDisableDelete: data.shouldDisableDelete
} }
}); });
break; break;
@@ -211,7 +214,8 @@ export default function GitHubCreateIntegrationPage() {
owner: repoOwner, owner: repoOwner,
targetEnvironmentId: data.envId, targetEnvironmentId: data.envId,
metadata: { metadata: {
secretSuffix: data.secretSuffix secretSuffix: data.secretSuffix,
shouldDisableDelete: data.shouldDisableDelete
} }
}); });
break; break;
@@ -546,6 +550,21 @@ export default function GitHubCreateIntegrationPage() {
animate={{ opacity: 1, translateX: 0 }} animate={{ opacity: 1, translateX: 0 }}
exit={{ opacity: 0, translateX: 30 }} exit={{ opacity: 0, translateX: 30 }}
> >
<div className="ml-1 mb-5">
<Controller
control={control}
name="shouldDisableDelete"
render={({ field: { onChange, value } }) => (
<Switch
id="delete-github-option"
onCheckedChange={(isChecked) => onChange(isChecked)}
isChecked={value}
>
Disable secrets deletion on Github
</Switch>
)}
/>
</div>
<Controller <Controller
control={control} control={control}
name="secretSuffix" name="secretSuffix"