From 46de53fd7f4ca41929ce9ce491b9e379229f979e Mon Sep 17 00:00:00 2001 From: Aditya Alif Nugraha Date: Wed, 28 May 2025 12:09:21 +0200 Subject: [PATCH 1/5] Add EventHooks field to App --- .../io/getstream/chat/java/models/App.java | 96 +++++++++++++++++++ .../java/io/getstream/chat/java/AppTest.java | 80 ++++++++++++++++ 2 files changed, 176 insertions(+) diff --git a/src/main/java/io/getstream/chat/java/models/App.java b/src/main/java/io/getstream/chat/java/models/App.java index 15df87425..323e160db 100644 --- a/src/main/java/io/getstream/chat/java/models/App.java +++ b/src/main/java/io/getstream/chat/java/models/App.java @@ -358,6 +358,97 @@ public enum EnforceUniqueUsernames { UNKNOWN } + public enum HookType { + @JsonProperty("webhook") + WEBHOOK, + @JsonProperty("sqs") + SQS, + @JsonProperty("sns") + SNS, + @JsonEnumDefaultValue + UNKNOWN + } + + @Data + @NoArgsConstructor + public static class EventHook { + @NotNull + @JsonProperty("id") + private String id; + + @NotNull + @JsonProperty("hook_type") + private HookType hookType; + + @NotNull + @JsonProperty("enabled") + private Boolean enabled; + + @NotNull + @JsonProperty("event_types") + private List eventTypes; + + @Nullable + @JsonProperty("webhook_url") + private String webhookURL; + + @Nullable + @JsonProperty("sqs_queue_url") + private String sqsQueueURL; + + @Nullable + @JsonProperty("sqs_region") + private String sqsRegion; + + @Nullable + @JsonProperty("sqs_auth_type") + private String sqsAuthType; + + @Nullable + @JsonProperty("sqs_key") + private String sqsKey; + + @Nullable + @JsonProperty("sqs_secret") + private String sqsSecret; + + @Nullable + @JsonProperty("sqs_role_arn") + private String sqsRoleARN; + + @Nullable + @JsonProperty("sns_topic_arn") + private String snsTopicARN; + + @Nullable + @JsonProperty("sns_region") + private String snsRegion; + + @Nullable + @JsonProperty("sns_auth_type") + private String snsAuthType; + + @Nullable + @JsonProperty("sns_key") + private String snsKey; + + @Nullable + @JsonProperty("sns_secret") + private String snsSecret; + + @Nullable + @JsonProperty("sns_role_arn") + private String snsRoleARN; + + @NotNull + @JsonProperty("created_at") + private Date createdAt; + + @NotNull + @JsonProperty("updated_at") + private Date updatedAt; + } + public static class EnforceUniqueUsernamesDeserializer extends JsonDeserializer { @Override @@ -778,6 +869,11 @@ public static class AppUpdateRequestData { @JsonProperty("grants") private Map> grants; + @Nullable + @JsonProperty("event_hooks") + @JsonInclude(Include.NON_NULL) + private List eventHooks; + public static class AppUpdateRequest extends StreamRequest { @Override protected Call generateCall(Client client) { diff --git a/src/test/java/io/getstream/chat/java/AppTest.java b/src/test/java/io/getstream/chat/java/AppTest.java index a3df12ce1..ef92b3efd 100644 --- a/src/test/java/io/getstream/chat/java/AppTest.java +++ b/src/test/java/io/getstream/chat/java/AppTest.java @@ -5,15 +5,19 @@ import io.getstream.chat.java.models.App.AppCheckSnsResponse; import io.getstream.chat.java.models.App.AppCheckSqsResponse; import io.getstream.chat.java.models.App.AppConfig; +import io.getstream.chat.java.models.App.EventHook; import io.getstream.chat.java.models.App.PushConfigRequestObject; import io.getstream.chat.java.models.App.PushVersion; import io.getstream.chat.java.models.Message; import io.getstream.chat.java.models.Message.MessageRequestObject; import io.getstream.chat.java.services.framework.DefaultClient; import java.util.Calendar; +import java.util.Collections; +import java.util.Date; import java.util.GregorianCalendar; import java.util.Properties; import java.util.Random; +import java.util.Arrays; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -176,4 +180,80 @@ void whenUpdatingAppSettingsSizeLimit_thenNoException() { appConfig = Assertions.assertDoesNotThrow(() -> App.get().request()).getApp(); Assertions.assertEquals(newSizeLimit, appConfig.getFileUploadConfig().getSizeLimit()); } + + @DisplayName("Can update app settings with webhook event hook") + @Test + void whenUpdatingAppSettingsWithWebhookEventHook_thenNoException() throws StreamException { + EventHook webhookHook = new EventHook(); + webhookHook.setId("webhook-1"); + webhookHook.setHookType(App.HookType.WEBHOOK); + webhookHook.setEnabled(true); + webhookHook.setEventTypes(Arrays.asList("message.new", "message.updated")); + webhookHook.setWebhookURL("https://example.com/webhook"); + webhookHook.setCreatedAt(new Date()); + webhookHook.setUpdatedAt(new Date()); + + try { + App.update() + .eventHooks(Collections.singletonList(webhookHook)) + .request(); + } catch (StreamException e) { + if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { + return; + } + throw e; + } + } + + @DisplayName("Can update app settings with SQS event hook") + @Test + void whenUpdatingAppSettingsWithSQSEventHook_thenNoException() throws StreamException { + EventHook sqsHook = new EventHook(); + sqsHook.setId("sqs-1"); + sqsHook.setHookType(App.HookType.SQS); + sqsHook.setEnabled(true); + sqsHook.setEventTypes(Arrays.asList("user.presence.changed", "user.updated")); + sqsHook.setSqsQueueURL("https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue"); + sqsHook.setSqsRegion("us-east-1"); + sqsHook.setSqsAuthType("resource"); + sqsHook.setCreatedAt(new Date()); + sqsHook.setUpdatedAt(new Date()); + + try { + App.update() + .eventHooks(Collections.singletonList(sqsHook)) + .request(); + } catch (StreamException e) { + if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { + return; + } + throw e; + } + } + + @DisplayName("Can update app settings with SNS event hook") + @Test + void whenUpdatingAppSettingsWithSNSEventHook_thenNoException() throws StreamException { + EventHook snsHook = new EventHook(); + snsHook.setId("sns-1"); + snsHook.setHookType(App.HookType.SNS); + snsHook.setEnabled(true); + snsHook.setEventTypes(Arrays.asList("channel.created", "channel.updated")); + snsHook.setSnsTopicARN("arn:aws:sns:us-east-1:123456789012:MyTopic"); + snsHook.setSnsRegion("us-east-1"); + snsHook.setSnsAuthType("resource"); + snsHook.setCreatedAt(new Date()); + snsHook.setUpdatedAt(new Date()); + + try { + App.update() + .eventHooks(Collections.singletonList(snsHook)) + .request(); + } catch (StreamException e) { + if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { + return; + } + throw e; + } + } } From 0b6a3633b0a1520b100aa1cd961f4d7f43b1aebc Mon Sep 17 00:00:00 2001 From: Aditya Alif Nugraha Date: Wed, 28 May 2025 12:22:01 +0200 Subject: [PATCH 2/5] Introduce enum for auth type --- .../java/io/getstream/chat/java/models/App.java | 15 +++++++++++++-- src/test/java/io/getstream/chat/java/AppTest.java | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/models/App.java b/src/main/java/io/getstream/chat/java/models/App.java index 323e160db..297644e0a 100644 --- a/src/main/java/io/getstream/chat/java/models/App.java +++ b/src/main/java/io/getstream/chat/java/models/App.java @@ -369,6 +369,17 @@ public enum HookType { UNKNOWN } + public enum AuthType { + @JsonProperty("keys") + KEYS, // Using AWS access key and secret key + @JsonProperty("role") + ROLE, // Using IAM role + @JsonProperty("resource") + RESOURCE, // Using resource-based policy + @JsonEnumDefaultValue + UNKNOWN + } + @Data @NoArgsConstructor public static class EventHook { @@ -402,7 +413,7 @@ public static class EventHook { @Nullable @JsonProperty("sqs_auth_type") - private String sqsAuthType; + private AuthType sqsAuthType; @Nullable @JsonProperty("sqs_key") @@ -426,7 +437,7 @@ public static class EventHook { @Nullable @JsonProperty("sns_auth_type") - private String snsAuthType; + private AuthType snsAuthType; @Nullable @JsonProperty("sns_key") diff --git a/src/test/java/io/getstream/chat/java/AppTest.java b/src/test/java/io/getstream/chat/java/AppTest.java index ef92b3efd..4baa63faf 100644 --- a/src/test/java/io/getstream/chat/java/AppTest.java +++ b/src/test/java/io/getstream/chat/java/AppTest.java @@ -215,7 +215,7 @@ void whenUpdatingAppSettingsWithSQSEventHook_thenNoException() throws StreamExce sqsHook.setEventTypes(Arrays.asList("user.presence.changed", "user.updated")); sqsHook.setSqsQueueURL("https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue"); sqsHook.setSqsRegion("us-east-1"); - sqsHook.setSqsAuthType("resource"); + sqsHook.setSqsAuthType(App.AuthType.RESOURCE); sqsHook.setCreatedAt(new Date()); sqsHook.setUpdatedAt(new Date()); @@ -241,7 +241,7 @@ void whenUpdatingAppSettingsWithSNSEventHook_thenNoException() throws StreamExce snsHook.setEventTypes(Arrays.asList("channel.created", "channel.updated")); snsHook.setSnsTopicARN("arn:aws:sns:us-east-1:123456789012:MyTopic"); snsHook.setSnsRegion("us-east-1"); - snsHook.setSnsAuthType("resource"); + snsHook.setSnsAuthType(App.AuthType.RESOURCE); snsHook.setCreatedAt(new Date()); snsHook.setUpdatedAt(new Date()); From 7a4b2649f6d4466396cbdc3583bb6edcf0488271 Mon Sep 17 00:00:00 2001 From: Aditya Alif Nugraha Date: Wed, 28 May 2025 12:34:43 +0200 Subject: [PATCH 3/5] Fix lint --- .../java/io/getstream/chat/java/models/App.java | 4 ++-- src/test/java/io/getstream/chat/java/AppTest.java | 14 ++++---------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/models/App.java b/src/main/java/io/getstream/chat/java/models/App.java index 297644e0a..f239b5862 100644 --- a/src/main/java/io/getstream/chat/java/models/App.java +++ b/src/main/java/io/getstream/chat/java/models/App.java @@ -371,9 +371,9 @@ public enum HookType { public enum AuthType { @JsonProperty("keys") - KEYS, // Using AWS access key and secret key + KEYS, // Using AWS access key and secret key @JsonProperty("role") - ROLE, // Using IAM role + ROLE, // Using IAM role @JsonProperty("resource") RESOURCE, // Using resource-based policy @JsonEnumDefaultValue diff --git a/src/test/java/io/getstream/chat/java/AppTest.java b/src/test/java/io/getstream/chat/java/AppTest.java index 4baa63faf..644672a3e 100644 --- a/src/test/java/io/getstream/chat/java/AppTest.java +++ b/src/test/java/io/getstream/chat/java/AppTest.java @@ -11,13 +11,13 @@ import io.getstream.chat.java.models.Message; import io.getstream.chat.java.models.Message.MessageRequestObject; import io.getstream.chat.java.services.framework.DefaultClient; +import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.Properties; import java.util.Random; -import java.util.Arrays; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -194,9 +194,7 @@ void whenUpdatingAppSettingsWithWebhookEventHook_thenNoException() throws Stream webhookHook.setUpdatedAt(new Date()); try { - App.update() - .eventHooks(Collections.singletonList(webhookHook)) - .request(); + App.update().eventHooks(Collections.singletonList(webhookHook)).request(); } catch (StreamException e) { if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { return; @@ -220,9 +218,7 @@ void whenUpdatingAppSettingsWithSQSEventHook_thenNoException() throws StreamExce sqsHook.setUpdatedAt(new Date()); try { - App.update() - .eventHooks(Collections.singletonList(sqsHook)) - .request(); + App.update().eventHooks(Collections.singletonList(sqsHook)).request(); } catch (StreamException e) { if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { return; @@ -246,9 +242,7 @@ void whenUpdatingAppSettingsWithSNSEventHook_thenNoException() throws StreamExce snsHook.setUpdatedAt(new Date()); try { - App.update() - .eventHooks(Collections.singletonList(snsHook)) - .request(); + App.update().eventHooks(Collections.singletonList(snsHook)).request(); } catch (StreamException e) { if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { return; From 112921e34baff8e4afa66731b1f59bbe90fb6be2 Mon Sep 17 00:00:00 2001 From: Aditya Alif Nugraha Date: Wed, 28 May 2025 14:33:43 +0200 Subject: [PATCH 4/5] Update assert --- src/test/java/io/getstream/chat/java/AppTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/io/getstream/chat/java/AppTest.java b/src/test/java/io/getstream/chat/java/AppTest.java index 644672a3e..5264678bb 100644 --- a/src/test/java/io/getstream/chat/java/AppTest.java +++ b/src/test/java/io/getstream/chat/java/AppTest.java @@ -196,7 +196,7 @@ void whenUpdatingAppSettingsWithWebhookEventHook_thenNoException() throws Stream try { App.update().eventHooks(Collections.singletonList(webhookHook)).request(); } catch (StreamException e) { - if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { + if (e.getMessage().contains("cannot set event hooks in hook v1 system")) { return; } throw e; @@ -220,7 +220,7 @@ void whenUpdatingAppSettingsWithSQSEventHook_thenNoException() throws StreamExce try { App.update().eventHooks(Collections.singletonList(sqsHook)).request(); } catch (StreamException e) { - if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { + if (e.getMessage().contains("cannot set event hooks in hook v1 system")) { return; } throw e; @@ -244,7 +244,7 @@ void whenUpdatingAppSettingsWithSNSEventHook_thenNoException() throws StreamExce try { App.update().eventHooks(Collections.singletonList(snsHook)).request(); } catch (StreamException e) { - if ("cannot set event hooks in hook v1 system".equals(e.getMessage())) { + if (e.getMessage().contains("cannot set event hooks in hook v1 system")) { return; } throw e; From 0b7c13ca0bc1c8813f57f0f8f3134ac2dc0ec234 Mon Sep 17 00:00:00 2001 From: Aditya Alif Nugraha Date: Mon, 16 Jun 2025 13:11:12 +0700 Subject: [PATCH 5/5] Add pending message request --- .../io/getstream/chat/java/models/App.java | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/models/App.java b/src/main/java/io/getstream/chat/java/models/App.java index f239b5862..512ba9f4c 100644 --- a/src/main/java/io/getstream/chat/java/models/App.java +++ b/src/main/java/io/getstream/chat/java/models/App.java @@ -365,6 +365,8 @@ public enum HookType { SQS, @JsonProperty("sns") SNS, + @JsonProperty("pending_message") + PENDING_MESSAGE, @JsonEnumDefaultValue UNKNOWN } @@ -380,22 +382,41 @@ public enum AuthType { UNKNOWN } + @Data + @NoArgsConstructor + public static class PendingMessageCallback { + @Nullable + @JsonProperty("mode") + private CallbackMode mode; + } + + public enum CallbackMode { + @JsonProperty("CALLBACK_MODE_NONE") + NONE, + @JsonProperty("CALLBACK_MODE_REST") + REST, + @JsonProperty("CALLBACK_MODE_TWIRP") + TWIRP, + @JsonEnumDefaultValue + UNKNOWN + } + @Data @NoArgsConstructor public static class EventHook { - @NotNull + @Nullable @JsonProperty("id") private String id; - @NotNull + @Nullable @JsonProperty("hook_type") private HookType hookType; - @NotNull + @Nullable @JsonProperty("enabled") private Boolean enabled; - @NotNull + @Nullable @JsonProperty("event_types") private List eventTypes; @@ -451,11 +472,19 @@ public static class EventHook { @JsonProperty("sns_role_arn") private String snsRoleARN; - @NotNull + @Nullable + @JsonProperty("timeout_ms") + private Integer timeoutMs; + + @Nullable + @JsonProperty("callback") + private PendingMessageCallback callback; + + @Nullable @JsonProperty("created_at") private Date createdAt; - @NotNull + @Nullable @JsonProperty("updated_at") private Date updatedAt; }