Skip to content

Commit b8669b4

Browse files
authored
Add EventHooks field to App (#183)
* Add EventHooks field to App * Introduce enum for auth type * Fix lint * Update assert * Add pending message request
1 parent da7b060 commit b8669b4

File tree

2 files changed

+210
-0
lines changed

2 files changed

+210
-0
lines changed

src/main/java/io/getstream/chat/java/models/App.java

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,137 @@ public enum EnforceUniqueUsernames {
358358
UNKNOWN
359359
}
360360

361+
public enum HookType {
362+
@JsonProperty("webhook")
363+
WEBHOOK,
364+
@JsonProperty("sqs")
365+
SQS,
366+
@JsonProperty("sns")
367+
SNS,
368+
@JsonProperty("pending_message")
369+
PENDING_MESSAGE,
370+
@JsonEnumDefaultValue
371+
UNKNOWN
372+
}
373+
374+
public enum AuthType {
375+
@JsonProperty("keys")
376+
KEYS, // Using AWS access key and secret key
377+
@JsonProperty("role")
378+
ROLE, // Using IAM role
379+
@JsonProperty("resource")
380+
RESOURCE, // Using resource-based policy
381+
@JsonEnumDefaultValue
382+
UNKNOWN
383+
}
384+
385+
@Data
386+
@NoArgsConstructor
387+
public static class PendingMessageCallback {
388+
@Nullable
389+
@JsonProperty("mode")
390+
private CallbackMode mode;
391+
}
392+
393+
public enum CallbackMode {
394+
@JsonProperty("CALLBACK_MODE_NONE")
395+
NONE,
396+
@JsonProperty("CALLBACK_MODE_REST")
397+
REST,
398+
@JsonProperty("CALLBACK_MODE_TWIRP")
399+
TWIRP,
400+
@JsonEnumDefaultValue
401+
UNKNOWN
402+
}
403+
404+
@Data
405+
@NoArgsConstructor
406+
public static class EventHook {
407+
@Nullable
408+
@JsonProperty("id")
409+
private String id;
410+
411+
@Nullable
412+
@JsonProperty("hook_type")
413+
private HookType hookType;
414+
415+
@Nullable
416+
@JsonProperty("enabled")
417+
private Boolean enabled;
418+
419+
@Nullable
420+
@JsonProperty("event_types")
421+
private List<String> eventTypes;
422+
423+
@Nullable
424+
@JsonProperty("webhook_url")
425+
private String webhookURL;
426+
427+
@Nullable
428+
@JsonProperty("sqs_queue_url")
429+
private String sqsQueueURL;
430+
431+
@Nullable
432+
@JsonProperty("sqs_region")
433+
private String sqsRegion;
434+
435+
@Nullable
436+
@JsonProperty("sqs_auth_type")
437+
private AuthType sqsAuthType;
438+
439+
@Nullable
440+
@JsonProperty("sqs_key")
441+
private String sqsKey;
442+
443+
@Nullable
444+
@JsonProperty("sqs_secret")
445+
private String sqsSecret;
446+
447+
@Nullable
448+
@JsonProperty("sqs_role_arn")
449+
private String sqsRoleARN;
450+
451+
@Nullable
452+
@JsonProperty("sns_topic_arn")
453+
private String snsTopicARN;
454+
455+
@Nullable
456+
@JsonProperty("sns_region")
457+
private String snsRegion;
458+
459+
@Nullable
460+
@JsonProperty("sns_auth_type")
461+
private AuthType snsAuthType;
462+
463+
@Nullable
464+
@JsonProperty("sns_key")
465+
private String snsKey;
466+
467+
@Nullable
468+
@JsonProperty("sns_secret")
469+
private String snsSecret;
470+
471+
@Nullable
472+
@JsonProperty("sns_role_arn")
473+
private String snsRoleARN;
474+
475+
@Nullable
476+
@JsonProperty("timeout_ms")
477+
private Integer timeoutMs;
478+
479+
@Nullable
480+
@JsonProperty("callback")
481+
private PendingMessageCallback callback;
482+
483+
@Nullable
484+
@JsonProperty("created_at")
485+
private Date createdAt;
486+
487+
@Nullable
488+
@JsonProperty("updated_at")
489+
private Date updatedAt;
490+
}
491+
361492
public static class EnforceUniqueUsernamesDeserializer
362493
extends JsonDeserializer<EnforceUniqueUsernames> {
363494
@Override
@@ -778,6 +909,11 @@ public static class AppUpdateRequestData {
778909
@JsonProperty("grants")
779910
private Map<String, List<String>> grants;
780911

912+
@Nullable
913+
@JsonProperty("event_hooks")
914+
@JsonInclude(Include.NON_NULL)
915+
private List<EventHook> eventHooks;
916+
781917
public static class AppUpdateRequest extends StreamRequest<StreamResponseObject> {
782918
@Override
783919
protected Call<StreamResponseObject> generateCall(Client client) {

src/test/java/io/getstream/chat/java/AppTest.java

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55
import io.getstream.chat.java.models.App.AppCheckSnsResponse;
66
import io.getstream.chat.java.models.App.AppCheckSqsResponse;
77
import io.getstream.chat.java.models.App.AppConfig;
8+
import io.getstream.chat.java.models.App.EventHook;
89
import io.getstream.chat.java.models.App.PushConfigRequestObject;
910
import io.getstream.chat.java.models.App.PushVersion;
1011
import io.getstream.chat.java.models.Message;
1112
import io.getstream.chat.java.models.Message.MessageRequestObject;
1213
import io.getstream.chat.java.services.framework.DefaultClient;
14+
import java.util.Arrays;
1315
import java.util.Calendar;
16+
import java.util.Collections;
17+
import java.util.Date;
1418
import java.util.GregorianCalendar;
1519
import java.util.Properties;
1620
import java.util.Random;
@@ -176,4 +180,74 @@ void whenUpdatingAppSettingsSizeLimit_thenNoException() {
176180
appConfig = Assertions.assertDoesNotThrow(() -> App.get().request()).getApp();
177181
Assertions.assertEquals(newSizeLimit, appConfig.getFileUploadConfig().getSizeLimit());
178182
}
183+
184+
@DisplayName("Can update app settings with webhook event hook")
185+
@Test
186+
void whenUpdatingAppSettingsWithWebhookEventHook_thenNoException() throws StreamException {
187+
EventHook webhookHook = new EventHook();
188+
webhookHook.setId("webhook-1");
189+
webhookHook.setHookType(App.HookType.WEBHOOK);
190+
webhookHook.setEnabled(true);
191+
webhookHook.setEventTypes(Arrays.asList("message.new", "message.updated"));
192+
webhookHook.setWebhookURL("https://example.com/webhook");
193+
webhookHook.setCreatedAt(new Date());
194+
webhookHook.setUpdatedAt(new Date());
195+
196+
try {
197+
App.update().eventHooks(Collections.singletonList(webhookHook)).request();
198+
} catch (StreamException e) {
199+
if (e.getMessage().contains("cannot set event hooks in hook v1 system")) {
200+
return;
201+
}
202+
throw e;
203+
}
204+
}
205+
206+
@DisplayName("Can update app settings with SQS event hook")
207+
@Test
208+
void whenUpdatingAppSettingsWithSQSEventHook_thenNoException() throws StreamException {
209+
EventHook sqsHook = new EventHook();
210+
sqsHook.setId("sqs-1");
211+
sqsHook.setHookType(App.HookType.SQS);
212+
sqsHook.setEnabled(true);
213+
sqsHook.setEventTypes(Arrays.asList("user.presence.changed", "user.updated"));
214+
sqsHook.setSqsQueueURL("https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue");
215+
sqsHook.setSqsRegion("us-east-1");
216+
sqsHook.setSqsAuthType(App.AuthType.RESOURCE);
217+
sqsHook.setCreatedAt(new Date());
218+
sqsHook.setUpdatedAt(new Date());
219+
220+
try {
221+
App.update().eventHooks(Collections.singletonList(sqsHook)).request();
222+
} catch (StreamException e) {
223+
if (e.getMessage().contains("cannot set event hooks in hook v1 system")) {
224+
return;
225+
}
226+
throw e;
227+
}
228+
}
229+
230+
@DisplayName("Can update app settings with SNS event hook")
231+
@Test
232+
void whenUpdatingAppSettingsWithSNSEventHook_thenNoException() throws StreamException {
233+
EventHook snsHook = new EventHook();
234+
snsHook.setId("sns-1");
235+
snsHook.setHookType(App.HookType.SNS);
236+
snsHook.setEnabled(true);
237+
snsHook.setEventTypes(Arrays.asList("channel.created", "channel.updated"));
238+
snsHook.setSnsTopicARN("arn:aws:sns:us-east-1:123456789012:MyTopic");
239+
snsHook.setSnsRegion("us-east-1");
240+
snsHook.setSnsAuthType(App.AuthType.RESOURCE);
241+
snsHook.setCreatedAt(new Date());
242+
snsHook.setUpdatedAt(new Date());
243+
244+
try {
245+
App.update().eventHooks(Collections.singletonList(snsHook)).request();
246+
} catch (StreamException e) {
247+
if (e.getMessage().contains("cannot set event hooks in hook v1 system")) {
248+
return;
249+
}
250+
throw e;
251+
}
252+
}
179253
}

0 commit comments

Comments
 (0)