From d058b3d0ed071afb929349ada59a6329c6ad3eda Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Fri, 30 Aug 2024 08:02:35 +0400 Subject: [PATCH] Dynamic secret support & rest client fix --- package.json | 1 + src/custom/dynamic-secrets.ts | 83 +++++++++++++++++++++++++++++ src/custom/secrets.ts | 99 ++++++++++++++++++++--------------- 3 files changed, 142 insertions(+), 41 deletions(-) create mode 100644 src/custom/dynamic-secrets.ts diff --git a/package.json b/package.json index 8533899..63045d1 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ ], "scripts": { "generate-api:infisical": "openapi-generator-cli generate -i https://app.infisical.com/api/docs/json -g typescript-axios -o ./src/infisicalapi_client --skip-validate-spec --additional-properties=useSingleRequestParameter=true,withSeparateModelsAndApi=true,apiPackage=server,modelPackage=model --openapi-normalizer REFACTOR_ALLOF_WITH_PROPERTIES_ONLY=true && npm run post-generate-api", + "generate-api:infisical-dev": "openapi-generator-cli generate -i http://localhost:8080/api/docs/json -g typescript-axios -o ./src/infisicalapi_client --skip-validate-spec --additional-properties=useSingleRequestParameter=true,withSeparateModelsAndApi=true,apiPackage=server,modelPackage=model --openapi-normalizer REFACTOR_ALLOF_WITH_PROPERTIES_ONLY=true && npm run post-generate-api", "post-generate-api": "rm ./src/infisicalapi_client/git_push.sh", "build": "tsup src/index.ts --out-dir lib --dts --format cjs,esm --tsconfig tsconfig.json --no-splitting" }, diff --git a/src/custom/dynamic-secrets.ts b/src/custom/dynamic-secrets.ts new file mode 100644 index 0000000..ef1e31f --- /dev/null +++ b/src/custom/dynamic-secrets.ts @@ -0,0 +1,83 @@ +import { RawAxiosRequestConfig } from "axios"; +import { Configuration, DefaultApi as InfisicalApi } from "../infisicalapi_client"; +import type { + DefaultApiApiV1DynamicSecretsLeasesLeaseIdDeleteRequest, + DefaultApiApiV1DynamicSecretsLeasesLeaseIdRenewPostRequest, + DefaultApiApiV1DynamicSecretsLeasesPostRequest, + DefaultApiApiV1DynamicSecretsNameDeleteRequest, + DefaultApiApiV1DynamicSecretsPostRequest +} from "../infisicalapi_client"; + +export default class DynamicSecretsClient { + #apiInstance: InfisicalApi; + #requestOptions: RawAxiosRequestConfig | undefined; + constructor(apiInstance: InfisicalApi, requestOptions: RawAxiosRequestConfig | undefined) { + this.#apiInstance = apiInstance; + this.#requestOptions = requestOptions; + } + + async create(options: DefaultApiApiV1DynamicSecretsPostRequest["apiV1DynamicSecretsPostRequest"]) { + const res = await this.#apiInstance.apiV1DynamicSecretsPost( + { + apiV1DynamicSecretsPostRequest: options + }, + this.#requestOptions + ); + + return res.data; + } + + async delete(dynamicSecretName: string, options: DefaultApiApiV1DynamicSecretsNameDeleteRequest["apiV1DynamicSecretsNameDeleteRequest"]) { + const res = await this.#apiInstance.apiV1DynamicSecretsNameDelete( + { + name: dynamicSecretName, + apiV1DynamicSecretsNameDeleteRequest: options + }, + this.#requestOptions + ); + + return res.data; + } + + leases = { + create: async (options: DefaultApiApiV1DynamicSecretsLeasesPostRequest["apiV1DynamicSecretsLeasesPostRequest"]) => { + const res = await this.#apiInstance.apiV1DynamicSecretsLeasesPost( + { + apiV1DynamicSecretsLeasesPostRequest: options + }, + this.#requestOptions + ); + + return res.data; + }, + delete: async ( + leaseId: string, + options: DefaultApiApiV1DynamicSecretsLeasesLeaseIdDeleteRequest["apiV1DynamicSecretsLeasesLeaseIdDeleteRequest"] + ) => { + const res = await this.#apiInstance.apiV1DynamicSecretsLeasesLeaseIdDelete( + { + leaseId: leaseId, + apiV1DynamicSecretsLeasesLeaseIdDeleteRequest: options + }, + this.#requestOptions + ); + + return res.data; + }, + + renew: async ( + leaseId: string, + options: DefaultApiApiV1DynamicSecretsLeasesLeaseIdRenewPostRequest["apiV1DynamicSecretsLeasesLeaseIdRenewPostRequest"] + ) => { + const res = await this.#apiInstance.apiV1DynamicSecretsLeasesLeaseIdRenewPost( + { + leaseId: leaseId, + apiV1DynamicSecretsLeasesLeaseIdRenewPostRequest: options + }, + this.#requestOptions + ); + + return res.data; + } + }; +} diff --git a/src/custom/secrets.ts b/src/custom/secrets.ts index 099d668..f09ee0d 100644 --- a/src/custom/secrets.ts +++ b/src/custom/secrets.ts @@ -1,3 +1,4 @@ +import { RawAxiosRequestConfig } from "axios"; import { Configuration, DefaultApi as InfisicalApi } from "../infisicalapi_client"; import type { DefaultApiApiV3SecretsRawSecretNameDeleteRequest, @@ -45,67 +46,83 @@ const convertBool = (value: boolean | undefined) => (value ? "true" : "false"); export default class SecretsClient { #apiInstance: InfisicalApi; - constructor(apiInstance: InfisicalApi) { + #requestOptions: RawAxiosRequestConfig | undefined; + constructor(apiInstance: InfisicalApi, requestOptions: RawAxiosRequestConfig | undefined) { this.#apiInstance = apiInstance; } listSecrets = async (options: ListSecretsOptions) => { - const res = await this.#apiInstance.apiV3SecretsRawGet({ - environment: options.environment, - workspaceId: options.projectId, - expandSecretReferences: convertBool(options.expandSecretReferences), - includeImports: convertBool(options.includeImports), - recursive: convertBool(options.recursive), - secretPath: options.secretPath, - tagSlugs: options.tagSlugs ? options.tagSlugs.join(",") : undefined - }); + const res = await this.#apiInstance.apiV3SecretsRawGet( + { + environment: options.environment, + workspaceId: options.projectId, + expandSecretReferences: convertBool(options.expandSecretReferences), + includeImports: convertBool(options.includeImports), + recursive: convertBool(options.recursive), + secretPath: options.secretPath, + tagSlugs: options.tagSlugs ? options.tagSlugs.join(",") : undefined + }, + this.#requestOptions + ); return res.data; }; getSecret = async (options: GetSecretOptions) => { - const res = await this.#apiInstance.apiV3SecretsRawSecretNameGet({ - environment: options.environment, - secretName: options.secretName, - workspaceId: options.projectId, - expandSecretReferences: convertBool(options.expandSecretReferences), - includeImports: convertBool(options.includeImports), - secretPath: options.secretPath, - type: options.type, - version: options.version - }); + const res = await this.#apiInstance.apiV3SecretsRawSecretNameGet( + { + environment: options.environment, + secretName: options.secretName, + workspaceId: options.projectId, + expandSecretReferences: convertBool(options.expandSecretReferences), + includeImports: convertBool(options.includeImports), + secretPath: options.secretPath, + type: options.type, + version: options.version + }, + this.#requestOptions + ); return res.data.secret; }; updateSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNamePatchRequest["secretName"], options: UpdateSecretOptions) => { - const res = await this.#apiInstance.apiV3SecretsRawSecretNamePatch({ - secretName, - apiV3SecretsRawSecretNamePatchRequest: { - ...options, - workspaceId: options.projectId - } - }); + const res = await this.#apiInstance.apiV3SecretsRawSecretNamePatch( + { + secretName, + apiV3SecretsRawSecretNamePatchRequest: { + ...options, + workspaceId: options.projectId + } + }, + this.#requestOptions + ); return res.data; }; createSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNamePostRequest["secretName"], options: CreateSecretOptions) => { - const res = await this.#apiInstance.apiV3SecretsRawSecretNamePost({ - secretName, - apiV3SecretsRawSecretNamePostRequest: { - ...options, - workspaceId: options.projectId - } - }); + const res = await this.#apiInstance.apiV3SecretsRawSecretNamePost( + { + secretName, + apiV3SecretsRawSecretNamePostRequest: { + ...options, + workspaceId: options.projectId + } + }, + this.#requestOptions + ); return res.data; }; deleteSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNameDeleteRequest["secretName"], options: DeleteSecretOptions) => { - const res = await this.#apiInstance.apiV3SecretsRawSecretNameDelete({ - secretName, - apiV3SecretsRawSecretNameDeleteRequest: { - ...options, - workspaceId: options.projectId - } - }); + const res = await this.#apiInstance.apiV3SecretsRawSecretNameDelete( + { + secretName, + apiV3SecretsRawSecretNameDeleteRequest: { + ...options, + workspaceId: options.projectId + } + }, + this.#requestOptions + ); return res.data; }; }