Skip to content

Commit 2cc12c0

Browse files
feat: Add SSE events API, refresh token revocation, branding identifiers, and connection options (#860)
Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
1 parent ba3adfb commit 2cc12c0

821 files changed

Lines changed: 74305 additions & 9170 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

reference.md

Lines changed: 229 additions & 9 deletions
Large diffs are not rendered by default.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/**
2+
* This file was auto-generated by Fern from our API Definition.
3+
*/
4+
package com.auth0.client.mgmt;
5+
6+
import com.auth0.client.mgmt.core.ClientOptions;
7+
import com.auth0.client.mgmt.core.RequestOptions;
8+
import com.auth0.client.mgmt.types.EventStreamSubscribeEventsResponseContent;
9+
import com.auth0.client.mgmt.types.SubscribeEventsRequestParameters;
10+
import java.util.concurrent.CompletableFuture;
11+
12+
public class AsyncEventsClient {
13+
protected final ClientOptions clientOptions;
14+
15+
private final AsyncRawEventsClient rawClient;
16+
17+
public AsyncEventsClient(ClientOptions clientOptions) {
18+
this.clientOptions = clientOptions;
19+
this.rawClient = new AsyncRawEventsClient(clientOptions);
20+
}
21+
22+
/**
23+
* Get responses with HTTP metadata like headers
24+
*/
25+
public AsyncRawEventsClient withRawResponse() {
26+
return this.rawClient;
27+
}
28+
29+
/**
30+
* Subscribe to events via Server-Sent Events (SSE)
31+
*/
32+
public CompletableFuture<Iterable<EventStreamSubscribeEventsResponseContent>> subscribe() {
33+
return this.rawClient.subscribe().thenApply(response -> response.body());
34+
}
35+
36+
/**
37+
* Subscribe to events via Server-Sent Events (SSE)
38+
*/
39+
public CompletableFuture<Iterable<EventStreamSubscribeEventsResponseContent>> subscribe(
40+
RequestOptions requestOptions) {
41+
return this.rawClient.subscribe(requestOptions).thenApply(response -> response.body());
42+
}
43+
44+
/**
45+
* Subscribe to events via Server-Sent Events (SSE)
46+
*/
47+
public CompletableFuture<Iterable<EventStreamSubscribeEventsResponseContent>> subscribe(
48+
SubscribeEventsRequestParameters request) {
49+
return this.rawClient.subscribe(request).thenApply(response -> response.body());
50+
}
51+
52+
/**
53+
* Subscribe to events via Server-Sent Events (SSE)
54+
*/
55+
public CompletableFuture<Iterable<EventStreamSubscribeEventsResponseContent>> subscribe(
56+
SubscribeEventsRequestParameters request, RequestOptions requestOptions) {
57+
return this.rawClient.subscribe(request, requestOptions).thenApply(response -> response.body());
58+
}
59+
}

src/main/java/com/auth0/client/mgmt/AsyncManagementApi.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public class AsyncManagementApi {
3838

3939
protected final Supplier<AsyncEventStreamsClient> eventStreamsClient;
4040

41+
protected final Supplier<AsyncEventsClient> eventsClient;
42+
4143
protected final Supplier<AsyncFlowsClient> flowsClient;
4244

4345
protected final Supplier<AsyncFormsClient> formsClient;
@@ -116,6 +118,7 @@ public AsyncManagementApi(ClientOptions clientOptions) {
116118
this.deviceCredentialsClient = Suppliers.memoize(() -> new AsyncDeviceCredentialsClient(clientOptions));
117119
this.emailTemplatesClient = Suppliers.memoize(() -> new AsyncEmailTemplatesClient(clientOptions));
118120
this.eventStreamsClient = Suppliers.memoize(() -> new AsyncEventStreamsClient(clientOptions));
121+
this.eventsClient = Suppliers.memoize(() -> new AsyncEventsClient(clientOptions));
119122
this.flowsClient = Suppliers.memoize(() -> new AsyncFlowsClient(clientOptions));
120123
this.formsClient = Suppliers.memoize(() -> new AsyncFormsClient(clientOptions));
121124
this.userGrantsClient = Suppliers.memoize(() -> new AsyncUserGrantsClient(clientOptions));
@@ -191,6 +194,10 @@ public AsyncEventStreamsClient eventStreams() {
191194
return this.eventStreamsClient.get();
192195
}
193196

197+
public AsyncEventsClient events() {
198+
return this.eventsClient.get();
199+
}
200+
194201
public AsyncFlowsClient flows() {
195202
return this.flowsClient.get();
196203
}
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
/**
2+
* This file was auto-generated by Fern from our API Definition.
3+
*/
4+
package com.auth0.client.mgmt;
5+
6+
import com.auth0.client.mgmt.core.ClientOptions;
7+
import com.auth0.client.mgmt.core.ManagementApiException;
8+
import com.auth0.client.mgmt.core.ManagementApiHttpResponse;
9+
import com.auth0.client.mgmt.core.ManagementException;
10+
import com.auth0.client.mgmt.core.ObjectMappers;
11+
import com.auth0.client.mgmt.core.QueryStringMapper;
12+
import com.auth0.client.mgmt.core.RequestOptions;
13+
import com.auth0.client.mgmt.core.ResponseBodyReader;
14+
import com.auth0.client.mgmt.core.Stream;
15+
import com.auth0.client.mgmt.errors.BadRequestError;
16+
import com.auth0.client.mgmt.errors.ForbiddenError;
17+
import com.auth0.client.mgmt.errors.GoneError;
18+
import com.auth0.client.mgmt.errors.NotFoundError;
19+
import com.auth0.client.mgmt.errors.TooManyRequestsError;
20+
import com.auth0.client.mgmt.errors.UnauthorizedError;
21+
import com.auth0.client.mgmt.types.EventStreamSubscribeEventsResponseContent;
22+
import com.auth0.client.mgmt.types.SubscribeEventsRequestParameters;
23+
import com.fasterxml.jackson.core.JsonProcessingException;
24+
import java.io.IOException;
25+
import java.util.concurrent.CompletableFuture;
26+
import java.util.concurrent.TimeUnit;
27+
import okhttp3.Call;
28+
import okhttp3.Callback;
29+
import okhttp3.Headers;
30+
import okhttp3.HttpUrl;
31+
import okhttp3.OkHttpClient;
32+
import okhttp3.Request;
33+
import okhttp3.Response;
34+
import okhttp3.ResponseBody;
35+
import org.jetbrains.annotations.NotNull;
36+
37+
public class AsyncRawEventsClient {
38+
protected final ClientOptions clientOptions;
39+
40+
public AsyncRawEventsClient(ClientOptions clientOptions) {
41+
this.clientOptions = clientOptions;
42+
}
43+
44+
/**
45+
* Subscribe to events via Server-Sent Events (SSE)
46+
*/
47+
public CompletableFuture<ManagementApiHttpResponse<Iterable<EventStreamSubscribeEventsResponseContent>>>
48+
subscribe() {
49+
return subscribe(SubscribeEventsRequestParameters.builder().build());
50+
}
51+
52+
/**
53+
* Subscribe to events via Server-Sent Events (SSE)
54+
*/
55+
public CompletableFuture<ManagementApiHttpResponse<Iterable<EventStreamSubscribeEventsResponseContent>>> subscribe(
56+
RequestOptions requestOptions) {
57+
return subscribe(SubscribeEventsRequestParameters.builder().build(), requestOptions);
58+
}
59+
60+
/**
61+
* Subscribe to events via Server-Sent Events (SSE)
62+
*/
63+
public CompletableFuture<ManagementApiHttpResponse<Iterable<EventStreamSubscribeEventsResponseContent>>> subscribe(
64+
SubscribeEventsRequestParameters request) {
65+
return subscribe(request, null);
66+
}
67+
68+
/**
69+
* Subscribe to events via Server-Sent Events (SSE)
70+
*/
71+
public CompletableFuture<ManagementApiHttpResponse<Iterable<EventStreamSubscribeEventsResponseContent>>> subscribe(
72+
SubscribeEventsRequestParameters request, RequestOptions requestOptions) {
73+
HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
74+
.newBuilder()
75+
.addPathSegments("events");
76+
if (!request.getFrom().isAbsent()) {
77+
QueryStringMapper.addQueryParameter(
78+
httpUrl, "from", request.getFrom().orElse(null), false);
79+
}
80+
if (!request.getFromTimestamp().isAbsent()) {
81+
QueryStringMapper.addQueryParameter(
82+
httpUrl, "from_timestamp", request.getFromTimestamp().orElse(null), false);
83+
}
84+
if (request.getEventType().isPresent()) {
85+
QueryStringMapper.addQueryParameter(
86+
httpUrl, "event_type", request.getEventType().get(), true);
87+
}
88+
if (requestOptions != null) {
89+
requestOptions.getQueryParameters().forEach((_key, _value) -> {
90+
httpUrl.addQueryParameter(_key, _value);
91+
});
92+
}
93+
Request.Builder _requestBuilder = new Request.Builder()
94+
.url(httpUrl.build())
95+
.method("GET", null)
96+
.headers(Headers.of(clientOptions.headers(requestOptions)));
97+
Request okhttpRequest = _requestBuilder.build();
98+
OkHttpClient client = clientOptions.httpClient();
99+
if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
100+
client = clientOptions.httpClientWithTimeout(requestOptions);
101+
}
102+
client = client.newBuilder().callTimeout(0, TimeUnit.SECONDS).build();
103+
CompletableFuture<ManagementApiHttpResponse<Iterable<EventStreamSubscribeEventsResponseContent>>> future =
104+
new CompletableFuture<>();
105+
client.newCall(okhttpRequest).enqueue(new Callback() {
106+
@Override
107+
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
108+
try {
109+
ResponseBody responseBody = response.body();
110+
if (response.isSuccessful()) {
111+
future.complete(new ManagementApiHttpResponse<>(
112+
Stream.fromSse(
113+
EventStreamSubscribeEventsResponseContent.class,
114+
new ResponseBodyReader(response)),
115+
response));
116+
return;
117+
}
118+
String responseBodyString = responseBody != null ? responseBody.string() : "{}";
119+
try {
120+
switch (response.code()) {
121+
case 400:
122+
future.completeExceptionally(new BadRequestError(
123+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
124+
response));
125+
return;
126+
case 401:
127+
future.completeExceptionally(new UnauthorizedError(
128+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
129+
response));
130+
return;
131+
case 403:
132+
future.completeExceptionally(new ForbiddenError(
133+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
134+
response));
135+
return;
136+
case 404:
137+
future.completeExceptionally(new NotFoundError(
138+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
139+
response));
140+
return;
141+
case 410:
142+
future.completeExceptionally(new GoneError(
143+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
144+
response));
145+
return;
146+
case 429:
147+
future.completeExceptionally(new TooManyRequestsError(
148+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
149+
response));
150+
return;
151+
}
152+
} catch (JsonProcessingException ignored) {
153+
// unable to map error response, throwing generic error
154+
}
155+
Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
156+
future.completeExceptionally(new ManagementApiException(
157+
"Error with status code " + response.code(), response.code(), errorBody, response));
158+
return;
159+
} catch (IOException e) {
160+
future.completeExceptionally(new ManagementException("Network error executing HTTP request", e));
161+
}
162+
}
163+
164+
@Override
165+
public void onFailure(@NotNull Call call, @NotNull IOException e) {
166+
future.completeExceptionally(new ManagementException("Network error executing HTTP request", e));
167+
}
168+
});
169+
return future;
170+
}
171+
}

src/main/java/com/auth0/client/mgmt/AsyncRawGroupsClient.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ public CompletableFuture<ManagementApiHttpResponse<SyncPagingIterable<Group>>> l
8585
QueryStringMapper.addQueryParameter(
8686
httpUrl, "external_id", request.getExternalId().orElse(null), false);
8787
}
88+
if (!request.getSearch().isAbsent()) {
89+
QueryStringMapper.addQueryParameter(
90+
httpUrl, "search", request.getSearch().orElse(null), false);
91+
}
8892
if (!request.getFields().isAbsent()) {
8993
QueryStringMapper.addQueryParameter(
9094
httpUrl, "fields", request.getFields().orElse(null), false);

src/main/java/com/auth0/client/mgmt/AsyncRawRefreshTokensClient.java

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.auth0.client.mgmt.types.GetRefreshTokensPaginatedResponseContent;
2222
import com.auth0.client.mgmt.types.GetRefreshTokensRequestParameters;
2323
import com.auth0.client.mgmt.types.RefreshTokenResponseContent;
24+
import com.auth0.client.mgmt.types.RevokeRefreshTokensRequestContent;
2425
import com.auth0.client.mgmt.types.UpdateRefreshTokenRequestContent;
2526
import com.auth0.client.mgmt.types.UpdateRefreshTokenResponseContent;
2627
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -176,6 +177,111 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) {
176177
return future;
177178
}
178179

180+
/**
181+
* Revoke refresh tokens in bulk by ID list, user, user+client, or client.
182+
*/
183+
public CompletableFuture<ManagementApiHttpResponse<Void>> revoke() {
184+
return revoke(RevokeRefreshTokensRequestContent.builder().build());
185+
}
186+
187+
/**
188+
* Revoke refresh tokens in bulk by ID list, user, user+client, or client.
189+
*/
190+
public CompletableFuture<ManagementApiHttpResponse<Void>> revoke(RequestOptions requestOptions) {
191+
return revoke(RevokeRefreshTokensRequestContent.builder().build(), requestOptions);
192+
}
193+
194+
/**
195+
* Revoke refresh tokens in bulk by ID list, user, user+client, or client.
196+
*/
197+
public CompletableFuture<ManagementApiHttpResponse<Void>> revoke(RevokeRefreshTokensRequestContent request) {
198+
return revoke(request, null);
199+
}
200+
201+
/**
202+
* Revoke refresh tokens in bulk by ID list, user, user+client, or client.
203+
*/
204+
public CompletableFuture<ManagementApiHttpResponse<Void>> revoke(
205+
RevokeRefreshTokensRequestContent request, RequestOptions requestOptions) {
206+
HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
207+
.newBuilder()
208+
.addPathSegments("refresh-tokens/revoke");
209+
if (requestOptions != null) {
210+
requestOptions.getQueryParameters().forEach((_key, _value) -> {
211+
httpUrl.addQueryParameter(_key, _value);
212+
});
213+
}
214+
RequestBody body;
215+
try {
216+
body = RequestBody.create(
217+
ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON);
218+
} catch (JsonProcessingException e) {
219+
throw new ManagementException("Failed to serialize request", e);
220+
}
221+
Request okhttpRequest = new Request.Builder()
222+
.url(httpUrl.build())
223+
.method("POST", body)
224+
.headers(Headers.of(clientOptions.headers(requestOptions)))
225+
.addHeader("Content-Type", "application/json")
226+
.addHeader("Accept", "application/json")
227+
.build();
228+
OkHttpClient client = clientOptions.httpClient();
229+
if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
230+
client = clientOptions.httpClientWithTimeout(requestOptions);
231+
}
232+
CompletableFuture<ManagementApiHttpResponse<Void>> future = new CompletableFuture<>();
233+
client.newCall(okhttpRequest).enqueue(new Callback() {
234+
@Override
235+
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
236+
try (ResponseBody responseBody = response.body()) {
237+
if (response.isSuccessful()) {
238+
future.complete(new ManagementApiHttpResponse<>(null, response));
239+
return;
240+
}
241+
String responseBodyString = responseBody != null ? responseBody.string() : "{}";
242+
try {
243+
switch (response.code()) {
244+
case 400:
245+
future.completeExceptionally(new BadRequestError(
246+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
247+
response));
248+
return;
249+
case 401:
250+
future.completeExceptionally(new UnauthorizedError(
251+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
252+
response));
253+
return;
254+
case 403:
255+
future.completeExceptionally(new ForbiddenError(
256+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
257+
response));
258+
return;
259+
case 429:
260+
future.completeExceptionally(new TooManyRequestsError(
261+
ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
262+
response));
263+
return;
264+
}
265+
} catch (JsonProcessingException ignored) {
266+
// unable to map error response, throwing generic error
267+
}
268+
Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
269+
future.completeExceptionally(new ManagementApiException(
270+
"Error with status code " + response.code(), response.code(), errorBody, response));
271+
return;
272+
} catch (IOException e) {
273+
future.completeExceptionally(new ManagementException("Network error executing HTTP request", e));
274+
}
275+
}
276+
277+
@Override
278+
public void onFailure(@NotNull Call call, @NotNull IOException e) {
279+
future.completeExceptionally(new ManagementException("Network error executing HTTP request", e));
280+
}
281+
});
282+
return future;
283+
}
284+
179285
/**
180286
* Retrieve refresh token information.
181287
*/

0 commit comments

Comments
 (0)