From 1df7292b885e080ccfc67d021e0117e116dbede0 Mon Sep 17 00:00:00 2001 From: Jay Vercellone Date: Fri, 18 Jul 2025 12:04:51 -0700 Subject: [PATCH] Draft --- .fernignore | 9 ++++ .../pipedream/api/AsyncBaseClientBuilder.java | 47 ++++++++++--------- .../pipedream/api/AsyncPipedreamClient.java | 42 +++++++++++++++++ .../api/AsyncPipedreamClientBuilder.java | 42 +++++++++++++++++ .../com/pipedream/api/BaseClientBuilder.java | 47 ++++++++++--------- .../com/pipedream/api/PipedreamClient.java | 42 +++++++++++++++++ .../pipedream/api/PipedreamClientBuilder.java | 42 +++++++++++++++++ 7 files changed, 227 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/pipedream/api/AsyncPipedreamClient.java create mode 100644 src/main/java/com/pipedream/api/AsyncPipedreamClientBuilder.java create mode 100644 src/main/java/com/pipedream/api/PipedreamClient.java create mode 100644 src/main/java/com/pipedream/api/PipedreamClientBuilder.java diff --git a/.fernignore b/.fernignore index 9a3bf65..b89d44f 100644 --- a/.fernignore +++ b/.fernignore @@ -1,4 +1,13 @@ # Specify files that shouldn't be modified by Fern .github/workflows/auto-close-empty-prs.yml +.github/workflows/ci.yml LICENSE +src/main/java/com/pipedream/api/AsyncBaseClient.java +src/main/java/com/pipedream/api/AsyncBaseClientBuilder.java +src/main/java/com/pipedream/api/BaseClient.java +src/main/java/com/pipedream/api/BaseClientBuilder.java +src/main/java/com/pipedream/api/PipedreamClient.java +src/main/java/com/pipedream/api/PipedreamClientBuilder.java +src/main/java/com/pipedream/api/AsyncPipedreamClient.java +src/main/java/com/pipedream/api/AsyncPipedreamClientBuilder.java diff --git a/src/main/java/com/pipedream/api/AsyncBaseClientBuilder.java b/src/main/java/com/pipedream/api/AsyncBaseClientBuilder.java index 9361d1d..cc6e4a9 100644 --- a/src/main/java/com/pipedream/api/AsyncBaseClientBuilder.java +++ b/src/main/java/com/pipedream/api/AsyncBaseClientBuilder.java @@ -10,7 +10,7 @@ import java.util.Optional; import okhttp3.OkHttpClient; -public class AsyncBaseClientBuilder { +public class AsyncBaseClientBuilder> { private Optional timeout = Optional.empty(); private Optional maxRetries = Optional.empty(); @@ -29,65 +29,68 @@ public class AsyncBaseClientBuilder { * Sets clientId. * Defaults to the PIPEDREAM_CLIENT_ID environment variable. */ - public AsyncBaseClientBuilder clientId(String clientId) { + @SuppressWarnings("unchecked") + public T clientId(String clientId) { this.clientId = clientId; - return this; + return (T) this; } /** * Sets clientSecret. * Defaults to the PIPEDREAM_CLIENT_SECRET environment variable. */ - public AsyncBaseClientBuilder clientSecret(String clientSecret) { + @SuppressWarnings("unchecked") + public T clientSecret(String clientSecret) { this.clientSecret = clientSecret; - return this; + return (T) this; } /** * Sets projectEnvironment */ - public AsyncBaseClientBuilder projectEnvironment(String projectEnvironment) { + @SuppressWarnings("unchecked") + public T projectEnvironment(String projectEnvironment) { this.projectEnvironment = projectEnvironment; - return this; + return (T) this; } - public AsyncBaseClientBuilder environment(Environment environment) { + @SuppressWarnings("unchecked") + public T environment(Environment environment) { this.environment = environment; - return this; + return (T) this; } - public AsyncBaseClientBuilder url(String url) { + @SuppressWarnings("unchecked") + public T url(String url) { this.environment = Environment.custom(url); - return this; + return (T) this; } /** * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. */ - public AsyncBaseClientBuilder timeout(int timeout) { + @SuppressWarnings("unchecked") + public T timeout(int timeout) { this.timeout = Optional.of(timeout); - return this; + return (T) this; } /** * Sets the maximum number of retries for the client. Defaults to 2 retries. */ - public AsyncBaseClientBuilder maxRetries(int maxRetries) { + @SuppressWarnings("unchecked") + public T maxRetries(int maxRetries) { this.maxRetries = Optional.of(maxRetries); - return this; + return (T) this; } /** * Sets the underlying OkHttp client */ - public AsyncBaseClientBuilder httpClient(OkHttpClient httpClient) { + @SuppressWarnings("unchecked") + public T httpClient(OkHttpClient httpClient) { this.httpClient = httpClient; - return this; - } - - public AsyncBaseClientBuilder projectId(String projectId) { - clientOptionsBuilder.projectId(projectId); - return this; + return (T) this; } protected ClientOptions buildClientOptions() { diff --git a/src/main/java/com/pipedream/api/AsyncPipedreamClient.java b/src/main/java/com/pipedream/api/AsyncPipedreamClient.java new file mode 100644 index 0000000..4194811 --- /dev/null +++ b/src/main/java/com/pipedream/api/AsyncPipedreamClient.java @@ -0,0 +1,42 @@ +package com.pipedream.api; + +import com.pipedream.api.core.ClientOptions; +import com.pipedream.api.core.Environment; +import org.immutables.value.Value; + +import java.util.Optional; + +@Value +public class AsyncPipedreamClient extends AsyncBaseClient { + public AsyncPipedreamClient(final ClientOptions clientOptions) { + super(clientOptions); + } + + public static AsyncPipedreamClientBuilder builder() { + return new AsyncPipedreamClientBuilder() + .clientId(System.getenv("PIPEDREAM_CLIENT_ID")) + .clientSecret(System.getenv("PIPEDREAM_CLIENT_SECRET")) + .environment(Environment.PROD) + .projectEnvironment(System.getenv("PIPEDREAM_PROJECT_ENVIRONMENT")) + .projectId(System.getenv("PIPEDREAM_PROJECT_ID")); + + } + + /** + * Returns an access token that can be used to authenticate API requests + * + * @return the access token string (if available) + */ + public Optional rawAccessToken() { + final String authorizationHeader = this.clientOptions + .headers(null) + .get("Authorization"); + + // The header might not be defined, so we wrap it as an Optional to + // further process it. The processing consists of removing the `Bearer` + // or `Basic` prefix from the header value. + return Optional + .ofNullable(authorizationHeader) + .map(h -> h.replaceFirst("^.*?\\s+", "")); + } +} diff --git a/src/main/java/com/pipedream/api/AsyncPipedreamClientBuilder.java b/src/main/java/com/pipedream/api/AsyncPipedreamClientBuilder.java new file mode 100644 index 0000000..96b4f5d --- /dev/null +++ b/src/main/java/com/pipedream/api/AsyncPipedreamClientBuilder.java @@ -0,0 +1,42 @@ +package com.pipedream.api; + +import com.pipedream.api.core.ClientOptions; +import com.pipedream.api.core.Environment; +import org.apache.commons.text.StringSubstitutor; +import org.apache.commons.text.lookup.StringLookupFactory; + +/** + * Builder for creating AsyncPipedreamClient instances. + */ +public final class AsyncPipedreamClientBuilder extends AsyncBaseClientBuilder { + private String projectId; + + public AsyncPipedreamClient build() { + return new AsyncPipedreamClient(buildClientOptions()); + } + + public AsyncPipedreamClientBuilder environment(final Environment environment) { + final String patchedUrl = patchUrl(environment.getUrl()); + final Environment withPatchedUrl = Environment.custom(patchedUrl); + super.environment(withPatchedUrl); + return this; + } + + public AsyncPipedreamClientBuilder projectId(final String projectId) { + this.projectId = projectId; + return this; + } + + @Override + public void setVariables(ClientOptions.Builder builder) { + builder.projectId(this.projectId); + } + + private static String patchUrl(final String templateUrl) { + StringSubstitutor sub = new StringSubstitutor( + StringLookupFactory.INSTANCE.environmentVariableStringLookup() + ); + + return sub.replace(templateUrl); + } +} diff --git a/src/main/java/com/pipedream/api/BaseClientBuilder.java b/src/main/java/com/pipedream/api/BaseClientBuilder.java index 13318cd..79c1350 100644 --- a/src/main/java/com/pipedream/api/BaseClientBuilder.java +++ b/src/main/java/com/pipedream/api/BaseClientBuilder.java @@ -10,7 +10,7 @@ import java.util.Optional; import okhttp3.OkHttpClient; -public class BaseClientBuilder { +public class BaseClientBuilder> { private Optional timeout = Optional.empty(); private Optional maxRetries = Optional.empty(); @@ -29,65 +29,68 @@ public class BaseClientBuilder { * Sets clientId. * Defaults to the PIPEDREAM_CLIENT_ID environment variable. */ - public BaseClientBuilder clientId(String clientId) { + @SuppressWarnings("unchecked") + public T clientId(String clientId) { this.clientId = clientId; - return this; + return (T) this; } /** * Sets clientSecret. * Defaults to the PIPEDREAM_CLIENT_SECRET environment variable. */ - public BaseClientBuilder clientSecret(String clientSecret) { + @SuppressWarnings("unchecked") + public T clientSecret(String clientSecret) { this.clientSecret = clientSecret; - return this; + return (T) this; } /** * Sets projectEnvironment */ - public BaseClientBuilder projectEnvironment(String projectEnvironment) { + @SuppressWarnings("unchecked") + public T projectEnvironment(String projectEnvironment) { this.projectEnvironment = projectEnvironment; - return this; + return (T) this; } - public BaseClientBuilder environment(Environment environment) { + @SuppressWarnings("unchecked") + public T environment(Environment environment) { this.environment = environment; - return this; + return (T) this; } - public BaseClientBuilder url(String url) { + @SuppressWarnings("unchecked") + public T url(String url) { this.environment = Environment.custom(url); - return this; + return (T) this; } /** * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. */ - public BaseClientBuilder timeout(int timeout) { + @SuppressWarnings("unchecked") + public T timeout(int timeout) { this.timeout = Optional.of(timeout); - return this; + return (T) this; } /** * Sets the maximum number of retries for the client. Defaults to 2 retries. */ - public BaseClientBuilder maxRetries(int maxRetries) { + @SuppressWarnings("unchecked") + public T maxRetries(int maxRetries) { this.maxRetries = Optional.of(maxRetries); - return this; + return (T) this; } /** * Sets the underlying OkHttp client */ - public BaseClientBuilder httpClient(OkHttpClient httpClient) { + @SuppressWarnings("unchecked") + public T httpClient(OkHttpClient httpClient) { this.httpClient = httpClient; - return this; - } - - public BaseClientBuilder projectId(String projectId) { - clientOptionsBuilder.projectId(projectId); - return this; + return (T) this; } protected ClientOptions buildClientOptions() { diff --git a/src/main/java/com/pipedream/api/PipedreamClient.java b/src/main/java/com/pipedream/api/PipedreamClient.java new file mode 100644 index 0000000..8b99360 --- /dev/null +++ b/src/main/java/com/pipedream/api/PipedreamClient.java @@ -0,0 +1,42 @@ +package com.pipedream.api; + +import com.pipedream.api.core.ClientOptions; +import com.pipedream.api.core.Environment; +import org.immutables.value.Value; + +import java.util.Optional; + +@Value +public class PipedreamClient extends BaseClient { + public PipedreamClient(final ClientOptions clientOptions) { + super(clientOptions); + } + + public static PipedreamClientBuilder builder() { + return new PipedreamClientBuilder() + .clientId(System.getenv("PIPEDREAM_CLIENT_ID")) + .clientSecret(System.getenv("PIPEDREAM_CLIENT_SECRET")) + .environment(Environment.PROD) + .projectEnvironment(System.getenv("PIPEDREAM_PROJECT_ENVIRONMENT")) + .projectId(System.getenv("PIPEDREAM_PROJECT_ID")); + + } + + /** + * Returns an access token that can be used to authenticate API requests + * + * @return the access token string (if available) + */ + public Optional rawAccessToken() { + final String authorizationHeader = this.clientOptions + .headers(null) + .get("Authorization"); + + // The header might not be defined, so we wrap it as an Optional to + // further process it. The processing consists of removing the `Bearer` + // or `Basic` prefix from the header value. + return Optional + .ofNullable(authorizationHeader) + .map(h -> h.replaceFirst("^.*?\\s+", "")); + } +} diff --git a/src/main/java/com/pipedream/api/PipedreamClientBuilder.java b/src/main/java/com/pipedream/api/PipedreamClientBuilder.java new file mode 100644 index 0000000..fafe705 --- /dev/null +++ b/src/main/java/com/pipedream/api/PipedreamClientBuilder.java @@ -0,0 +1,42 @@ +package com.pipedream.api; + +import com.pipedream.api.core.ClientOptions; +import com.pipedream.api.core.Environment; +import org.apache.commons.text.StringSubstitutor; +import org.apache.commons.text.lookup.StringLookupFactory; + +/** + * Builder for creating PipedreamClient instances. + */ +public final class PipedreamClientBuilder extends BaseClientBuilder { + private String projectId; + + public PipedreamClient build() { + return new PipedreamClient(buildClientOptions()); + } + + public PipedreamClientBuilder environment(final Environment environment) { + final String patchedUrl = patchUrl(environment.getUrl()); + final Environment withPatchedUrl = Environment.custom(patchedUrl); + super.environment(withPatchedUrl); + return this; + } + + public PipedreamClientBuilder projectId(final String projectId) { + this.projectId = projectId; + return this; + } + + @Override + public void setVariables(ClientOptions.Builder builder) { + builder.projectId(this.projectId); + } + + private static String patchUrl(final String templateUrl) { + StringSubstitutor sub = new StringSubstitutor( + StringLookupFactory.INSTANCE.environmentVariableStringLookup() + ); + + return sub.replace(templateUrl); + } +}