feat(secret-sync): Add Azure Devops Secret Sync

This commit is contained in:
carlosmonastyrski
2025-06-05 13:57:41 -03:00
parent 83c53b9d5a
commit 7f8d5ec11a
53 changed files with 1683 additions and 3 deletions
@@ -3,12 +3,14 @@ import { useQuery, UseQueryOptions } from "@tanstack/react-query";
import { apiRequest } from "@app/config/request";
import { appConnectionKeys } from "../queries";
import { TAzureClient } from "./types";
import { AzureDevOpsProjectsResponse, TAzureClient } from "./types";
const azureConnectionKeys = {
all: [...appConnectionKeys.all, "azure"] as const,
listClients: (connectionId: string) =>
[...azureConnectionKeys.all, "clients", connectionId] as const
[...azureConnectionKeys.all, "clients", connectionId] as const,
listDevopsProjects: (connectionId: string) =>
[...azureConnectionKeys.all, "devops-projects", connectionId] as const
};
export const useAzureConnectionListClients = (
@@ -35,3 +37,29 @@ export const useAzureConnectionListClients = (
...options
});
};
export const fetchAzureDevOpsProjects = async (
connectionId: string
): Promise<AzureDevOpsProjectsResponse> => {
if (!connectionId) {
throw new Error("Connection ID is required");
}
const { data } = await apiRequest.get<AzureDevOpsProjectsResponse>(
`/api/v1/app-connections/azure-devops/${connectionId}/projects`
);
return data;
};
export const useGetAzureDevOpsProjects = (
connectionId: string,
options?: Omit<UseQueryOptions<AzureDevOpsProjectsResponse, Error>, "queryKey" | "queryFn">
) => {
return useQuery({
queryKey: azureConnectionKeys.listDevopsProjects(connectionId),
queryFn: () => fetchAzureDevOpsProjects(connectionId),
enabled: Boolean(connectionId),
...options
});
};
@@ -3,3 +3,13 @@ export type TAzureClient = {
appId: string;
id: string;
};
export interface AzureDevOpsProject {
id: string;
name: string;
appId: string;
}
export interface AzureDevOpsProjectsResponse {
projects: AzureDevOpsProject[];
}
@@ -6,6 +6,7 @@ export enum AppConnection {
AzureKeyVault = "azure-key-vault",
AzureAppConfiguration = "azure-app-configuration",
AzureClientSecrets = "azure-client-secrets",
AzureDevOps = "azure-devops",
Databricks = "databricks",
Humanitec = "humanitec",
TerraformCloud = "terraform-cloud",
@@ -45,6 +45,11 @@ export type TDatabricksConnectionOption = TAppConnectionOptionBase & {
app: AppConnection.Databricks;
};
export type TAzureDevOpsConnectionOption = TAppConnectionOptionBase & {
app: AppConnection.AzureDevOps;
oauthClientId?: string;
};
export type THumanitecConnectionOption = TAppConnectionOptionBase & {
app: AppConnection.Humanitec;
};
@@ -108,6 +113,7 @@ export type TAppConnectionOption =
| TAzureAppConfigurationConnectionOption
| TAzureKeyVaultConnectionOption
| TAzureClientSecretsConnectionOption
| TAzureDevOpsConnectionOption
| TDatabricksConnectionOption
| THumanitecConnectionOption
| TTerraformCloudConnectionOption
@@ -131,6 +137,7 @@ export type TAppConnectionOptionMap = {
[AppConnection.AzureKeyVault]: TAzureKeyVaultConnectionOption;
[AppConnection.AzureAppConfiguration]: TAzureAppConfigurationConnectionOption;
[AppConnection.AzureClientSecrets]: TAzureClientSecretsConnectionOption;
[AppConnection.AzureDevOps]: TAzureDevOpsConnectionOption;
[AppConnection.Databricks]: TDatabricksConnectionOption;
[AppConnection.Humanitec]: THumanitecConnectionOption;
[AppConnection.TerraformCloud]: TTerraformCloudConnectionOption;
@@ -0,0 +1,27 @@
import { AppConnection } from "@app/hooks/api/appConnections/enums";
import { TRootAppConnection } from "@app/hooks/api/appConnections/types/root-connection";
export enum AzureDevOpsConnectionMethod {
OAuth = "oauth",
ApiToken = "api-token"
}
export type TAzureDevOpsConnection = TRootAppConnection & {
app: AppConnection.AzureDevOps;
} & (
| {
method: AzureDevOpsConnectionMethod.OAuth;
credentials: {
code: string;
tenantId: string;
orgName: string;
};
}
| {
method: AzureDevOpsConnectionMethod.ApiToken;
credentials: {
apiKey: string;
orgName: string;
};
}
);
@@ -5,6 +5,7 @@ import { TAuth0Connection } from "./auth0-connection";
import { TAwsConnection } from "./aws-connection";
import { TAzureAppConfigurationConnection } from "./azure-app-configuration-connection";
import { TAzureClientSecretsConnection } from "./azure-client-secrets-connection";
import { TAzureDevOpsConnection } from "./azure-devops-connection";
import { TAzureKeyVaultConnection } from "./azure-key-vault-connection";
import { TCamundaConnection } from "./camunda-connection";
import { TDatabricksConnection } from "./databricks-connection";
@@ -28,6 +29,7 @@ export * from "./auth0-connection";
export * from "./aws-connection";
export * from "./azure-app-configuration-connection";
export * from "./azure-client-secrets-connection";
export * from "./azure-devops-connection";
export * from "./azure-key-vault-connection";
export * from "./camunda-connection";
export * from "./databricks-connection";
@@ -54,6 +56,7 @@ export type TAppConnection =
| TAzureKeyVaultConnection
| TAzureAppConfigurationConnection
| TAzureClientSecretsConnection
| TAzureDevOpsConnection
| TDatabricksConnection
| THumanitecConnection
| TTerraformCloudConnection
@@ -103,6 +106,7 @@ export type TAppConnectionMap = {
[AppConnection.AzureKeyVault]: TAzureKeyVaultConnection;
[AppConnection.AzureAppConfiguration]: TAzureAppConfigurationConnection;
[AppConnection.AzureClientSecrets]: TAzureClientSecretsConnection;
[AppConnection.AzureDevOps]: TAzureDevOpsConnection;
[AppConnection.Databricks]: TDatabricksConnection;
[AppConnection.Humanitec]: THumanitecConnection;
[AppConnection.TerraformCloud]: TTerraformCloudConnection;
@@ -5,6 +5,7 @@ export enum SecretSync {
GCPSecretManager = "gcp-secret-manager",
AzureKeyVault = "azure-key-vault",
AzureAppConfiguration = "azure-app-configuration",
AzureDevOps = "azure-devops",
Databricks = "databricks",
Humanitec = "humanitec",
TerraformCloud = "terraform-cloud",
@@ -0,0 +1,16 @@
import { AppConnection } from "@app/hooks/api/appConnections/enums";
import { SecretSync } from "@app/hooks/api/secretSyncs";
import { TRootSecretSync } from "@app/hooks/api/secretSyncs/types/root-sync";
export type TAzureDevOpsSync = TRootSecretSync & {
destination: SecretSync.AzureDevOps;
destinationConfig: {
devopsProjectId: string;
devopsProjectName: string;
};
connection: {
app: AppConnection.AzureDevOps;
name: string;
id: string;
};
};
@@ -5,6 +5,7 @@ import { TOnePassSync } from "./1password-sync";
import { TAwsParameterStoreSync } from "./aws-parameter-store-sync";
import { TAwsSecretsManagerSync } from "./aws-secrets-manager-sync";
import { TAzureAppConfigurationSync } from "./azure-app-configuration-sync";
import { TAzureDevOpsSync } from "./azure-devops-sync";
import { TAzureKeyVaultSync } from "./azure-key-vault-sync";
import { TCamundaSync } from "./camunda-sync";
import { TDatabricksSync } from "./databricks-sync";
@@ -32,6 +33,7 @@ export type TSecretSync =
| TGcpSync
| TAzureKeyVaultSync
| TAzureAppConfigurationSync
| TAzureDevOpsSync
| TDatabricksSync
| THumanitecSync
| TTerraformCloudSync