From 7ad86c978f78339a175f6c4259360b61660ef9e7 Mon Sep 17 00:00:00 2001 From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 19:07:06 +0000 Subject: [PATCH] SDK regeneration --- .fern/metadata.json | 12 + README.md | 37 +- build.gradle | 13 +- .../api/core/BaseClientApiException.java | 4 +- .../com/pipedream/api/core/ClientOptions.java | 20 +- .../api/core/NullableNonemptyFilter.java | 5 +- .../com/pipedream/api/core/ObjectMappers.java | 9 + .../pipedream/api/core/RetryInterceptor.java | 118 +++++- .../resources/accounts/AccountsClient.java | 36 +- .../accounts/AsyncAccountsClient.java | 38 +- .../accounts/AsyncRawAccountsClient.java | 99 ++--- .../resources/accounts/RawAccountsClient.java | 98 ++--- .../requests/DeleteAccountsRequest.java | 59 +++ .../requests/DeleteByAppAccountsRequest.java | 59 +++ ...tRequest.java => ListAccountsRequest.java} | 16 +- ...uest.java => RetrieveAccountsRequest.java} | 16 +- .../api/resources/actions/ActionsClient.java | 24 +- .../resources/actions/AsyncActionsClient.java | 25 +- .../actions/AsyncRawActionsClient.java | 95 +++-- .../resources/actions/RawActionsClient.java | 95 ++--- .../requests/ConfigurePropActionsRequest.java | 103 +++++ ...stRequest.java => ListActionsRequest.java} | 16 +- .../requests/ReloadPropsActionsRequest.java | 103 +++++ ...quest.java => RetrieveActionsRequest.java} | 16 +- .../actions/requests/RunActionOpts.java | 57 ++- .../appcategories/AppCategoriesClient.java | 12 +- .../AsyncAppCategoriesClient.java | 13 +- .../AsyncRawAppCategoriesClient.java | 41 +- .../appcategories/RawAppCategoriesClient.java | 39 +- .../RetrieveAppCategoriesRequest.java | 59 +++ .../api/resources/apps/AppsClient.java | 18 +- .../api/resources/apps/AsyncAppsClient.java | 19 +- .../resources/apps/AsyncRawAppsClient.java | 49 ++- .../api/resources/apps/RawAppsClient.java | 49 ++- ...sListRequest.java => ListAppsRequest.java} | 44 +- .../apps/requests/RetrieveAppsRequest.java | 59 +++ ...java => ListAppsRequestSortDirection.java} | 16 +- ...rtKey.java => ListAppsRequestSortKey.java} | 20 +- .../components/AsyncComponentsClient.java | 25 +- .../components/AsyncRawComponentsClient.java | 82 ++-- .../components/ComponentsClient.java | 24 +- .../components/RawComponentsClient.java | 82 ++-- .../ConfigurePropComponentsRequest.java | 103 +++++ ...equest.java => ListComponentsRequest.java} | 16 +- .../ReloadPropsComponentsRequest.java | 103 +++++ ...st.java => RetrieveComponentsRequest.java} | 16 +- .../AsyncDeployedTriggersClient.java | 36 +- .../AsyncRawDeployedTriggersClient.java | 126 +++--- .../DeployedTriggersClient.java | 36 +- .../RawDeployedTriggersClient.java | 124 +++--- ...ava => DeleteDeployedTriggersRequest.java} | 20 +- ....java => ListDeployedTriggersRequest.java} | 20 +- ...=> ListEventsDeployedTriggersRequest.java} | 20 +- ... ListWebhooksDeployedTriggersRequest.java} | 22 +- ...ListWorkflowsDeployedTriggersRequest.java} | 22 +- ...a => RetrieveDeployedTriggersRequest.java} | 20 +- .../filestash/AsyncFileStashClient.java | 6 +- .../filestash/AsyncRawFileStashClient.java | 15 +- .../resources/filestash/FileStashClient.java | 6 +- .../filestash/RawFileStashClient.java | 15 +- ...java => DownloadFileFileStashRequest.java} | 20 +- .../AsyncRawOauthTokensClient.java | 11 +- .../oauthtokens/RawOauthTokensClient.java | 10 +- .../projects/AsyncProjectsClient.java | 13 +- .../projects/AsyncRawProjectsClient.java | 33 +- .../resources/projects/ProjectsClient.java | 12 +- .../resources/projects/RawProjectsClient.java | 33 +- .../requests/RetrieveInfoProjectsRequest.java | 59 +++ .../resources/proxy/AsyncRawProxyClient.java | 112 +++--- .../api/resources/proxy/RawProxyClient.java | 99 +++-- ...teRequest.java => DeleteProxyRequest.java} | 20 +- ...xyGetRequest.java => GetProxyRequest.java} | 20 +- ...tchRequest.java => PatchProxyRequest.java} | 20 +- ...PostRequest.java => PostProxyRequest.java} | 20 +- ...xyPutRequest.java => PutProxyRequest.java} | 20 +- .../tokens/AsyncRawTokensClient.java | 26 +- .../resources/tokens/AsyncTokensClient.java | 6 +- .../api/resources/tokens/RawTokensClient.java | 28 +- .../api/resources/tokens/TokensClient.java | 6 +- ...equest.java => ValidateTokensRequest.java} | 20 +- .../triggers/AsyncRawTriggersClient.java | 95 +++-- .../triggers/AsyncTriggersClient.java | 25 +- .../resources/triggers/RawTriggersClient.java | 95 ++--- .../resources/triggers/TriggersClient.java | 24 +- .../ConfigurePropTriggersRequest.java | 103 +++++ .../triggers/requests/DeployTriggerOpts.java | 32 +- ...tRequest.java => ListTriggersRequest.java} | 16 +- .../requests/ReloadPropsTriggersRequest.java | 103 +++++ ...uest.java => RetrieveTriggersRequest.java} | 16 +- .../resources/users/AsyncRawUsersClient.java | 26 +- .../api/resources/users/AsyncUsersClient.java | 15 +- .../api/resources/users/RawUsersClient.java | 27 +- .../api/resources/users/UsersClient.java | 15 +- .../DeleteExternalUserUsersRequest.java | 59 +++ .../java/com/pipedream/api/types/Account.java | 148 ++++++- .../java/com/pipedream/api/types/App.java | 115 +++++- .../com/pipedream/api/types/AppCategory.java | 25 +- .../com/pipedream/api/types/Component.java | 111 ++++- .../pipedream/api/types/ConfigurableProp.java | 264 +++++++++++- .../types/ConfigurablePropAirtableBaseId.java | 264 +++++++++++- .../ConfigurablePropAirtableFieldId.java | 264 +++++++++++- .../ConfigurablePropAirtableTableId.java | 264 +++++++++++- .../types/ConfigurablePropAirtableViewId.java | 264 +++++++++++- .../api/types/ConfigurablePropAlert.java | 264 +++++++++++- .../api/types/ConfigurablePropAny.java | 264 +++++++++++- .../api/types/ConfigurablePropApp.java | 264 +++++++++++- .../api/types/ConfigurablePropApphook.java | 351 +++++++++++++++- .../api/types/ConfigurablePropBoolean.java | 264 +++++++++++- .../api/types/ConfigurablePropDb.java | 264 +++++++++++- .../api/types/ConfigurablePropDiscord.java | 264 +++++++++++- .../types/ConfigurablePropDiscordChannel.java | 264 +++++++++++- .../ConfigurablePropDiscordChannelArray.java | 264 +++++++++++- .../api/types/ConfigurablePropHttp.java | 293 +++++++++++++- .../api/types/ConfigurablePropInteger.java | 351 +++++++++++++++- .../types/ConfigurablePropIntegerArray.java | 380 +++++++++++++++++- .../api/types/ConfigurablePropObject.java | 264 +++++++++++- .../api/types/ConfigurablePropSql.java | 289 ++++++++++++- .../api/types/ConfigurablePropString.java | 293 +++++++++++++- .../types/ConfigurablePropStringArray.java | 322 ++++++++++++++- .../api/types/ConfigurablePropTimer.java | 343 +++++++++++++++- .../api/types/ConfigurePropOpts.java | 32 +- .../api/types/ConfigurePropResponse.java | 91 ++++- .../api/types/DeployedComponent.java | 61 ++- .../api/types/ProjectInfoResponseApp.java | 25 +- .../com/pipedream/api/types/PropOption.java | 28 +- .../pipedream/api/types/ReloadPropsOpts.java | 32 +- .../api/types/RunActionResponse.java | 25 +- .../pipedream/api/types/ToolAnnotations.java | 113 +++++- .../api/types/ValidateTokenResponse.java | 260 +++++++++++- .../pipedream/api/OauthTokensWireTest.java | 119 ------ .../com/pipedream/api/TokensWireTest.java | 108 ----- 131 files changed, 9673 insertions(+), 1727 deletions(-) create mode 100644 .fern/metadata.json create mode 100644 src/main/java/com/pipedream/api/resources/accounts/requests/DeleteAccountsRequest.java create mode 100644 src/main/java/com/pipedream/api/resources/accounts/requests/DeleteByAppAccountsRequest.java rename src/main/java/com/pipedream/api/resources/accounts/requests/{AccountsListRequest.java => ListAccountsRequest.java} (95%) rename src/main/java/com/pipedream/api/resources/accounts/requests/{AccountsRetrieveRequest.java => RetrieveAccountsRequest.java} (84%) create mode 100644 src/main/java/com/pipedream/api/resources/actions/requests/ConfigurePropActionsRequest.java rename src/main/java/com/pipedream/api/resources/actions/requests/{ActionsListRequest.java => ListActionsRequest.java} (92%) create mode 100644 src/main/java/com/pipedream/api/resources/actions/requests/ReloadPropsActionsRequest.java rename src/main/java/com/pipedream/api/resources/actions/requests/{ActionsRetrieveRequest.java => RetrieveActionsRequest.java} (83%) create mode 100644 src/main/java/com/pipedream/api/resources/appcategories/requests/RetrieveAppCategoriesRequest.java rename src/main/java/com/pipedream/api/resources/apps/requests/{AppsListRequest.java => ListAppsRequest.java} (85%) create mode 100644 src/main/java/com/pipedream/api/resources/apps/requests/RetrieveAppsRequest.java rename src/main/java/com/pipedream/api/resources/apps/types/{AppsListRequestSortDirection.java => ListAppsRequestSortDirection.java} (72%) rename src/main/java/com/pipedream/api/resources/apps/types/{AppsListRequestSortKey.java => ListAppsRequestSortKey.java} (71%) create mode 100644 src/main/java/com/pipedream/api/resources/components/requests/ConfigurePropComponentsRequest.java rename src/main/java/com/pipedream/api/resources/components/requests/{ComponentsListRequest.java => ListComponentsRequest.java} (93%) create mode 100644 src/main/java/com/pipedream/api/resources/components/requests/ReloadPropsComponentsRequest.java rename src/main/java/com/pipedream/api/resources/components/requests/{ComponentsRetrieveRequest.java => RetrieveComponentsRequest.java} (83%) rename src/main/java/com/pipedream/api/resources/deployedtriggers/requests/{DeployedTriggersDeleteRequest.java => DeleteDeployedTriggersRequest.java} (88%) rename src/main/java/com/pipedream/api/resources/deployedtriggers/requests/{DeployedTriggersListRequest.java => ListDeployedTriggersRequest.java} (93%) rename src/main/java/com/pipedream/api/resources/deployedtriggers/requests/{DeployedTriggersListEventsRequest.java => ListEventsDeployedTriggersRequest.java} (87%) rename src/main/java/com/pipedream/api/resources/deployedtriggers/requests/{DeployedTriggersListWebhooksRequest.java => ListWebhooksDeployedTriggersRequest.java} (82%) rename src/main/java/com/pipedream/api/resources/deployedtriggers/requests/{DeployedTriggersListWorkflowsRequest.java => ListWorkflowsDeployedTriggersRequest.java} (82%) rename src/main/java/com/pipedream/api/resources/deployedtriggers/requests/{DeployedTriggersRetrieveRequest.java => RetrieveDeployedTriggersRequest.java} (82%) rename src/main/java/com/pipedream/api/resources/filestash/requests/{FileStashDownloadFileRequest.java => DownloadFileFileStashRequest.java} (79%) create mode 100644 src/main/java/com/pipedream/api/resources/projects/requests/RetrieveInfoProjectsRequest.java rename src/main/java/com/pipedream/api/resources/proxy/requests/{ProxyDeleteRequest.java => DeleteProxyRequest.java} (88%) rename src/main/java/com/pipedream/api/resources/proxy/requests/{ProxyGetRequest.java => GetProxyRequest.java} (88%) rename src/main/java/com/pipedream/api/resources/proxy/requests/{ProxyPatchRequest.java => PatchProxyRequest.java} (92%) rename src/main/java/com/pipedream/api/resources/proxy/requests/{ProxyPostRequest.java => PostProxyRequest.java} (92%) rename src/main/java/com/pipedream/api/resources/proxy/requests/{ProxyPutRequest.java => PutProxyRequest.java} (92%) rename src/main/java/com/pipedream/api/resources/tokens/requests/{TokensValidateRequest.java => ValidateTokensRequest.java} (88%) create mode 100644 src/main/java/com/pipedream/api/resources/triggers/requests/ConfigurePropTriggersRequest.java rename src/main/java/com/pipedream/api/resources/triggers/requests/{TriggersListRequest.java => ListTriggersRequest.java} (92%) create mode 100644 src/main/java/com/pipedream/api/resources/triggers/requests/ReloadPropsTriggersRequest.java rename src/main/java/com/pipedream/api/resources/triggers/requests/{TriggersRetrieveRequest.java => RetrieveTriggersRequest.java} (83%) create mode 100644 src/main/java/com/pipedream/api/resources/users/requests/DeleteExternalUserUsersRequest.java delete mode 100644 src/test/java/com/pipedream/api/OauthTokensWireTest.java delete mode 100644 src/test/java/com/pipedream/api/TokensWireTest.java diff --git a/.fern/metadata.json b/.fern/metadata.json new file mode 100644 index 0000000..2d412e6 --- /dev/null +++ b/.fern/metadata.json @@ -0,0 +1,12 @@ +{ + "cliVersion": "1.0.4", + "generatorName": "fernapi/fern-java-sdk", + "generatorVersion": "3.15.1", + "generatorConfig": { + "publish-to": "central", + "client-class-name": "BaseClient", + "custom-dependencies": [ + "api org.apache.commons:commons-text:1.13.1" + ] + } +} \ No newline at end of file diff --git a/README.md b/README.md index 06d55b9..63e12c9 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,22 @@ The Pipedream Java library provides convenient access to the Pipedream APIs from Java. +## Table of Contents + +- [Installation](#installation) +- [Usage](#usage) +- [Environments](#environments) +- [Base Url](#base-url) +- [Exception Handling](#exception-handling) +- [Advanced](#advanced) + - [Custom Client](#custom-client) + - [Retries](#retries) + - [Timeouts](#timeouts) + - [Custom Headers](#custom-headers) + - [Access Raw Response Data](#access-raw-response-data) +- [Contributing](#contributing) +- [Reference](#reference) + ## Installation ### Gradle @@ -25,7 +41,7 @@ Add the dependency in your `pom.xml` file: com.pipedream pipedream - 1.1.0 + 1.1.1 ``` @@ -104,7 +120,7 @@ try{ ### Custom Client -This SDK is built to work with any instance of `OkHttpClient`. By default, if no client is provided, the SDK will construct one. +This SDK is built to work with any instance of `OkHttpClient`. By default, if no client is provided, the SDK will construct one. However, you can pass your own client like so: ```java @@ -123,7 +139,9 @@ BaseClient client = BaseClient The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long as the request is deemed retryable and the number of retry attempts has not grown larger than the configured -retry limit (default: 2). +retry limit (default: 2). Before defaulting to exponential backoff, the SDK will first attempt to respect +the `Retry-After` header (as either in seconds or as an HTTP date), and then the `X-RateLimit-Reset` header +(as a Unix timestamp in epoch seconds); failing both of those, it will fall back to exponential backoff. A request is deemed retryable when any of the following HTTP status codes is returned: @@ -192,6 +210,19 @@ client.actions().run( ); ``` +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `withRawResponse()` method. +The `withRawResponse()` method returns a raw client that wraps all responses with `body()` and `headers()` methods. +(A normal client's `response` is identical to a raw client's `response.body()`.) + +```java +RunHttpResponse response = client.actions().withRawResponse().run(...); + +System.out.println(response.body()); +System.out.println(response.headers().get("X-My-Header")); +``` + ## Contributing While we value open-source contributions to this SDK, this library is generated programmatically. diff --git a/build.gradle b/build.gradle index 0db3646..8c962d4 100644 --- a/build.gradle +++ b/build.gradle @@ -14,15 +14,14 @@ repositories { } dependencies { - api 'com.squareup.okhttp3:okhttp:4.12.0' - api 'com.fasterxml.jackson.core:jackson-databind:2.17.2' - api 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.17.2' - api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.2' + api 'com.squareup.okhttp3:okhttp:5.2.1' + api 'com.fasterxml.jackson.core:jackson-databind:2.18.2' + api 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.18.2' + api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.18.2' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.2' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2' api 'org.apache.commons:commons-text:1.13.1' - testImplementation 'com.squareup.okhttp3:mockwebserver:4.12.0' } @@ -49,7 +48,7 @@ java { group = 'com.pipedream' -version = '1.1.0' +version = '1.1.1' jar { dependsOn(":generatePomFileForMavenPublication") @@ -80,7 +79,7 @@ publishing { maven(MavenPublication) { groupId = 'com.pipedream' artifactId = 'pipedream' - version = '1.1.0' + version = '1.1.1' from components.java pom { name = 'pipedream' diff --git a/src/main/java/com/pipedream/api/core/BaseClientApiException.java b/src/main/java/com/pipedream/api/core/BaseClientApiException.java index a2680b0..f0e59f6 100644 --- a/src/main/java/com/pipedream/api/core/BaseClientApiException.java +++ b/src/main/java/com/pipedream/api/core/BaseClientApiException.java @@ -65,9 +65,9 @@ public Map> headers() { return this.headers; } - @java.lang.Override + @Override public String toString() { return "BaseClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " - + body + "}"; + + ObjectMappers.stringify(body) + "}"; } } diff --git a/src/main/java/com/pipedream/api/core/ClientOptions.java b/src/main/java/com/pipedream/api/core/ClientOptions.java index 8132d65..7c9c07c 100644 --- a/src/main/java/com/pipedream/api/core/ClientOptions.java +++ b/src/main/java/com/pipedream/api/core/ClientOptions.java @@ -21,6 +21,8 @@ public final class ClientOptions { private final int timeout; + private final int maxRetries; + private String projectId; private ClientOptions( @@ -29,21 +31,23 @@ private ClientOptions( Map> headerSuppliers, OkHttpClient httpClient, int timeout, + int maxRetries, String projectId) { this.environment = environment; this.headers = new HashMap<>(); this.headers.putAll(headers); this.headers.putAll(new HashMap() { { - put("User-Agent", "com.pipedream:pipedream/1.1.0"); + put("User-Agent", "com.pipedream:pipedream/1.1.1"); put("X-Fern-Language", "JAVA"); put("X-Fern-SDK-Name", "com.pipedream.fern:api-sdk"); - put("X-Fern-SDK-Version", "1.1.0"); + put("X-Fern-SDK-Version", "1.1.1"); } }); this.headerSuppliers = headerSuppliers; this.httpClient = httpClient; this.timeout = timeout; + this.maxRetries = maxRetries; this.projectId = projectId; } @@ -86,6 +90,10 @@ public OkHttpClient httpClientWithTimeout(RequestOptions requestOptions) { .build(); } + public int maxRetries() { + return this.maxRetries; + } + public String projectId() { return this.projectId; } @@ -181,7 +189,13 @@ public ClientOptions build() { this.timeout = Optional.of(httpClient.callTimeoutMillis() / 1000); return new ClientOptions( - environment, headers, headerSuppliers, httpClient, this.timeout.get(), this.projectId); + environment, + headers, + headerSuppliers, + httpClient, + this.timeout.get(), + this.maxRetries, + this.projectId); } /** diff --git a/src/main/java/com/pipedream/api/core/NullableNonemptyFilter.java b/src/main/java/com/pipedream/api/core/NullableNonemptyFilter.java index afad6eb..c268e6e 100644 --- a/src/main/java/com/pipedream/api/core/NullableNonemptyFilter.java +++ b/src/main/java/com/pipedream/api/core/NullableNonemptyFilter.java @@ -14,6 +14,9 @@ public boolean equals(Object o) { } private boolean isOptionalEmpty(Object o) { - return o instanceof Optional && !((Optional>) o).isPresent(); + if (o instanceof Optional) { + return !((Optional>) o).isPresent(); + } + return false; } } diff --git a/src/main/java/com/pipedream/api/core/ObjectMappers.java b/src/main/java/com/pipedream/api/core/ObjectMappers.java index 6dd6c3c..aa3ba10 100644 --- a/src/main/java/com/pipedream/api/core/ObjectMappers.java +++ b/src/main/java/com/pipedream/api/core/ObjectMappers.java @@ -4,6 +4,7 @@ package com.pipedream.api.core; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -33,4 +34,12 @@ public static String stringify(Object o) { return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); } } + + public static Object parseErrorBody(String responseBodyString) { + try { + return JSON_MAPPER.readValue(responseBodyString, Object.class); + } catch (JsonProcessingException ignored) { + return responseBodyString; + } + } } diff --git a/src/main/java/com/pipedream/api/core/RetryInterceptor.java b/src/main/java/com/pipedream/api/core/RetryInterceptor.java index 66b6be4..da07beb 100644 --- a/src/main/java/com/pipedream/api/core/RetryInterceptor.java +++ b/src/main/java/com/pipedream/api/core/RetryInterceptor.java @@ -5,6 +5,9 @@ import java.io.IOException; import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Optional; import java.util.Random; import okhttp3.Interceptor; @@ -12,7 +15,10 @@ public class RetryInterceptor implements Interceptor { - private static final Duration ONE_SECOND = Duration.ofSeconds(1); + private static final Duration INITIAL_RETRY_DELAY = Duration.ofMillis(1000); + private static final Duration MAX_RETRY_DELAY = Duration.ofMillis(60000); + private static final double JITTER_FACTOR = 0.2; + private final ExponentialBackoff backoff; private final Random random = new Random(); @@ -32,7 +38,7 @@ public Response intercept(Chain chain) throws IOException { } private Response retryChain(Response response, Chain chain) throws IOException { - Optional nextBackoff = this.backoff.nextBackoff(); + Optional nextBackoff = this.backoff.nextBackoff(response); while (nextBackoff.isPresent()) { try { Thread.sleep(nextBackoff.get().toMillis()); @@ -42,7 +48,7 @@ private Response retryChain(Response response, Chain chain) throws IOException { response.close(); response = chain.proceed(chain.request()); if (shouldRetry(response.code())) { - nextBackoff = this.backoff.nextBackoff(); + nextBackoff = this.backoff.nextBackoff(response); } else { return response; } @@ -51,6 +57,102 @@ private Response retryChain(Response response, Chain chain) throws IOException { return response; } + /** + * Calculates the retry delay from response headers, with fallback to exponential backoff. + * Priority: Retry-After > X-RateLimit-Reset > Exponential Backoff + */ + private Duration getRetryDelayFromHeaders(Response response, int retryAttempt) { + // Check for Retry-After header first (RFC 7231), with no jitter + String retryAfter = response.header("Retry-After"); + if (retryAfter != null) { + // Parse as number of seconds... + Optional secondsDelay = tryParseLong(retryAfter) + .map(seconds -> seconds * 1000) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, MAX_RETRY_DELAY.toMillis())) + .map(Duration::ofMillis); + if (secondsDelay.isPresent()) { + return secondsDelay.get(); + } + + // ...or as an HTTP date; both are valid + Optional dateDelay = tryParseHttpDate(retryAfter) + .map(resetTime -> resetTime.toInstant().toEpochMilli() - System.currentTimeMillis()) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, MAX_RETRY_DELAY.toMillis())) + .map(Duration::ofMillis); + if (dateDelay.isPresent()) { + return dateDelay.get(); + } + } + + // Then check for industry-standard X-RateLimit-Reset header, with positive jitter + String rateLimitReset = response.header("X-RateLimit-Reset"); + if (rateLimitReset != null) { + // Assume Unix timestamp in epoch seconds + Optional rateLimitDelay = tryParseLong(rateLimitReset) + .map(resetTimeSeconds -> (resetTimeSeconds * 1000) - System.currentTimeMillis()) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, MAX_RETRY_DELAY.toMillis())) + .map(this::addPositiveJitter) + .map(Duration::ofMillis); + if (rateLimitDelay.isPresent()) { + return rateLimitDelay.get(); + } + } + + // Fall back to exponential backoff, with symmetric jitter + long baseDelay = INITIAL_RETRY_DELAY.toMillis() * (1L << retryAttempt); // 2^retryAttempt + long cappedDelay = Math.min(baseDelay, MAX_RETRY_DELAY.toMillis()); + return Duration.ofMillis(addSymmetricJitter(cappedDelay)); + } + + /** + * Attempts to parse a string as a long, returning empty Optional on failure. + */ + private Optional tryParseLong(String value) { + if (value == null) { + return Optional.empty(); + } + try { + return Optional.of(Long.parseLong(value)); + } catch (NumberFormatException e) { + return Optional.empty(); + } + } + + /** + * Attempts to parse a string as an HTTP date (RFC 1123), returning empty Optional on failure. + */ + private Optional tryParseHttpDate(String value) { + if (value == null) { + return Optional.empty(); + } + try { + return Optional.of(ZonedDateTime.parse(value, DateTimeFormatter.RFC_1123_DATE_TIME)); + } catch (DateTimeParseException e) { + return Optional.empty(); + } + } + + /** + * Adds positive jitter (100-120% of original value) to prevent thundering herd. + * Used for X-RateLimit-Reset header delays. + */ + private long addPositiveJitter(long delayMs) { + double jitterMultiplier = 1.0 + (random.nextDouble() * JITTER_FACTOR); + return (long) (delayMs * jitterMultiplier); + } + + /** + * Adds symmetric jitter (90-110% of original value) to prevent thundering herd. + * Used for exponential backoff delays. + */ + private long addSymmetricJitter(long delayMs) { + double jitterMultiplier = 1.0 + ((random.nextDouble() - 0.5) * JITTER_FACTOR); + return (long) (delayMs * jitterMultiplier); + } + private static boolean shouldRetry(int statusCode) { return statusCode == 408 || statusCode == 429 || statusCode >= 500; } @@ -65,14 +167,14 @@ private final class ExponentialBackoff { this.maxNumRetries = maxNumRetries; } - public Optional nextBackoff() { - retryNumber += 1; - if (retryNumber > maxNumRetries) { + public Optional nextBackoff(Response response) { + if (retryNumber >= maxNumRetries) { return Optional.empty(); } - int upperBound = (int) Math.pow(2, retryNumber); - return Optional.of(ONE_SECOND.multipliedBy(random.nextInt(upperBound))); + Duration delay = getRetryDelayFromHeaders(response, retryNumber); + retryNumber += 1; + return Optional.of(delay); } } } diff --git a/src/main/java/com/pipedream/api/resources/accounts/AccountsClient.java b/src/main/java/com/pipedream/api/resources/accounts/AccountsClient.java index 328225d..12cecc4 100644 --- a/src/main/java/com/pipedream/api/resources/accounts/AccountsClient.java +++ b/src/main/java/com/pipedream/api/resources/accounts/AccountsClient.java @@ -6,9 +6,11 @@ import com.pipedream.api.core.ClientOptions; import com.pipedream.api.core.RequestOptions; import com.pipedream.api.core.pagination.SyncPagingIterable; -import com.pipedream.api.resources.accounts.requests.AccountsListRequest; -import com.pipedream.api.resources.accounts.requests.AccountsRetrieveRequest; import com.pipedream.api.resources.accounts.requests.CreateAccountOpts; +import com.pipedream.api.resources.accounts.requests.DeleteAccountsRequest; +import com.pipedream.api.resources.accounts.requests.DeleteByAppAccountsRequest; +import com.pipedream.api.resources.accounts.requests.ListAccountsRequest; +import com.pipedream.api.resources.accounts.requests.RetrieveAccountsRequest; import com.pipedream.api.types.Account; public class AccountsClient { @@ -38,14 +40,14 @@ public SyncPagingIterable list() { /** * Retrieve all connected accounts for the project with optional filtering */ - public SyncPagingIterable list(AccountsListRequest request) { + public SyncPagingIterable list(ListAccountsRequest request) { return this.rawClient.list(request).body(); } /** * Retrieve all connected accounts for the project with optional filtering */ - public SyncPagingIterable list(AccountsListRequest request, RequestOptions requestOptions) { + public SyncPagingIterable list(ListAccountsRequest request, RequestOptions requestOptions) { return this.rawClient.list(request, requestOptions).body(); } @@ -73,14 +75,14 @@ public Account retrieve(String accountId) { /** * Get the details for a specific connected account */ - public Account retrieve(String accountId, AccountsRetrieveRequest request) { + public Account retrieve(String accountId, RetrieveAccountsRequest request) { return this.rawClient.retrieve(accountId, request).body(); } /** * Get the details for a specific connected account */ - public Account retrieve(String accountId, AccountsRetrieveRequest request, RequestOptions requestOptions) { + public Account retrieve(String accountId, RetrieveAccountsRequest request, RequestOptions requestOptions) { return this.rawClient.retrieve(accountId, request, requestOptions).body(); } @@ -94,8 +96,15 @@ public void delete(String accountId) { /** * Remove a connected account and its associated credentials */ - public void delete(String accountId, RequestOptions requestOptions) { - this.rawClient.delete(accountId, requestOptions).body(); + public void delete(String accountId, DeleteAccountsRequest request) { + this.rawClient.delete(accountId, request).body(); + } + + /** + * Remove a connected account and its associated credentials + */ + public void delete(String accountId, DeleteAccountsRequest request, RequestOptions requestOptions) { + this.rawClient.delete(accountId, request, requestOptions).body(); } /** @@ -108,7 +117,14 @@ public void deleteByApp(String appId) { /** * Remove all connected accounts for a specific app */ - public void deleteByApp(String appId, RequestOptions requestOptions) { - this.rawClient.deleteByApp(appId, requestOptions).body(); + public void deleteByApp(String appId, DeleteByAppAccountsRequest request) { + this.rawClient.deleteByApp(appId, request).body(); + } + + /** + * Remove all connected accounts for a specific app + */ + public void deleteByApp(String appId, DeleteByAppAccountsRequest request, RequestOptions requestOptions) { + this.rawClient.deleteByApp(appId, request, requestOptions).body(); } } diff --git a/src/main/java/com/pipedream/api/resources/accounts/AsyncAccountsClient.java b/src/main/java/com/pipedream/api/resources/accounts/AsyncAccountsClient.java index da3e9be..24e3574 100644 --- a/src/main/java/com/pipedream/api/resources/accounts/AsyncAccountsClient.java +++ b/src/main/java/com/pipedream/api/resources/accounts/AsyncAccountsClient.java @@ -6,9 +6,11 @@ import com.pipedream.api.core.ClientOptions; import com.pipedream.api.core.RequestOptions; import com.pipedream.api.core.pagination.SyncPagingIterable; -import com.pipedream.api.resources.accounts.requests.AccountsListRequest; -import com.pipedream.api.resources.accounts.requests.AccountsRetrieveRequest; import com.pipedream.api.resources.accounts.requests.CreateAccountOpts; +import com.pipedream.api.resources.accounts.requests.DeleteAccountsRequest; +import com.pipedream.api.resources.accounts.requests.DeleteByAppAccountsRequest; +import com.pipedream.api.resources.accounts.requests.ListAccountsRequest; +import com.pipedream.api.resources.accounts.requests.RetrieveAccountsRequest; import com.pipedream.api.types.Account; import java.util.concurrent.CompletableFuture; @@ -39,7 +41,7 @@ public CompletableFuture> list() { /** * Retrieve all connected accounts for the project with optional filtering */ - public CompletableFuture> list(AccountsListRequest request) { + public CompletableFuture> list(ListAccountsRequest request) { return this.rawClient.list(request).thenApply(response -> response.body()); } @@ -47,7 +49,7 @@ public CompletableFuture> list(AccountsListRequest r * Retrieve all connected accounts for the project with optional filtering */ public CompletableFuture> list( - AccountsListRequest request, RequestOptions requestOptions) { + ListAccountsRequest request, RequestOptions requestOptions) { return this.rawClient.list(request, requestOptions).thenApply(response -> response.body()); } @@ -75,7 +77,7 @@ public CompletableFuture retrieve(String accountId) { /** * Get the details for a specific connected account */ - public CompletableFuture retrieve(String accountId, AccountsRetrieveRequest request) { + public CompletableFuture retrieve(String accountId, RetrieveAccountsRequest request) { return this.rawClient.retrieve(accountId, request).thenApply(response -> response.body()); } @@ -83,7 +85,7 @@ public CompletableFuture retrieve(String accountId, AccountsRetrieveReq * Get the details for a specific connected account */ public CompletableFuture retrieve( - String accountId, AccountsRetrieveRequest request, RequestOptions requestOptions) { + String accountId, RetrieveAccountsRequest request, RequestOptions requestOptions) { return this.rawClient.retrieve(accountId, request, requestOptions).thenApply(response -> response.body()); } @@ -97,8 +99,16 @@ public CompletableFuture delete(String accountId) { /** * Remove a connected account and its associated credentials */ - public CompletableFuture delete(String accountId, RequestOptions requestOptions) { - return this.rawClient.delete(accountId, requestOptions).thenApply(response -> response.body()); + public CompletableFuture delete(String accountId, DeleteAccountsRequest request) { + return this.rawClient.delete(accountId, request).thenApply(response -> response.body()); + } + + /** + * Remove a connected account and its associated credentials + */ + public CompletableFuture delete( + String accountId, DeleteAccountsRequest request, RequestOptions requestOptions) { + return this.rawClient.delete(accountId, request, requestOptions).thenApply(response -> response.body()); } /** @@ -111,7 +121,15 @@ public CompletableFuture deleteByApp(String appId) { /** * Remove all connected accounts for a specific app */ - public CompletableFuture deleteByApp(String appId, RequestOptions requestOptions) { - return this.rawClient.deleteByApp(appId, requestOptions).thenApply(response -> response.body()); + public CompletableFuture deleteByApp(String appId, DeleteByAppAccountsRequest request) { + return this.rawClient.deleteByApp(appId, request).thenApply(response -> response.body()); + } + + /** + * Remove all connected accounts for a specific app + */ + public CompletableFuture deleteByApp( + String appId, DeleteByAppAccountsRequest request, RequestOptions requestOptions) { + return this.rawClient.deleteByApp(appId, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/src/main/java/com/pipedream/api/resources/accounts/AsyncRawAccountsClient.java b/src/main/java/com/pipedream/api/resources/accounts/AsyncRawAccountsClient.java index dd95b5f..0646c18 100644 --- a/src/main/java/com/pipedream/api/resources/accounts/AsyncRawAccountsClient.java +++ b/src/main/java/com/pipedream/api/resources/accounts/AsyncRawAccountsClient.java @@ -14,9 +14,11 @@ import com.pipedream.api.core.RequestOptions; import com.pipedream.api.core.pagination.SyncPagingIterable; import com.pipedream.api.errors.TooManyRequestsError; -import com.pipedream.api.resources.accounts.requests.AccountsListRequest; -import com.pipedream.api.resources.accounts.requests.AccountsRetrieveRequest; import com.pipedream.api.resources.accounts.requests.CreateAccountOpts; +import com.pipedream.api.resources.accounts.requests.DeleteAccountsRequest; +import com.pipedream.api.resources.accounts.requests.DeleteByAppAccountsRequest; +import com.pipedream.api.resources.accounts.requests.ListAccountsRequest; +import com.pipedream.api.resources.accounts.requests.RetrieveAccountsRequest; import com.pipedream.api.types.Account; import com.pipedream.api.types.ListAccountsResponse; import java.io.IOException; @@ -46,13 +48,13 @@ public AsyncRawAccountsClient(ClientOptions clientOptions) { * Retrieve all connected accounts for the project with optional filtering */ public CompletableFuture>> list() { - return list(AccountsListRequest.builder().build()); + return list(ListAccountsRequest.builder().build()); } /** * Retrieve all connected accounts for the project with optional filtering */ - public CompletableFuture>> list(AccountsListRequest request) { + public CompletableFuture>> list(ListAccountsRequest request) { return list(request, null); } @@ -60,7 +62,7 @@ public CompletableFuture>> li * Retrieve all connected accounts for the project with optional filtering */ public CompletableFuture>> list( - AccountsListRequest request, RequestOptions requestOptions) { + ListAccountsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -111,12 +113,13 @@ public CompletableFuture>> li @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { ListAccountsResponse parsedResponse = - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), ListAccountsResponse.class); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ListAccountsResponse.class); Optional startingAfter = parsedResponse.getPageInfo().getEndCursor(); - AccountsListRequest nextRequest = AccountsListRequest.builder() + ListAccountsRequest nextRequest = ListAccountsRequest.builder() .from(request) .after(startingAfter) .build(); @@ -135,7 +138,6 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { future.completeExceptionally(new TooManyRequestsError( @@ -145,11 +147,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -212,12 +212,12 @@ public CompletableFuture> create( @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), Account.class), response)); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Account.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { future.completeExceptionally(new TooManyRequestsError( @@ -227,11 +227,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -250,14 +248,14 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { * Get the details for a specific connected account */ public CompletableFuture> retrieve(String accountId) { - return retrieve(accountId, AccountsRetrieveRequest.builder().build()); + return retrieve(accountId, RetrieveAccountsRequest.builder().build()); } /** * Get the details for a specific connected account */ public CompletableFuture> retrieve( - String accountId, AccountsRetrieveRequest request) { + String accountId, RetrieveAccountsRequest request) { return retrieve(accountId, request, null); } @@ -265,7 +263,7 @@ public CompletableFuture> retrieve( * Get the details for a specific connected account */ public CompletableFuture> retrieve( - String accountId, AccountsRetrieveRequest request, RequestOptions requestOptions) { + String accountId, RetrieveAccountsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -294,12 +292,12 @@ public CompletableFuture> retrieve( @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), Account.class), response)); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Account.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { future.completeExceptionally(new TooManyRequestsError( @@ -309,11 +307,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -332,13 +328,21 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { * Remove a connected account and its associated credentials */ public CompletableFuture> delete(String accountId) { - return delete(accountId, null); + return delete(accountId, DeleteAccountsRequest.builder().build()); } /** * Remove a connected account and its associated credentials */ - public CompletableFuture> delete(String accountId, RequestOptions requestOptions) { + public CompletableFuture> delete(String accountId, DeleteAccountsRequest request) { + return delete(accountId, request, null); + } + + /** + * Remove a connected account and its associated credentials + */ + public CompletableFuture> delete( + String accountId, DeleteAccountsRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -346,12 +350,12 @@ public CompletableFuture> delete(String accountId, .addPathSegments("accounts") .addPathSegment(accountId) .build(); - Request okhttpRequest = new Request.Builder() + Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl) .method("DELETE", null) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); @@ -375,11 +379,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -398,13 +400,22 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { * Remove all connected accounts for a specific app */ public CompletableFuture> deleteByApp(String appId) { - return deleteByApp(appId, null); + return deleteByApp(appId, DeleteByAppAccountsRequest.builder().build()); + } + + /** + * Remove all connected accounts for a specific app + */ + public CompletableFuture> deleteByApp( + String appId, DeleteByAppAccountsRequest request) { + return deleteByApp(appId, request, null); } /** * Remove all connected accounts for a specific app */ - public CompletableFuture> deleteByApp(String appId, RequestOptions requestOptions) { + public CompletableFuture> deleteByApp( + String appId, DeleteByAppAccountsRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -413,12 +424,12 @@ public CompletableFuture> deleteByApp(String appId, .addPathSegment(appId) .addPathSegments("accounts") .build(); - Request okhttpRequest = new Request.Builder() + Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl) .method("DELETE", null) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); @@ -442,11 +453,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); diff --git a/src/main/java/com/pipedream/api/resources/accounts/RawAccountsClient.java b/src/main/java/com/pipedream/api/resources/accounts/RawAccountsClient.java index 777be36..c6aa61d 100644 --- a/src/main/java/com/pipedream/api/resources/accounts/RawAccountsClient.java +++ b/src/main/java/com/pipedream/api/resources/accounts/RawAccountsClient.java @@ -14,9 +14,11 @@ import com.pipedream.api.core.RequestOptions; import com.pipedream.api.core.pagination.SyncPagingIterable; import com.pipedream.api.errors.TooManyRequestsError; -import com.pipedream.api.resources.accounts.requests.AccountsListRequest; -import com.pipedream.api.resources.accounts.requests.AccountsRetrieveRequest; import com.pipedream.api.resources.accounts.requests.CreateAccountOpts; +import com.pipedream.api.resources.accounts.requests.DeleteAccountsRequest; +import com.pipedream.api.resources.accounts.requests.DeleteByAppAccountsRequest; +import com.pipedream.api.resources.accounts.requests.ListAccountsRequest; +import com.pipedream.api.resources.accounts.requests.RetrieveAccountsRequest; import com.pipedream.api.types.Account; import com.pipedream.api.types.ListAccountsResponse; import java.io.IOException; @@ -41,13 +43,13 @@ public RawAccountsClient(ClientOptions clientOptions) { * Retrieve all connected accounts for the project with optional filtering */ public BaseClientHttpResponse> list() { - return list(AccountsListRequest.builder().build()); + return list(ListAccountsRequest.builder().build()); } /** * Retrieve all connected accounts for the project with optional filtering */ - public BaseClientHttpResponse> list(AccountsListRequest request) { + public BaseClientHttpResponse> list(ListAccountsRequest request) { return list(request, null); } @@ -55,7 +57,7 @@ public BaseClientHttpResponse> list(AccountsListRequ * Retrieve all connected accounts for the project with optional filtering */ public BaseClientHttpResponse> list( - AccountsListRequest request, RequestOptions requestOptions) { + ListAccountsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -103,11 +105,12 @@ public BaseClientHttpResponse> list( } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { ListAccountsResponse parsedResponse = - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), ListAccountsResponse.class); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ListAccountsResponse.class); Optional startingAfter = parsedResponse.getPageInfo().getEndCursor(); - AccountsListRequest nextRequest = AccountsListRequest.builder() + ListAccountsRequest nextRequest = ListAccountsRequest.builder() .from(request) .after(startingAfter) .build(); @@ -118,7 +121,6 @@ public BaseClientHttpResponse> list( .body()), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { throw new TooManyRequestsError( @@ -127,11 +129,9 @@ public BaseClientHttpResponse> list( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -181,11 +181,11 @@ public BaseClientHttpResponse create(CreateAccountOpts request, Request } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), Account.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Account.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { throw new TooManyRequestsError( @@ -194,11 +194,9 @@ public BaseClientHttpResponse create(CreateAccountOpts request, Request } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -208,13 +206,13 @@ public BaseClientHttpResponse create(CreateAccountOpts request, Request * Get the details for a specific connected account */ public BaseClientHttpResponse retrieve(String accountId) { - return retrieve(accountId, AccountsRetrieveRequest.builder().build()); + return retrieve(accountId, RetrieveAccountsRequest.builder().build()); } /** * Get the details for a specific connected account */ - public BaseClientHttpResponse retrieve(String accountId, AccountsRetrieveRequest request) { + public BaseClientHttpResponse retrieve(String accountId, RetrieveAccountsRequest request) { return retrieve(accountId, request, null); } @@ -222,7 +220,7 @@ public BaseClientHttpResponse retrieve(String accountId, AccountsRetrie * Get the details for a specific connected account */ public BaseClientHttpResponse retrieve( - String accountId, AccountsRetrieveRequest request, RequestOptions requestOptions) { + String accountId, RetrieveAccountsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -248,11 +246,11 @@ public BaseClientHttpResponse retrieve( } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), Account.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Account.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { throw new TooManyRequestsError( @@ -261,11 +259,9 @@ public BaseClientHttpResponse retrieve( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -275,13 +271,21 @@ public BaseClientHttpResponse retrieve( * Remove a connected account and its associated credentials */ public BaseClientHttpResponse delete(String accountId) { - return delete(accountId, null); + return delete(accountId, DeleteAccountsRequest.builder().build()); } /** * Remove a connected account and its associated credentials */ - public BaseClientHttpResponse delete(String accountId, RequestOptions requestOptions) { + public BaseClientHttpResponse delete(String accountId, DeleteAccountsRequest request) { + return delete(accountId, request, null); + } + + /** + * Remove a connected account and its associated credentials + */ + public BaseClientHttpResponse delete( + String accountId, DeleteAccountsRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -289,12 +293,12 @@ public BaseClientHttpResponse delete(String accountId, RequestOptions requ .addPathSegments("accounts") .addPathSegment(accountId) .build(); - Request okhttpRequest = new Request.Builder() + Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl) .method("DELETE", null) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); @@ -313,11 +317,9 @@ public BaseClientHttpResponse delete(String accountId, RequestOptions requ } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -327,13 +329,21 @@ public BaseClientHttpResponse delete(String accountId, RequestOptions requ * Remove all connected accounts for a specific app */ public BaseClientHttpResponse deleteByApp(String appId) { - return deleteByApp(appId, null); + return deleteByApp(appId, DeleteByAppAccountsRequest.builder().build()); + } + + /** + * Remove all connected accounts for a specific app + */ + public BaseClientHttpResponse deleteByApp(String appId, DeleteByAppAccountsRequest request) { + return deleteByApp(appId, request, null); } /** * Remove all connected accounts for a specific app */ - public BaseClientHttpResponse deleteByApp(String appId, RequestOptions requestOptions) { + public BaseClientHttpResponse deleteByApp( + String appId, DeleteByAppAccountsRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -342,12 +352,12 @@ public BaseClientHttpResponse deleteByApp(String appId, RequestOptions req .addPathSegment(appId) .addPathSegments("accounts") .build(); - Request okhttpRequest = new Request.Builder() + Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl) .method("DELETE", null) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); @@ -366,11 +376,9 @@ public BaseClientHttpResponse deleteByApp(String appId, RequestOptions req } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } diff --git a/src/main/java/com/pipedream/api/resources/accounts/requests/DeleteAccountsRequest.java b/src/main/java/com/pipedream/api/resources/accounts/requests/DeleteAccountsRequest.java new file mode 100644 index 0000000..bac3f70 --- /dev/null +++ b/src/main/java/com/pipedream/api/resources/accounts/requests/DeleteAccountsRequest.java @@ -0,0 +1,59 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.pipedream.api.resources.accounts.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.pipedream.api.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteAccountsRequest.Builder.class) +public final class DeleteAccountsRequest { + private final Map additionalProperties; + + private DeleteAccountsRequest(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteAccountsRequest; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteAccountsRequest other) { + return this; + } + + public DeleteAccountsRequest build() { + return new DeleteAccountsRequest(additionalProperties); + } + } +} diff --git a/src/main/java/com/pipedream/api/resources/accounts/requests/DeleteByAppAccountsRequest.java b/src/main/java/com/pipedream/api/resources/accounts/requests/DeleteByAppAccountsRequest.java new file mode 100644 index 0000000..f5d326e --- /dev/null +++ b/src/main/java/com/pipedream/api/resources/accounts/requests/DeleteByAppAccountsRequest.java @@ -0,0 +1,59 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.pipedream.api.resources.accounts.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.pipedream.api.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteByAppAccountsRequest.Builder.class) +public final class DeleteByAppAccountsRequest { + private final Map additionalProperties; + + private DeleteByAppAccountsRequest(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteByAppAccountsRequest; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteByAppAccountsRequest other) { + return this; + } + + public DeleteByAppAccountsRequest build() { + return new DeleteByAppAccountsRequest(additionalProperties); + } + } +} diff --git a/src/main/java/com/pipedream/api/resources/accounts/requests/AccountsListRequest.java b/src/main/java/com/pipedream/api/resources/accounts/requests/ListAccountsRequest.java similarity index 95% rename from src/main/java/com/pipedream/api/resources/accounts/requests/AccountsListRequest.java rename to src/main/java/com/pipedream/api/resources/accounts/requests/ListAccountsRequest.java index bfba211..6d5412e 100644 --- a/src/main/java/com/pipedream/api/resources/accounts/requests/AccountsListRequest.java +++ b/src/main/java/com/pipedream/api/resources/accounts/requests/ListAccountsRequest.java @@ -18,8 +18,8 @@ import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AccountsListRequest.Builder.class) -public final class AccountsListRequest { +@JsonDeserialize(builder = ListAccountsRequest.Builder.class) +public final class ListAccountsRequest { private final Optional externalUserId; private final Optional oauthAppId; @@ -36,7 +36,7 @@ public final class AccountsListRequest { private final Map additionalProperties; - private AccountsListRequest( + private ListAccountsRequest( Optional externalUserId, Optional oauthAppId, Optional after, @@ -111,7 +111,7 @@ public Optional getIncludeCredentials() { @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof AccountsListRequest && equalTo((AccountsListRequest) other); + return other instanceof ListAccountsRequest && equalTo((ListAccountsRequest) other); } @JsonAnyGetter @@ -119,7 +119,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(AccountsListRequest other) { + private boolean equalTo(ListAccountsRequest other) { return externalUserId.equals(other.externalUserId) && oauthAppId.equals(other.oauthAppId) && after.equals(other.after) @@ -171,7 +171,7 @@ public static final class Builder { private Builder() {} - public Builder from(AccountsListRequest other) { + public Builder from(ListAccountsRequest other) { externalUserId(other.getExternalUserId()); oauthAppId(other.getOauthAppId()); after(other.getAfter()); @@ -277,8 +277,8 @@ public Builder includeCredentials(Boolean includeCredentials) { return this; } - public AccountsListRequest build() { - return new AccountsListRequest( + public ListAccountsRequest build() { + return new ListAccountsRequest( externalUserId, oauthAppId, after, before, limit, app, includeCredentials, additionalProperties); } } diff --git a/src/main/java/com/pipedream/api/resources/accounts/requests/AccountsRetrieveRequest.java b/src/main/java/com/pipedream/api/resources/accounts/requests/RetrieveAccountsRequest.java similarity index 84% rename from src/main/java/com/pipedream/api/resources/accounts/requests/AccountsRetrieveRequest.java rename to src/main/java/com/pipedream/api/resources/accounts/requests/RetrieveAccountsRequest.java index 3844f9d..0f603bc 100644 --- a/src/main/java/com/pipedream/api/resources/accounts/requests/AccountsRetrieveRequest.java +++ b/src/main/java/com/pipedream/api/resources/accounts/requests/RetrieveAccountsRequest.java @@ -18,13 +18,13 @@ import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AccountsRetrieveRequest.Builder.class) -public final class AccountsRetrieveRequest { +@JsonDeserialize(builder = RetrieveAccountsRequest.Builder.class) +public final class RetrieveAccountsRequest { private final Optional includeCredentials; private final Map additionalProperties; - private AccountsRetrieveRequest(Optional includeCredentials, Map additionalProperties) { + private RetrieveAccountsRequest(Optional includeCredentials, Map additionalProperties) { this.includeCredentials = includeCredentials; this.additionalProperties = additionalProperties; } @@ -40,7 +40,7 @@ public Optional getIncludeCredentials() { @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof AccountsRetrieveRequest && equalTo((AccountsRetrieveRequest) other); + return other instanceof RetrieveAccountsRequest && equalTo((RetrieveAccountsRequest) other); } @JsonAnyGetter @@ -48,7 +48,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(AccountsRetrieveRequest other) { + private boolean equalTo(RetrieveAccountsRequest other) { return includeCredentials.equals(other.includeCredentials); } @@ -75,7 +75,7 @@ public static final class Builder { private Builder() {} - public Builder from(AccountsRetrieveRequest other) { + public Builder from(RetrieveAccountsRequest other) { includeCredentials(other.getIncludeCredentials()); return this; } @@ -94,8 +94,8 @@ public Builder includeCredentials(Boolean includeCredentials) { return this; } - public AccountsRetrieveRequest build() { - return new AccountsRetrieveRequest(includeCredentials, additionalProperties); + public RetrieveAccountsRequest build() { + return new RetrieveAccountsRequest(includeCredentials, additionalProperties); } } } diff --git a/src/main/java/com/pipedream/api/resources/actions/ActionsClient.java b/src/main/java/com/pipedream/api/resources/actions/ActionsClient.java index 18b750a..7839cc6 100644 --- a/src/main/java/com/pipedream/api/resources/actions/ActionsClient.java +++ b/src/main/java/com/pipedream/api/resources/actions/ActionsClient.java @@ -6,13 +6,13 @@ import com.pipedream.api.core.ClientOptions; import com.pipedream.api.core.RequestOptions; import com.pipedream.api.core.pagination.SyncPagingIterable; -import com.pipedream.api.resources.actions.requests.ActionsListRequest; -import com.pipedream.api.resources.actions.requests.ActionsRetrieveRequest; +import com.pipedream.api.resources.actions.requests.ConfigurePropActionsRequest; +import com.pipedream.api.resources.actions.requests.ListActionsRequest; +import com.pipedream.api.resources.actions.requests.ReloadPropsActionsRequest; +import com.pipedream.api.resources.actions.requests.RetrieveActionsRequest; import com.pipedream.api.resources.actions.requests.RunActionOpts; import com.pipedream.api.types.Component; -import com.pipedream.api.types.ConfigurePropOpts; import com.pipedream.api.types.ConfigurePropResponse; -import com.pipedream.api.types.ReloadPropsOpts; import com.pipedream.api.types.ReloadPropsResponse; import com.pipedream.api.types.RunActionResponse; @@ -43,14 +43,14 @@ public SyncPagingIterable list() { /** * Retrieve available actions with optional search and app filtering */ - public SyncPagingIterable list(ActionsListRequest request) { + public SyncPagingIterable list(ListActionsRequest request) { return this.rawClient.list(request).body(); } /** * Retrieve available actions with optional search and app filtering */ - public SyncPagingIterable list(ActionsListRequest request, RequestOptions requestOptions) { + public SyncPagingIterable list(ListActionsRequest request, RequestOptions requestOptions) { return this.rawClient.list(request, requestOptions).body(); } @@ -64,42 +64,42 @@ public Component retrieve(String componentId) { /** * Get detailed configuration for a specific action by its key */ - public Component retrieve(String componentId, ActionsRetrieveRequest request) { + public Component retrieve(String componentId, RetrieveActionsRequest request) { return this.rawClient.retrieve(componentId, request).body(); } /** * Get detailed configuration for a specific action by its key */ - public Component retrieve(String componentId, ActionsRetrieveRequest request, RequestOptions requestOptions) { + public Component retrieve(String componentId, RetrieveActionsRequest request, RequestOptions requestOptions) { return this.rawClient.retrieve(componentId, request, requestOptions).body(); } /** * Retrieve remote options for a given prop for a action */ - public ConfigurePropResponse configureProp(ConfigurePropOpts request) { + public ConfigurePropResponse configureProp(ConfigurePropActionsRequest request) { return this.rawClient.configureProp(request).body(); } /** * Retrieve remote options for a given prop for a action */ - public ConfigurePropResponse configureProp(ConfigurePropOpts request, RequestOptions requestOptions) { + public ConfigurePropResponse configureProp(ConfigurePropActionsRequest request, RequestOptions requestOptions) { return this.rawClient.configureProp(request, requestOptions).body(); } /** * Reload the prop definition based on the currently configured props */ - public ReloadPropsResponse reloadProps(ReloadPropsOpts request) { + public ReloadPropsResponse reloadProps(ReloadPropsActionsRequest request) { return this.rawClient.reloadProps(request).body(); } /** * Reload the prop definition based on the currently configured props */ - public ReloadPropsResponse reloadProps(ReloadPropsOpts request, RequestOptions requestOptions) { + public ReloadPropsResponse reloadProps(ReloadPropsActionsRequest request, RequestOptions requestOptions) { return this.rawClient.reloadProps(request, requestOptions).body(); } diff --git a/src/main/java/com/pipedream/api/resources/actions/AsyncActionsClient.java b/src/main/java/com/pipedream/api/resources/actions/AsyncActionsClient.java index 442f0b5..db89ee5 100644 --- a/src/main/java/com/pipedream/api/resources/actions/AsyncActionsClient.java +++ b/src/main/java/com/pipedream/api/resources/actions/AsyncActionsClient.java @@ -6,13 +6,13 @@ import com.pipedream.api.core.ClientOptions; import com.pipedream.api.core.RequestOptions; import com.pipedream.api.core.pagination.SyncPagingIterable; -import com.pipedream.api.resources.actions.requests.ActionsListRequest; -import com.pipedream.api.resources.actions.requests.ActionsRetrieveRequest; +import com.pipedream.api.resources.actions.requests.ConfigurePropActionsRequest; +import com.pipedream.api.resources.actions.requests.ListActionsRequest; +import com.pipedream.api.resources.actions.requests.ReloadPropsActionsRequest; +import com.pipedream.api.resources.actions.requests.RetrieveActionsRequest; import com.pipedream.api.resources.actions.requests.RunActionOpts; import com.pipedream.api.types.Component; -import com.pipedream.api.types.ConfigurePropOpts; import com.pipedream.api.types.ConfigurePropResponse; -import com.pipedream.api.types.ReloadPropsOpts; import com.pipedream.api.types.ReloadPropsResponse; import com.pipedream.api.types.RunActionResponse; import java.util.concurrent.CompletableFuture; @@ -44,7 +44,7 @@ public CompletableFuture> list() { /** * Retrieve available actions with optional search and app filtering */ - public CompletableFuture> list(ActionsListRequest request) { + public CompletableFuture> list(ListActionsRequest request) { return this.rawClient.list(request).thenApply(response -> response.body()); } @@ -52,7 +52,7 @@ public CompletableFuture> list(ActionsListRequest * Retrieve available actions with optional search and app filtering */ public CompletableFuture> list( - ActionsListRequest request, RequestOptions requestOptions) { + ListActionsRequest request, RequestOptions requestOptions) { return this.rawClient.list(request, requestOptions).thenApply(response -> response.body()); } @@ -66,7 +66,7 @@ public CompletableFuture retrieve(String componentId) { /** * Get detailed configuration for a specific action by its key */ - public CompletableFuture retrieve(String componentId, ActionsRetrieveRequest request) { + public CompletableFuture retrieve(String componentId, RetrieveActionsRequest request) { return this.rawClient.retrieve(componentId, request).thenApply(response -> response.body()); } @@ -74,14 +74,14 @@ public CompletableFuture retrieve(String componentId, ActionsRetrieve * Get detailed configuration for a specific action by its key */ public CompletableFuture retrieve( - String componentId, ActionsRetrieveRequest request, RequestOptions requestOptions) { + String componentId, RetrieveActionsRequest request, RequestOptions requestOptions) { return this.rawClient.retrieve(componentId, request, requestOptions).thenApply(response -> response.body()); } /** * Retrieve remote options for a given prop for a action */ - public CompletableFuture configureProp(ConfigurePropOpts request) { + public CompletableFuture configureProp(ConfigurePropActionsRequest request) { return this.rawClient.configureProp(request).thenApply(response -> response.body()); } @@ -89,21 +89,22 @@ public CompletableFuture configureProp(ConfigurePropOpts * Retrieve remote options for a given prop for a action */ public CompletableFuture configureProp( - ConfigurePropOpts request, RequestOptions requestOptions) { + ConfigurePropActionsRequest request, RequestOptions requestOptions) { return this.rawClient.configureProp(request, requestOptions).thenApply(response -> response.body()); } /** * Reload the prop definition based on the currently configured props */ - public CompletableFuture reloadProps(ReloadPropsOpts request) { + public CompletableFuture reloadProps(ReloadPropsActionsRequest request) { return this.rawClient.reloadProps(request).thenApply(response -> response.body()); } /** * Reload the prop definition based on the currently configured props */ - public CompletableFuture reloadProps(ReloadPropsOpts request, RequestOptions requestOptions) { + public CompletableFuture reloadProps( + ReloadPropsActionsRequest request, RequestOptions requestOptions) { return this.rawClient.reloadProps(request, requestOptions).thenApply(response -> response.body()); } diff --git a/src/main/java/com/pipedream/api/resources/actions/AsyncRawActionsClient.java b/src/main/java/com/pipedream/api/resources/actions/AsyncRawActionsClient.java index 72dfcab..dd075fa 100644 --- a/src/main/java/com/pipedream/api/resources/actions/AsyncRawActionsClient.java +++ b/src/main/java/com/pipedream/api/resources/actions/AsyncRawActionsClient.java @@ -14,15 +14,15 @@ import com.pipedream.api.core.RequestOptions; import com.pipedream.api.core.pagination.SyncPagingIterable; import com.pipedream.api.errors.TooManyRequestsError; -import com.pipedream.api.resources.actions.requests.ActionsListRequest; -import com.pipedream.api.resources.actions.requests.ActionsRetrieveRequest; +import com.pipedream.api.resources.actions.requests.ConfigurePropActionsRequest; +import com.pipedream.api.resources.actions.requests.ListActionsRequest; +import com.pipedream.api.resources.actions.requests.ReloadPropsActionsRequest; +import com.pipedream.api.resources.actions.requests.RetrieveActionsRequest; import com.pipedream.api.resources.actions.requests.RunActionOpts; import com.pipedream.api.types.Component; -import com.pipedream.api.types.ConfigurePropOpts; import com.pipedream.api.types.ConfigurePropResponse; import com.pipedream.api.types.GetComponentResponse; import com.pipedream.api.types.GetComponentsResponse; -import com.pipedream.api.types.ReloadPropsOpts; import com.pipedream.api.types.ReloadPropsResponse; import com.pipedream.api.types.RunActionResponse; import java.io.IOException; @@ -52,13 +52,13 @@ public AsyncRawActionsClient(ClientOptions clientOptions) { * Retrieve available actions with optional search and app filtering */ public CompletableFuture>> list() { - return list(ActionsListRequest.builder().build()); + return list(ListActionsRequest.builder().build()); } /** * Retrieve available actions with optional search and app filtering */ - public CompletableFuture>> list(ActionsListRequest request) { + public CompletableFuture>> list(ListActionsRequest request) { return list(request, null); } @@ -66,7 +66,7 @@ public CompletableFuture>> * Retrieve available actions with optional search and app filtering */ public CompletableFuture>> list( - ActionsListRequest request, RequestOptions requestOptions) { + ListActionsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -105,12 +105,13 @@ public CompletableFuture>> @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { GetComponentsResponse parsedResponse = - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), GetComponentsResponse.class); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetComponentsResponse.class); Optional startingAfter = parsedResponse.getPageInfo().getEndCursor(); - ActionsListRequest nextRequest = ActionsListRequest.builder() + ListActionsRequest nextRequest = ListActionsRequest.builder() .from(request) .after(startingAfter) .build(); @@ -129,7 +130,6 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { future.completeExceptionally(new TooManyRequestsError( @@ -139,11 +139,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -162,14 +160,14 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { * Get detailed configuration for a specific action by its key */ public CompletableFuture> retrieve(String componentId) { - return retrieve(componentId, ActionsRetrieveRequest.builder().build()); + return retrieve(componentId, RetrieveActionsRequest.builder().build()); } /** * Get detailed configuration for a specific action by its key */ public CompletableFuture> retrieve( - String componentId, ActionsRetrieveRequest request) { + String componentId, RetrieveActionsRequest request) { return retrieve(componentId, request, null); } @@ -177,7 +175,7 @@ public CompletableFuture> retrieve( * Get detailed configuration for a specific action by its key */ public CompletableFuture> retrieve( - String componentId, ActionsRetrieveRequest request, RequestOptions requestOptions) { + String componentId, RetrieveActionsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -203,13 +201,13 @@ public CompletableFuture> retrieve( @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { GetComponentResponse parsedResponse = - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), GetComponentResponse.class); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetComponentResponse.class); future.complete(new BaseClientHttpResponse<>(parsedResponse.getData(), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { future.completeExceptionally(new TooManyRequestsError( @@ -219,11 +217,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -241,7 +237,8 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { /** * Retrieve remote options for a given prop for a action */ - public CompletableFuture> configureProp(ConfigurePropOpts request) { + public CompletableFuture> configureProp( + ConfigurePropActionsRequest request) { return configureProp(request, null); } @@ -249,17 +246,18 @@ public CompletableFuture> configur * Retrieve remote options for a given prop for a action */ public CompletableFuture> configureProp( - ConfigurePropOpts request, RequestOptions requestOptions) { + ConfigurePropActionsRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") .addPathSegment(clientOptions.projectId()) - .addPathSegments("actions/configure") + .addPathSegments("actions") + .addPathSegments("configure") .build(); RequestBody body; try { body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request.getBody()), MediaTypes.APPLICATION_JSON); } catch (JsonProcessingException e) { throw new BaseClientException("Failed to serialize request", e); } @@ -279,13 +277,13 @@ public CompletableFuture> configur @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), ConfigurePropResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ConfigurePropResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { future.completeExceptionally(new TooManyRequestsError( @@ -295,11 +293,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -317,7 +313,8 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { /** * Reload the prop definition based on the currently configured props */ - public CompletableFuture> reloadProps(ReloadPropsOpts request) { + public CompletableFuture> reloadProps( + ReloadPropsActionsRequest request) { return reloadProps(request, null); } @@ -325,17 +322,18 @@ public CompletableFuture> reloadProp * Reload the prop definition based on the currently configured props */ public CompletableFuture> reloadProps( - ReloadPropsOpts request, RequestOptions requestOptions) { + ReloadPropsActionsRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") .addPathSegment(clientOptions.projectId()) - .addPathSegments("actions/props") + .addPathSegments("actions") + .addPathSegments("props") .build(); RequestBody body; try { body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request.getBody()), MediaTypes.APPLICATION_JSON); } catch (JsonProcessingException e) { throw new BaseClientException("Failed to serialize request", e); } @@ -355,13 +353,13 @@ public CompletableFuture> reloadProp @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), ReloadPropsResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ReloadPropsResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { future.completeExceptionally(new TooManyRequestsError( @@ -371,11 +369,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -406,7 +402,8 @@ public CompletableFuture> run( .newBuilder() .addPathSegments("v1/connect") .addPathSegment(clientOptions.projectId()) - .addPathSegments("actions/run") + .addPathSegments("actions") + .addPathSegments("run") .build(); RequestBody body; try { @@ -431,13 +428,13 @@ public CompletableFuture> run( @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), RunActionResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, RunActionResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { future.completeExceptionally(new TooManyRequestsError( @@ -447,11 +444,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); diff --git a/src/main/java/com/pipedream/api/resources/actions/RawActionsClient.java b/src/main/java/com/pipedream/api/resources/actions/RawActionsClient.java index 249368b..821b8cf 100644 --- a/src/main/java/com/pipedream/api/resources/actions/RawActionsClient.java +++ b/src/main/java/com/pipedream/api/resources/actions/RawActionsClient.java @@ -14,15 +14,15 @@ import com.pipedream.api.core.RequestOptions; import com.pipedream.api.core.pagination.SyncPagingIterable; import com.pipedream.api.errors.TooManyRequestsError; -import com.pipedream.api.resources.actions.requests.ActionsListRequest; -import com.pipedream.api.resources.actions.requests.ActionsRetrieveRequest; +import com.pipedream.api.resources.actions.requests.ConfigurePropActionsRequest; +import com.pipedream.api.resources.actions.requests.ListActionsRequest; +import com.pipedream.api.resources.actions.requests.ReloadPropsActionsRequest; +import com.pipedream.api.resources.actions.requests.RetrieveActionsRequest; import com.pipedream.api.resources.actions.requests.RunActionOpts; import com.pipedream.api.types.Component; -import com.pipedream.api.types.ConfigurePropOpts; import com.pipedream.api.types.ConfigurePropResponse; import com.pipedream.api.types.GetComponentResponse; import com.pipedream.api.types.GetComponentsResponse; -import com.pipedream.api.types.ReloadPropsOpts; import com.pipedream.api.types.ReloadPropsResponse; import com.pipedream.api.types.RunActionResponse; import java.io.IOException; @@ -47,13 +47,13 @@ public RawActionsClient(ClientOptions clientOptions) { * Retrieve available actions with optional search and app filtering */ public BaseClientHttpResponse> list() { - return list(ActionsListRequest.builder().build()); + return list(ListActionsRequest.builder().build()); } /** * Retrieve available actions with optional search and app filtering */ - public BaseClientHttpResponse> list(ActionsListRequest request) { + public BaseClientHttpResponse> list(ListActionsRequest request) { return list(request, null); } @@ -61,7 +61,7 @@ public BaseClientHttpResponse> list(ActionsListReq * Retrieve available actions with optional search and app filtering */ public BaseClientHttpResponse> list( - ActionsListRequest request, RequestOptions requestOptions) { + ListActionsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -97,11 +97,12 @@ public BaseClientHttpResponse> list( } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { GetComponentsResponse parsedResponse = - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), GetComponentsResponse.class); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetComponentsResponse.class); Optional startingAfter = parsedResponse.getPageInfo().getEndCursor(); - ActionsListRequest nextRequest = ActionsListRequest.builder() + ListActionsRequest nextRequest = ListActionsRequest.builder() .from(request) .after(startingAfter) .build(); @@ -112,7 +113,6 @@ public BaseClientHttpResponse> list( .body()), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { throw new TooManyRequestsError( @@ -121,11 +121,9 @@ public BaseClientHttpResponse> list( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -135,13 +133,13 @@ public BaseClientHttpResponse> list( * Get detailed configuration for a specific action by its key */ public BaseClientHttpResponse retrieve(String componentId) { - return retrieve(componentId, ActionsRetrieveRequest.builder().build()); + return retrieve(componentId, RetrieveActionsRequest.builder().build()); } /** * Get detailed configuration for a specific action by its key */ - public BaseClientHttpResponse retrieve(String componentId, ActionsRetrieveRequest request) { + public BaseClientHttpResponse retrieve(String componentId, RetrieveActionsRequest request) { return retrieve(componentId, request, null); } @@ -149,7 +147,7 @@ public BaseClientHttpResponse retrieve(String componentId, ActionsRet * Get detailed configuration for a specific action by its key */ public BaseClientHttpResponse retrieve( - String componentId, ActionsRetrieveRequest request, RequestOptions requestOptions) { + String componentId, RetrieveActionsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") @@ -172,12 +170,12 @@ public BaseClientHttpResponse retrieve( } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { GetComponentResponse parsedResponse = - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), GetComponentResponse.class); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetComponentResponse.class); return new BaseClientHttpResponse<>(parsedResponse.getData(), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { throw new TooManyRequestsError( @@ -186,11 +184,9 @@ public BaseClientHttpResponse retrieve( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -199,7 +195,7 @@ public BaseClientHttpResponse retrieve( /** * Retrieve remote options for a given prop for a action */ - public BaseClientHttpResponse configureProp(ConfigurePropOpts request) { + public BaseClientHttpResponse configureProp(ConfigurePropActionsRequest request) { return configureProp(request, null); } @@ -207,17 +203,18 @@ public BaseClientHttpResponse configureProp(ConfigureProp * Retrieve remote options for a given prop for a action */ public BaseClientHttpResponse configureProp( - ConfigurePropOpts request, RequestOptions requestOptions) { + ConfigurePropActionsRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") .addPathSegment(clientOptions.projectId()) - .addPathSegments("actions/configure") + .addPathSegments("actions") + .addPathSegments("configure") .build(); RequestBody body; try { body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request.getBody()), MediaTypes.APPLICATION_JSON); } catch (JsonProcessingException e) { throw new BaseClientException("Failed to serialize request", e); } @@ -234,12 +231,11 @@ public BaseClientHttpResponse configureProp( } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), ConfigurePropResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ConfigurePropResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { throw new TooManyRequestsError( @@ -248,11 +244,9 @@ public BaseClientHttpResponse configureProp( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -261,7 +255,7 @@ public BaseClientHttpResponse configureProp( /** * Reload the prop definition based on the currently configured props */ - public BaseClientHttpResponse reloadProps(ReloadPropsOpts request) { + public BaseClientHttpResponse reloadProps(ReloadPropsActionsRequest request) { return reloadProps(request, null); } @@ -269,17 +263,18 @@ public BaseClientHttpResponse reloadProps(ReloadPropsOpts r * Reload the prop definition based on the currently configured props */ public BaseClientHttpResponse reloadProps( - ReloadPropsOpts request, RequestOptions requestOptions) { + ReloadPropsActionsRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect") .addPathSegment(clientOptions.projectId()) - .addPathSegments("actions/props") + .addPathSegments("actions") + .addPathSegments("props") .build(); RequestBody body; try { body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request.getBody()), MediaTypes.APPLICATION_JSON); } catch (JsonProcessingException e) { throw new BaseClientException("Failed to serialize request", e); } @@ -296,12 +291,11 @@ public BaseClientHttpResponse reloadProps( } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), ReloadPropsResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ReloadPropsResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { throw new TooManyRequestsError( @@ -310,11 +304,9 @@ public BaseClientHttpResponse reloadProps( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -335,7 +327,8 @@ public BaseClientHttpResponse run(RunActionOpts request, Requ .newBuilder() .addPathSegments("v1/connect") .addPathSegment(clientOptions.projectId()) - .addPathSegments("actions/run") + .addPathSegments("actions") + .addPathSegments("run") .build(); RequestBody body; try { @@ -357,11 +350,11 @@ public BaseClientHttpResponse run(RunActionOpts request, Requ } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), RunActionResponse.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, RunActionResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { if (response.code() == 429) { throw new TooManyRequestsError( @@ -370,11 +363,9 @@ public BaseClientHttpResponse run(RunActionOpts request, Requ } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } diff --git a/src/main/java/com/pipedream/api/resources/actions/requests/ConfigurePropActionsRequest.java b/src/main/java/com/pipedream/api/resources/actions/requests/ConfigurePropActionsRequest.java new file mode 100644 index 0000000..f79872b --- /dev/null +++ b/src/main/java/com/pipedream/api/resources/actions/requests/ConfigurePropActionsRequest.java @@ -0,0 +1,103 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.pipedream.api.resources.actions.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.pipedream.api.core.ObjectMappers; +import com.pipedream.api.types.ConfigurePropOpts; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ConfigurePropActionsRequest.Builder.class) +public final class ConfigurePropActionsRequest { + private final ConfigurePropOpts body; + + private final Map additionalProperties; + + private ConfigurePropActionsRequest(ConfigurePropOpts body, Map additionalProperties) { + this.body = body; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("body") + public ConfigurePropOpts getBody() { + return body; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ConfigurePropActionsRequest && equalTo((ConfigurePropActionsRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ConfigurePropActionsRequest other) { + return body.equals(other.body); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.body); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static BodyStage builder() { + return new Builder(); + } + + public interface BodyStage { + _FinalStage body(@NotNull ConfigurePropOpts body); + + Builder from(ConfigurePropActionsRequest other); + } + + public interface _FinalStage { + ConfigurePropActionsRequest build(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements BodyStage, _FinalStage { + private ConfigurePropOpts body; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ConfigurePropActionsRequest other) { + body(other.getBody()); + return this; + } + + @java.lang.Override + @JsonSetter("body") + public _FinalStage body(@NotNull ConfigurePropOpts body) { + this.body = Objects.requireNonNull(body, "body must not be null"); + return this; + } + + @java.lang.Override + public ConfigurePropActionsRequest build() { + return new ConfigurePropActionsRequest(body, additionalProperties); + } + } +} diff --git a/src/main/java/com/pipedream/api/resources/actions/requests/ActionsListRequest.java b/src/main/java/com/pipedream/api/resources/actions/requests/ListActionsRequest.java similarity index 92% rename from src/main/java/com/pipedream/api/resources/actions/requests/ActionsListRequest.java rename to src/main/java/com/pipedream/api/resources/actions/requests/ListActionsRequest.java index 60f1e37..5502181 100644 --- a/src/main/java/com/pipedream/api/resources/actions/requests/ActionsListRequest.java +++ b/src/main/java/com/pipedream/api/resources/actions/requests/ListActionsRequest.java @@ -18,8 +18,8 @@ import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ActionsListRequest.Builder.class) -public final class ActionsListRequest { +@JsonDeserialize(builder = ListActionsRequest.Builder.class) +public final class ListActionsRequest { private final Optional after; private final Optional before; @@ -32,7 +32,7 @@ public final class ActionsListRequest { private final Map additionalProperties; - private ActionsListRequest( + private ListActionsRequest( Optional after, Optional before, Optional limit, @@ -90,7 +90,7 @@ public Optional getApp() { @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof ActionsListRequest && equalTo((ActionsListRequest) other); + return other instanceof ListActionsRequest && equalTo((ListActionsRequest) other); } @JsonAnyGetter @@ -98,7 +98,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(ActionsListRequest other) { + private boolean equalTo(ListActionsRequest other) { return after.equals(other.after) && before.equals(other.before) && limit.equals(other.limit) @@ -137,7 +137,7 @@ public static final class Builder { private Builder() {} - public Builder from(ActionsListRequest other) { + public Builder from(ListActionsRequest other) { after(other.getAfter()); before(other.getBefore()); limit(other.getLimit()); @@ -216,8 +216,8 @@ public Builder app(String app) { return this; } - public ActionsListRequest build() { - return new ActionsListRequest(after, before, limit, q, app, additionalProperties); + public ListActionsRequest build() { + return new ListActionsRequest(after, before, limit, q, app, additionalProperties); } } } diff --git a/src/main/java/com/pipedream/api/resources/actions/requests/ReloadPropsActionsRequest.java b/src/main/java/com/pipedream/api/resources/actions/requests/ReloadPropsActionsRequest.java new file mode 100644 index 0000000..e1528ab --- /dev/null +++ b/src/main/java/com/pipedream/api/resources/actions/requests/ReloadPropsActionsRequest.java @@ -0,0 +1,103 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.pipedream.api.resources.actions.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.pipedream.api.core.ObjectMappers; +import com.pipedream.api.types.ReloadPropsOpts; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ReloadPropsActionsRequest.Builder.class) +public final class ReloadPropsActionsRequest { + private final ReloadPropsOpts body; + + private final Map additionalProperties; + + private ReloadPropsActionsRequest(ReloadPropsOpts body, Map additionalProperties) { + this.body = body; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("body") + public ReloadPropsOpts getBody() { + return body; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ReloadPropsActionsRequest && equalTo((ReloadPropsActionsRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ReloadPropsActionsRequest other) { + return body.equals(other.body); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.body); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static BodyStage builder() { + return new Builder(); + } + + public interface BodyStage { + _FinalStage body(@NotNull ReloadPropsOpts body); + + Builder from(ReloadPropsActionsRequest other); + } + + public interface _FinalStage { + ReloadPropsActionsRequest build(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements BodyStage, _FinalStage { + private ReloadPropsOpts body; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ReloadPropsActionsRequest other) { + body(other.getBody()); + return this; + } + + @java.lang.Override + @JsonSetter("body") + public _FinalStage body(@NotNull ReloadPropsOpts body) { + this.body = Objects.requireNonNull(body, "body must not be null"); + return this; + } + + @java.lang.Override + public ReloadPropsActionsRequest build() { + return new ReloadPropsActionsRequest(body, additionalProperties); + } + } +} diff --git a/src/main/java/com/pipedream/api/resources/actions/requests/ActionsRetrieveRequest.java b/src/main/java/com/pipedream/api/resources/actions/requests/RetrieveActionsRequest.java similarity index 83% rename from src/main/java/com/pipedream/api/resources/actions/requests/ActionsRetrieveRequest.java rename to src/main/java/com/pipedream/api/resources/actions/requests/RetrieveActionsRequest.java index b72eb6c..ebcca9c 100644 --- a/src/main/java/com/pipedream/api/resources/actions/requests/ActionsRetrieveRequest.java +++ b/src/main/java/com/pipedream/api/resources/actions/requests/RetrieveActionsRequest.java @@ -18,13 +18,13 @@ import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ActionsRetrieveRequest.Builder.class) -public final class ActionsRetrieveRequest { +@JsonDeserialize(builder = RetrieveActionsRequest.Builder.class) +public final class RetrieveActionsRequest { private final Optional version; private final Map additionalProperties; - private ActionsRetrieveRequest(Optional version, Map additionalProperties) { + private RetrieveActionsRequest(Optional version, Map additionalProperties) { this.version = version; this.additionalProperties = additionalProperties; } @@ -40,7 +40,7 @@ public Optional getVersion() { @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof ActionsRetrieveRequest && equalTo((ActionsRetrieveRequest) other); + return other instanceof RetrieveActionsRequest && equalTo((RetrieveActionsRequest) other); } @JsonAnyGetter @@ -48,7 +48,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(ActionsRetrieveRequest other) { + private boolean equalTo(RetrieveActionsRequest other) { return version.equals(other.version); } @@ -75,7 +75,7 @@ public static final class Builder { private Builder() {} - public Builder from(ActionsRetrieveRequest other) { + public Builder from(RetrieveActionsRequest other) { version(other.getVersion()); return this; } @@ -94,8 +94,8 @@ public Builder version(String version) { return this; } - public ActionsRetrieveRequest build() { - return new ActionsRetrieveRequest(version, additionalProperties); + public RetrieveActionsRequest build() { + return new RetrieveActionsRequest(version, additionalProperties); } } } diff --git a/src/main/java/com/pipedream/api/resources/actions/requests/RunActionOpts.java b/src/main/java/com/pipedream/api/resources/actions/requests/RunActionOpts.java index acc258b..9328a77 100644 --- a/src/main/java/com/pipedream/api/resources/actions/requests/RunActionOpts.java +++ b/src/main/java/com/pipedream/api/resources/actions/requests/RunActionOpts.java @@ -5,12 +5,15 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.pipedream.api.core.Nullable; +import com.pipedream.api.core.NullableNonemptyFilter; import com.pipedream.api.core.ObjectMappers; import com.pipedream.api.types.ConfiguredPropValue; import com.pipedream.api.types.RunActionOptsStashId; @@ -65,8 +68,11 @@ public String getId() { /** * @return Optional action component version (in SemVer format, for example '1.0.0'), defaults to latest */ - @JsonProperty("version") + @JsonIgnore public Optional getVersion() { + if (version == null) { + return Optional.empty(); + } return version; } @@ -91,8 +97,23 @@ public Optional getDynamicPropsId() { return dynamicPropsId; } - @JsonProperty("stash_id") + @JsonIgnore public Optional getStashId() { + if (stashId == null) { + return Optional.empty(); + } + return stashId; + } + + @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NullableNonemptyFilter.class) + @JsonProperty("version") + private Optional _getVersion() { + return version; + } + + @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NullableNonemptyFilter.class) + @JsonProperty("stash_id") + private Optional _getStashId() { return stashId; } @@ -157,6 +178,8 @@ public interface _FinalStage { _FinalStage version(String version); + _FinalStage version(Nullable version); + _FinalStage configuredProps(Optional> configuredProps); _FinalStage configuredProps(Map configuredProps); @@ -171,6 +194,8 @@ public interface _FinalStage { _FinalStage stashId(Optional stashId); _FinalStage stashId(RunActionOptsStashId stashId); + + _FinalStage stashId(Nullable stashId); } @JsonIgnoreProperties(ignoreUnknown = true) @@ -227,6 +252,18 @@ public _FinalStage externalUserId(@NotNull String externalUserId) { return this; } + @java.lang.Override + public _FinalStage stashId(Nullable stashId) { + if (stashId.isNull()) { + this.stashId = null; + } else if (stashId.isEmpty()) { + this.stashId = Optional.empty(); + } else { + this.stashId = Optional.of(stashId.get()); + } + return this; + } + @java.lang.Override public _FinalStage stashId(RunActionOptsStashId stashId) { this.stashId = Optional.ofNullable(stashId); @@ -273,6 +310,22 @@ public _FinalStage configuredProps(Optional> co return this; } + /** + * Optional action component version (in SemVer format, for example '1.0.0'), defaults to latest + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage version(Nullable version) { + if (version.isNull()) { + this.version = null; + } else if (version.isEmpty()) { + this.version = Optional.empty(); + } else { + this.version = Optional.of(version.get()); + } + return this; + } + /** * Optional action component version (in SemVer format, for example '1.0.0'), defaults to latest * @return Reference to {@code this} so that method calls can be chained together. diff --git a/src/main/java/com/pipedream/api/resources/appcategories/AppCategoriesClient.java b/src/main/java/com/pipedream/api/resources/appcategories/AppCategoriesClient.java index c009b9b..a47c8c4 100644 --- a/src/main/java/com/pipedream/api/resources/appcategories/AppCategoriesClient.java +++ b/src/main/java/com/pipedream/api/resources/appcategories/AppCategoriesClient.java @@ -5,6 +5,7 @@ import com.pipedream.api.core.ClientOptions; import com.pipedream.api.core.RequestOptions; +import com.pipedream.api.resources.appcategories.requests.RetrieveAppCategoriesRequest; import com.pipedream.api.types.AppCategory; import java.util.List; @@ -49,7 +50,14 @@ public AppCategory retrieve(String id) { /** * Get details of a specific app category by its ID */ - public AppCategory retrieve(String id, RequestOptions requestOptions) { - return this.rawClient.retrieve(id, requestOptions).body(); + public AppCategory retrieve(String id, RetrieveAppCategoriesRequest request) { + return this.rawClient.retrieve(id, request).body(); + } + + /** + * Get details of a specific app category by its ID + */ + public AppCategory retrieve(String id, RetrieveAppCategoriesRequest request, RequestOptions requestOptions) { + return this.rawClient.retrieve(id, request, requestOptions).body(); } } diff --git a/src/main/java/com/pipedream/api/resources/appcategories/AsyncAppCategoriesClient.java b/src/main/java/com/pipedream/api/resources/appcategories/AsyncAppCategoriesClient.java index 8540899..15356e8 100644 --- a/src/main/java/com/pipedream/api/resources/appcategories/AsyncAppCategoriesClient.java +++ b/src/main/java/com/pipedream/api/resources/appcategories/AsyncAppCategoriesClient.java @@ -5,6 +5,7 @@ import com.pipedream.api.core.ClientOptions; import com.pipedream.api.core.RequestOptions; +import com.pipedream.api.resources.appcategories.requests.RetrieveAppCategoriesRequest; import com.pipedream.api.types.AppCategory; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -50,7 +51,15 @@ public CompletableFuture retrieve(String id) { /** * Get details of a specific app category by its ID */ - public CompletableFuture retrieve(String id, RequestOptions requestOptions) { - return this.rawClient.retrieve(id, requestOptions).thenApply(response -> response.body()); + public CompletableFuture retrieve(String id, RetrieveAppCategoriesRequest request) { + return this.rawClient.retrieve(id, request).thenApply(response -> response.body()); + } + + /** + * Get details of a specific app category by its ID + */ + public CompletableFuture retrieve( + String id, RetrieveAppCategoriesRequest request, RequestOptions requestOptions) { + return this.rawClient.retrieve(id, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/src/main/java/com/pipedream/api/resources/appcategories/AsyncRawAppCategoriesClient.java b/src/main/java/com/pipedream/api/resources/appcategories/AsyncRawAppCategoriesClient.java index ea828f1..0ce405d 100644 --- a/src/main/java/com/pipedream/api/resources/appcategories/AsyncRawAppCategoriesClient.java +++ b/src/main/java/com/pipedream/api/resources/appcategories/AsyncRawAppCategoriesClient.java @@ -10,6 +10,7 @@ import com.pipedream.api.core.ClientOptions; import com.pipedream.api.core.ObjectMappers; import com.pipedream.api.core.RequestOptions; +import com.pipedream.api.resources.appcategories.requests.RetrieveAppCategoriesRequest; import com.pipedream.api.types.AppCategory; import java.io.IOException; import java.util.List; @@ -61,19 +62,17 @@ public CompletableFuture>> list(Request @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new BaseClientHttpResponse<>( ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), new TypeReference>() {}), + responseBodyString, new TypeReference>() {}), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); @@ -92,24 +91,33 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { * Get details of a specific app category by its ID */ public CompletableFuture> retrieve(String id) { - return retrieve(id, null); + return retrieve(id, RetrieveAppCategoriesRequest.builder().build()); + } + + /** + * Get details of a specific app category by its ID + */ + public CompletableFuture> retrieve( + String id, RetrieveAppCategoriesRequest request) { + return retrieve(id, request, null); } /** * Get details of a specific app category by its ID */ - public CompletableFuture> retrieve(String id, RequestOptions requestOptions) { + public CompletableFuture> retrieve( + String id, RetrieveAppCategoriesRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect/app_categories") .addPathSegment(id) .build(); - Request okhttpRequest = new Request.Builder() + Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl) .method("GET", null) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); @@ -119,18 +127,15 @@ public CompletableFuture> retrieve(String id @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { try (ResponseBody responseBody = response.body()) { + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { future.complete(new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), AppCategory.class), - response)); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, AppCategory.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; } catch (IOException e) { future.completeExceptionally(new BaseClientException("Network error executing HTTP request", e)); diff --git a/src/main/java/com/pipedream/api/resources/appcategories/RawAppCategoriesClient.java b/src/main/java/com/pipedream/api/resources/appcategories/RawAppCategoriesClient.java index 401fd49..93e1e58 100644 --- a/src/main/java/com/pipedream/api/resources/appcategories/RawAppCategoriesClient.java +++ b/src/main/java/com/pipedream/api/resources/appcategories/RawAppCategoriesClient.java @@ -10,6 +10,7 @@ import com.pipedream.api.core.ClientOptions; import com.pipedream.api.core.ObjectMappers; import com.pipedream.api.core.RequestOptions; +import com.pipedream.api.resources.appcategories.requests.RetrieveAppCategoriesRequest; import com.pipedream.api.types.AppCategory; import java.io.IOException; import java.util.List; @@ -54,18 +55,16 @@ public BaseClientHttpResponse> list(RequestOptions requestOpti } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new BaseClientHttpResponse<>( ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), new TypeReference>() {}), + responseBodyString, new TypeReference>() {}), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } @@ -75,40 +74,46 @@ public BaseClientHttpResponse> list(RequestOptions requestOpti * Get details of a specific app category by its ID */ public BaseClientHttpResponse retrieve(String id) { - return retrieve(id, null); + return retrieve(id, RetrieveAppCategoriesRequest.builder().build()); + } + + /** + * Get details of a specific app category by its ID + */ + public BaseClientHttpResponse retrieve(String id, RetrieveAppCategoriesRequest request) { + return retrieve(id, request, null); } /** * Get details of a specific app category by its ID */ - public BaseClientHttpResponse retrieve(String id, RequestOptions requestOptions) { + public BaseClientHttpResponse retrieve( + String id, RetrieveAppCategoriesRequest request, RequestOptions requestOptions) { HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/connect/app_categories") .addPathSegment(id) .build(); - Request okhttpRequest = new Request.Builder() + Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl) .method("GET", null) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } try (Response response = client.newCall(okhttpRequest).execute()) { ResponseBody responseBody = response.body(); + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; if (response.isSuccessful()) { return new BaseClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), AppCategory.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, AppCategory.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new BaseClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (IOException e) { throw new BaseClientException("Network error executing HTTP request", e); } diff --git a/src/main/java/com/pipedream/api/resources/appcategories/requests/RetrieveAppCategoriesRequest.java b/src/main/java/com/pipedream/api/resources/appcategories/requests/RetrieveAppCategoriesRequest.java new file mode 100644 index 0000000..33dce63 --- /dev/null +++ b/src/main/java/com/pipedream/api/resources/appcategories/requests/RetrieveAppCategoriesRequest.java @@ -0,0 +1,59 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.pipedream.api.resources.appcategories.requests; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.pipedream.api.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = RetrieveAppCategoriesRequest.Builder.class) +public final class RetrieveAppCategoriesRequest { + private final Map additionalProperties; + + private RetrieveAppCategoriesRequest(Map
Optional action component version (in SemVer format, for example '1.0.0'), defaults to latest