mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-08 01:27:31 +00:00
134 lines
3.8 KiB
TypeScript
134 lines
3.8 KiB
TypeScript
import { request } from "@app/lib/config/request";
|
|
import { IntegrationUrls } from "@app/services/integration-auth/integration-list";
|
|
import {
|
|
TDeleteFlyioVariable,
|
|
TFlyioListVariables,
|
|
TFlyioSecret,
|
|
TFlyioSyncWithCredentials,
|
|
TPutFlyioVariable
|
|
} from "@app/services/secret-sync/flyio/flyio-sync-types";
|
|
import { SecretSyncError } from "@app/services/secret-sync/secret-sync-errors";
|
|
import { matchesSchema } from "@app/services/secret-sync/secret-sync-fns";
|
|
import { TSecretMap } from "@app/services/secret-sync/secret-sync-types";
|
|
|
|
import { SECRET_SYNC_NAME_MAP } from "../secret-sync-maps";
|
|
|
|
const listFlyioSecrets = async ({ accessToken, appId }: TFlyioListVariables) => {
|
|
const { data } = await request.post<{ data: { app: { secrets: TFlyioSecret[] } } }>(
|
|
IntegrationUrls.FLYIO_API_URL,
|
|
{
|
|
query: "query GetAppSecrets($appId: String!) { app(id: $appId) { id name secrets { name createdAt } } }",
|
|
variables: { appId }
|
|
},
|
|
{
|
|
headers: {
|
|
Authorization: `Bearer ${accessToken}`,
|
|
"Content-Type": "application/json",
|
|
Accept: "application/json"
|
|
}
|
|
}
|
|
);
|
|
|
|
return data.data.app.secrets.map((s) => s.name);
|
|
};
|
|
|
|
const putFlyioSecrets = async ({ accessToken, appId, secretMap }: TPutFlyioVariable) => {
|
|
return request.post(
|
|
IntegrationUrls.FLYIO_API_URL,
|
|
{
|
|
query:
|
|
"mutation SetAppSecrets($appId: ID!, $secrets: [SecretInput!]!) { setSecrets(input: { appId: $appId, secrets: $secrets }) { app { name } release { version } } }",
|
|
variables: {
|
|
appId,
|
|
secrets: Object.entries(secretMap).map(([key, { value }]) => ({ key, value }))
|
|
}
|
|
},
|
|
{
|
|
headers: {
|
|
Authorization: `Bearer ${accessToken}`,
|
|
"Content-Type": "application/json"
|
|
}
|
|
}
|
|
);
|
|
};
|
|
|
|
const deleteFlyioSecrets = async ({ accessToken, appId, keys }: TDeleteFlyioVariable) => {
|
|
return request.post(
|
|
IntegrationUrls.FLYIO_API_URL,
|
|
{
|
|
query:
|
|
"mutation UnsetAppSecrets($appId: ID!, $keys: [String!]!) { unsetSecrets(input: { appId: $appId, keys: $keys }) { app { name } release { version } } }",
|
|
variables: {
|
|
appId,
|
|
keys
|
|
}
|
|
},
|
|
{
|
|
headers: {
|
|
Authorization: `Bearer ${accessToken}`,
|
|
"Content-Type": "application/json"
|
|
}
|
|
}
|
|
);
|
|
};
|
|
|
|
export const FlyioSyncFns = {
|
|
syncSecrets: async (secretSync: TFlyioSyncWithCredentials, secretMap: TSecretMap) => {
|
|
const {
|
|
connection,
|
|
environment,
|
|
destinationConfig: { appId }
|
|
} = secretSync;
|
|
|
|
const { accessToken } = connection.credentials;
|
|
|
|
try {
|
|
await putFlyioSecrets({ accessToken, appId, secretMap });
|
|
} catch (error) {
|
|
throw new SecretSyncError({
|
|
error
|
|
});
|
|
}
|
|
|
|
if (secretSync.syncOptions.disableSecretDeletion) return;
|
|
|
|
const secrets = await listFlyioSecrets({ accessToken, appId });
|
|
|
|
const keys = secrets.filter(
|
|
(secret) =>
|
|
matchesSchema(secret, environment?.slug || "", secretSync.syncOptions.keySchema) && !(secret in secretMap)
|
|
);
|
|
|
|
try {
|
|
await deleteFlyioSecrets({ accessToken, appId, keys });
|
|
} catch (error) {
|
|
throw new SecretSyncError({
|
|
error
|
|
});
|
|
}
|
|
},
|
|
removeSecrets: async (secretSync: TFlyioSyncWithCredentials, secretMap: TSecretMap) => {
|
|
const {
|
|
connection,
|
|
destinationConfig: { appId }
|
|
} = secretSync;
|
|
|
|
const { accessToken } = connection.credentials;
|
|
|
|
const secrets = await listFlyioSecrets({ accessToken, appId });
|
|
|
|
const keys = secrets.filter((secret) => secret in secretMap);
|
|
|
|
try {
|
|
await deleteFlyioSecrets({ accessToken, appId, keys });
|
|
} catch (error) {
|
|
throw new SecretSyncError({
|
|
error
|
|
});
|
|
}
|
|
},
|
|
getSecrets: async (secretSync: TFlyioSyncWithCredentials) => {
|
|
throw new Error(`${SECRET_SYNC_NAME_MAP[secretSync.destination]} does not support importing secrets.`);
|
|
}
|
|
};
|