Skip to content

fix: add access codes update and wait #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .fernignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@

README.md
sample-app/src/main/java/sample/App.java
src/main/java/com/seam/api/SeamApiClient.java
src/main/java/com/seam/api/AccessCodesClient.java
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,19 @@ AccessCodesCreateResponse accessCodesCreateResponse =
System.out.println(accessCodesCreateResponse.getAccessCode());
```

### Built-in polling

The SDK has convenience methods to poll until access code updates have successfully finished.

```java
Object accessCode = seam.accessCodes().updateAndWaitUntilReady(AccessCodesUpdatePutRequest.builder()
.accessCodeId("my-access-code-id")
.name("access-code-name")
.code("access-code")
.build());
System.out.println(accessCode);
```

## Beta status

This SDK is in beta, and there may be breaking changes between versions without a major version update. Therefore, we recommend pinning the package version to a specific version in your build.gradle file. This way, you can install the same version each time without breaking changes unless you are intentionally looking for the latest version.
Expand Down
14 changes: 13 additions & 1 deletion sample-app/src/main/java/sample/App.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,31 @@
package sample;

import com.seam.api.resources.accesscodes.requests.AccessCodesCreateRequest;
import com.seam.api.resources.accesscodes.requests.AccessCodesUpdatePutRequest;
import com.seam.api.types.AccessCodesCreateResponse;
import java.lang.String;
import com.seam.api.SeamApiClient;

public final class App {
public static void main(String[] args) {
public static void main(String[] args) throws InterruptedException {
SeamApiClient seam = SeamApiClient.builder()
.token("MY_API_KEY")
.build();

// create access code
AccessCodesCreateResponse accessCodesCreateResponse = seam.accessCodes().create(AccessCodesCreateRequest.builder()
.deviceId("123e4567-e89b-12d3-a456-426614174000")
.commonCodeKey("My first code")
.build());
System.out.println(accessCodesCreateResponse.getAccessCode());

Object accessCode = seam.accessCodes().updateAndWaitUntilReady(AccessCodesUpdatePutRequest.builder()
.accessCodeId("my-access-code-id")
.name("access-code-name")
.code("access-code")
.build());
System.out.println(accessCode);
}


}
68 changes: 68 additions & 0 deletions src/main/java/com/seam/api/AccessCodesClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.seam.api;

import com.seam.api.core.ClientOptions;
import com.seam.api.resources.accesscodes.requests.AccessCodesUpdatePutRequest;
import com.seam.api.resources.actionattempts.requests.ActionAttemptsGetRequest;
import com.seam.api.types.AccessCodesUpdatePutResponse;
import com.seam.api.types.ActionAttemptsGetResponse;
import com.seam.api.types.ActionAttemptsGetResponseActionAttemptSuccess;
import java.util.Map;

public class AccessCodesClient extends com.seam.api.resources.accesscodes.AccessCodesClient {

private final SeamApiClient rootClient;

public AccessCodesClient(ClientOptions clientOptions, SeamApiClient rootClient) {
super(clientOptions);
this.rootClient = rootClient;
}

public Object updateAndWaitUntilReady(AccessCodesUpdatePutRequest request) throws InterruptedException {
AccessCodesUpdatePutResponse response = updatePut(request);

if (response.getActionAttempt().isSuccess()) {
String actionAttemptId =
response.getActionAttempt().getSuccess().get().getActionAttemptId();
var actionAttempt = pollUntilReady(actionAttemptId);
if (actionAttempt.getResult().isPresent()
&& actionAttempt.getResult().get() instanceof Map) {
var accessCode = ((Map<String, Object>) actionAttempt.getResult().get()).get("access_code");
return accessCode;
}
}

throw new RuntimeException("AccessCodeUpdate failed. See response=" + response);
}

private ActionAttemptsGetResponseActionAttemptSuccess pollUntilReady(String actionAttemptId)
throws InterruptedException {
ActionAttemptsGetResponse response = null;
while (response == null || response.getActionAttempt().isPending()) {
response = rootClient
.actionAttempts()
.get(ActionAttemptsGetRequest.builder()
.actionAttemptId(actionAttemptId)
.build());
Thread.sleep(2500);
}

if (response.getActionAttempt().isError()) {
var errorResponse = response.getActionAttempt().getError().get();
throw new ActionAttemptFailedException(
errorResponse.getActionAttemptId(), errorResponse.getError().getMessage());
}

return response.getActionAttempt().getSuccess().get();
}

public static class ActionAttemptFailedException extends RuntimeException {

public final String actionAttemptId;
public final String errorMessage;

public ActionAttemptFailedException(String actionAttemptId, String errorMessage) {
this.actionAttemptId = actionAttemptId;
this.errorMessage = errorMessage;
}
}
}
3 changes: 1 addition & 2 deletions src/main/java/com/seam/api/SeamApiClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.seam.api.core.ClientOptions;
import com.seam.api.core.Suppliers;
import com.seam.api.resources.accesscodes.AccessCodesClient;
import com.seam.api.resources.actionattempts.ActionAttemptsClient;
import java.util.function.Supplier;

Expand All @@ -15,7 +14,7 @@ public class SeamApiClient {

public SeamApiClient(ClientOptions clientOptions) {
this.clientOptions = clientOptions;
this.accessCodesClient = Suppliers.memoize(() -> new AccessCodesClient(clientOptions));
this.accessCodesClient = Suppliers.memoize(() -> new AccessCodesClient(clientOptions, this));
this.actionAttemptsClient = Suppliers.memoize(() -> new ActionAttemptsClient(clientOptions));
}

Expand Down