Skip to content

Commit 6ea816f

Browse files
authored
fix: add access codes update and wait (#1)
* add access codes update and wait * fix fernignore paths
1 parent 1c4114a commit 6ea816f

File tree

5 files changed

+97
-3
lines changed

5 files changed

+97
-3
lines changed

.fernignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22

33
README.md
44
sample-app/src/main/java/sample/App.java
5+
src/main/java/com/seam/api/SeamApiClient.java
6+
src/main/java/com/seam/api/AccessCodesClient.java

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,19 @@ AccessCodesCreateResponse accessCodesCreateResponse =
4747
System.out.println(accessCodesCreateResponse.getAccessCode());
4848
```
4949

50+
### Built-in polling
51+
52+
The SDK has convenience methods to poll until access code updates have successfully finished.
53+
54+
```java
55+
Object accessCode = seam.accessCodes().updateAndWaitUntilReady(AccessCodesUpdatePutRequest.builder()
56+
.accessCodeId("my-access-code-id")
57+
.name("access-code-name")
58+
.code("access-code")
59+
.build());
60+
System.out.println(accessCode);
61+
```
62+
5063
## Beta status
5164

5265
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.
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,31 @@
11
package sample;
22

33
import com.seam.api.resources.accesscodes.requests.AccessCodesCreateRequest;
4+
import com.seam.api.resources.accesscodes.requests.AccessCodesUpdatePutRequest;
45
import com.seam.api.types.AccessCodesCreateResponse;
56
import java.lang.String;
67
import com.seam.api.SeamApiClient;
78

89
public final class App {
9-
public static void main(String[] args) {
10+
public static void main(String[] args) throws InterruptedException {
1011
SeamApiClient seam = SeamApiClient.builder()
1112
.token("MY_API_KEY")
1213
.build();
14+
15+
// create access code
1316
AccessCodesCreateResponse accessCodesCreateResponse = seam.accessCodes().create(AccessCodesCreateRequest.builder()
1417
.deviceId("123e4567-e89b-12d3-a456-426614174000")
1518
.commonCodeKey("My first code")
1619
.build());
1720
System.out.println(accessCodesCreateResponse.getAccessCode());
21+
22+
Object accessCode = seam.accessCodes().updateAndWaitUntilReady(AccessCodesUpdatePutRequest.builder()
23+
.accessCodeId("my-access-code-id")
24+
.name("access-code-name")
25+
.code("access-code")
26+
.build());
27+
System.out.println(accessCode);
1828
}
29+
30+
1931
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.seam.api;
2+
3+
import com.seam.api.core.ClientOptions;
4+
import com.seam.api.resources.accesscodes.requests.AccessCodesUpdatePutRequest;
5+
import com.seam.api.resources.actionattempts.requests.ActionAttemptsGetRequest;
6+
import com.seam.api.types.AccessCodesUpdatePutResponse;
7+
import com.seam.api.types.ActionAttemptsGetResponse;
8+
import com.seam.api.types.ActionAttemptsGetResponseActionAttemptSuccess;
9+
import java.util.Map;
10+
11+
public class AccessCodesClient extends com.seam.api.resources.accesscodes.AccessCodesClient {
12+
13+
private final SeamApiClient rootClient;
14+
15+
public AccessCodesClient(ClientOptions clientOptions, SeamApiClient rootClient) {
16+
super(clientOptions);
17+
this.rootClient = rootClient;
18+
}
19+
20+
public Object updateAndWaitUntilReady(AccessCodesUpdatePutRequest request) throws InterruptedException {
21+
AccessCodesUpdatePutResponse response = updatePut(request);
22+
23+
if (response.getActionAttempt().isSuccess()) {
24+
String actionAttemptId =
25+
response.getActionAttempt().getSuccess().get().getActionAttemptId();
26+
var actionAttempt = pollUntilReady(actionAttemptId);
27+
if (actionAttempt.getResult().isPresent()
28+
&& actionAttempt.getResult().get() instanceof Map) {
29+
var accessCode = ((Map<String, Object>) actionAttempt.getResult().get()).get("access_code");
30+
return accessCode;
31+
}
32+
}
33+
34+
throw new RuntimeException("AccessCodeUpdate failed. See response=" + response);
35+
}
36+
37+
private ActionAttemptsGetResponseActionAttemptSuccess pollUntilReady(String actionAttemptId)
38+
throws InterruptedException {
39+
ActionAttemptsGetResponse response = null;
40+
while (response == null || response.getActionAttempt().isPending()) {
41+
response = rootClient
42+
.actionAttempts()
43+
.get(ActionAttemptsGetRequest.builder()
44+
.actionAttemptId(actionAttemptId)
45+
.build());
46+
Thread.sleep(2500);
47+
}
48+
49+
if (response.getActionAttempt().isError()) {
50+
var errorResponse = response.getActionAttempt().getError().get();
51+
throw new ActionAttemptFailedException(
52+
errorResponse.getActionAttemptId(), errorResponse.getError().getMessage());
53+
}
54+
55+
return response.getActionAttempt().getSuccess().get();
56+
}
57+
58+
public static class ActionAttemptFailedException extends RuntimeException {
59+
60+
public final String actionAttemptId;
61+
public final String errorMessage;
62+
63+
public ActionAttemptFailedException(String actionAttemptId, String errorMessage) {
64+
this.actionAttemptId = actionAttemptId;
65+
this.errorMessage = errorMessage;
66+
}
67+
}
68+
}

src/main/java/com/seam/api/SeamApiClient.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.seam.api.core.ClientOptions;
44
import com.seam.api.core.Suppliers;
5-
import com.seam.api.resources.accesscodes.AccessCodesClient;
65
import com.seam.api.resources.actionattempts.ActionAttemptsClient;
76
import java.util.function.Supplier;
87

@@ -15,7 +14,7 @@ public class SeamApiClient {
1514

1615
public SeamApiClient(ClientOptions clientOptions) {
1716
this.clientOptions = clientOptions;
18-
this.accessCodesClient = Suppliers.memoize(() -> new AccessCodesClient(clientOptions));
17+
this.accessCodesClient = Suppliers.memoize(() -> new AccessCodesClient(clientOptions, this));
1918
this.actionAttemptsClient = Suppliers.memoize(() -> new ActionAttemptsClient(clientOptions));
2019
}
2120

0 commit comments

Comments
 (0)