From 7ab6900df6068856310372f53b569f1f3823d7e7 Mon Sep 17 00:00:00 2001 From: Hieu Duong Date: Wed, 23 Oct 2024 18:46:17 +0700 Subject: [PATCH 1/4] Update Chat API endpoint follow new pattern --- .../java/org/embulk/input/zendesk/utils/ZendeskConstants.java | 2 +- .../embulk/input/zendesk/services/TestZendeskChatService.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java b/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java index 3e410a1..a6f7f49 100644 --- a/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java +++ b/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java @@ -40,7 +40,7 @@ public static class Url public static final String API_OBJECT_RECORD = "api/sunshine/objects/records"; public static final String API_RELATIONSHIP_RECORD = "api/sunshine/relationships/records"; public static final String API_USER_EVENT = "api/v2/users/%s/events"; - public static final String API_CHAT = API + "/chats"; + public static final String API_CHAT = API + "/chat/chats"; public static final String API_CHAT_SEARCH = API_CHAT + "/search"; } diff --git a/src/test/java/org/embulk/input/zendesk/services/TestZendeskChatService.java b/src/test/java/org/embulk/input/zendesk/services/TestZendeskChatService.java index a264870..cc15185 100644 --- a/src/test/java/org/embulk/input/zendesk/services/TestZendeskChatService.java +++ b/src/test/java/org/embulk/input/zendesk/services/TestZendeskChatService.java @@ -58,9 +58,9 @@ public void testFetchData() JsonNode dataSearchJson = ZendeskTestHelper.getJsonFromFile("data/chat_search.json"); JsonNode dataJson = ZendeskTestHelper.getJsonFromFile("data/chat.json"); - when(zendeskRestClient.doGet(eq("https://www.chat.zendesk.com/api/v2/chats/search?q=timestamp%3A%5B2018-09-15T05%3A00%3A00Z+TO+2019-09-29T05%3A00%3A00Z%5D&page=1"), any(), anyBoolean())).thenReturn(dataSearchJson.toString()); + when(zendeskRestClient.doGet(eq("https://www.chat.zendesk.com/api/v2/chat/chats/search?q=timestamp%3A%5B2018-09-15T05%3A00%3A00Z+TO+2019-09-29T05%3A00%3A00Z%5D&page=1"), any(), anyBoolean())).thenReturn(dataSearchJson.toString()); - when(zendeskRestClient.doGet(eq("https://www.chat.zendesk.com/api/v2/chats?ids=id_1%2Cid_2"), any(), anyBoolean())).thenReturn(dataJson.toString()); + when(zendeskRestClient.doGet(eq("https://www.chat.zendesk.com/api/v2/chat/chats?ids=id_1%2Cid_2"), any(), anyBoolean())).thenReturn(dataJson.toString()); zendeskChatService.fetchData("2018-09-15T05:00:00Z", "2019-09-29T05:00:00Z", 1, recordImporter); From 6137b7019d3d0de8583353eed2042a02ed55a0ca Mon Sep 17 00:00:00 2001 From: Hieu Duong Date: Wed, 23 Oct 2024 18:54:53 +0700 Subject: [PATCH 2/4] Update version and CHANGELOG for `0.4.6` --- CHANGELOG.md | 5 ++++- build.gradle | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4fa809..2300eac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ -## 0.4.5 - 2024-10-29 +## 0.4.6 - 2024-10-24 +* [enhancement] Update the API endpoint pattern for Chat endpoint [#88](https://github.com/treasure-data/embulk-input-zendesk/pull/88) + +## 0.4.5 - 2024-10-24 * [enhancement] Remove checking for Chat API due to domain update [#87](https://github.com/treasure-data/embulk-input-zendesk/pull/87) ## 0.4.4 - 2023-07-21 diff --git a/build.gradle b/build.gradle index 40a5a6f..9c9d3a0 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ repositories { def embulkVersion = '0.10.31' group = "com.treasuredata.embulk.plugins" -version = "0.4.5-SNAPSHOT" +version = "0.4.6-SNAPSHOT" description = "Loads records From Zendesk" sourceCompatibility = 1.8 From 2e6302e8f3b04cc73e9018c3d897e446ca64d2fd Mon Sep 17 00:00:00 2001 From: Hieu Duong Date: Wed, 23 Oct 2024 19:54:20 +0700 Subject: [PATCH 3/4] keep backward compatible for API Chat updated --- .../zendesk/services/ZendeskChatService.java | 26 ++++++++++++++++--- .../input/zendesk/utils/ZendeskConstants.java | 7 +++-- .../services/TestZendeskChatService.java | 19 ++++++++++++++ 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/embulk/input/zendesk/services/ZendeskChatService.java b/src/main/java/org/embulk/input/zendesk/services/ZendeskChatService.java index bf9dbdd..5d2c975 100644 --- a/src/main/java/org/embulk/input/zendesk/services/ZendeskChatService.java +++ b/src/main/java/org/embulk/input/zendesk/services/ZendeskChatService.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.regex.Pattern; import java.util.stream.IntStream; import static org.embulk.input.zendesk.ZendeskInputPlugin.CONFIG_MAPPER_FACTORY; @@ -164,9 +165,9 @@ private List getListIDS(final String startTime, final String endTime, fi private String buildSearchRequest(final String startTime, final String endTime, final int page) { return ZendeskUtils.getURIBuilder(task.getLoginUrl()) - .setPath(ZendeskConstants.Url.API_CHAT_SEARCH) - .setParameter("q", buildSearchParam(startTime, endTime)) - .setParameter("page", String.valueOf(page)).toString(); + .setPath(resolveEndpointPatternByDomain(ZendeskConstants.Url.ENDPOINT_CHAT_SEARCH)) + .setParameter("q", buildSearchParam(startTime, endTime)) + .setParameter("page", String.valueOf(page)).toString(); } private String buildSearchParam(final String startTime, final String endTime) @@ -186,7 +187,7 @@ private String buildSearchParam(final String startTime, final String endTime) private String buildSearchRequest(final List ids) { return ZendeskUtils.getURIBuilder(task.getLoginUrl()) - .setPath(ZendeskConstants.Url.API_CHAT) + .setPath(resolveEndpointPatternByDomain(ZendeskConstants.Url.ENDPOINT_CHAT)) .setParameter("ids", buildIdsParam(ids)) .toString(); } @@ -274,4 +275,21 @@ private String getEndTime() ? task.getEndTime().get() : OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT); } + + private String resolveEndpointPatternByDomain(String endpoint) + { + if (isZopimDomain()) { + return ZendeskConstants.Url.API + endpoint; + } + else { + return ZendeskConstants.Url.NEW_API_CHAT + endpoint; + } + } + + private boolean isZopimDomain() + { + return Pattern.compile(ZendeskConstants.Regex.ZOPIM_LOGIN_URL) + .matcher(task.getLoginUrl()) + .matches(); + } } diff --git a/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java b/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java index a6f7f49..7177a69 100644 --- a/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java +++ b/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java @@ -40,8 +40,9 @@ public static class Url public static final String API_OBJECT_RECORD = "api/sunshine/objects/records"; public static final String API_RELATIONSHIP_RECORD = "api/sunshine/relationships/records"; public static final String API_USER_EVENT = "api/v2/users/%s/events"; - public static final String API_CHAT = API + "/chat/chats"; - public static final String API_CHAT_SEARCH = API_CHAT + "/search"; + public static final String NEW_API_CHAT = API + "/chat"; + public static final String ENDPOINT_CHAT = "/chats"; + public static final String ENDPOINT_CHAT_SEARCH = "/chats/search"; } public static class Misc @@ -68,6 +69,8 @@ public static class Regex { public static final String ID = "_id$"; public static final String LOGIN_URL = "^https?://+[a-z0-9_\\\\-]+(.zendesk.com/?)$"; + public static final String ZOPIM_LOGIN_URL = "^https://www.zopim.com/?$"; + } public static class HttpStatus diff --git a/src/test/java/org/embulk/input/zendesk/services/TestZendeskChatService.java b/src/test/java/org/embulk/input/zendesk/services/TestZendeskChatService.java index cc15185..62819d5 100644 --- a/src/test/java/org/embulk/input/zendesk/services/TestZendeskChatService.java +++ b/src/test/java/org/embulk/input/zendesk/services/TestZendeskChatService.java @@ -67,6 +67,25 @@ public void testFetchData() verify(recordImporter, times(2)).addRecord(any()); } + @Test + public void testFetchDataWithZopimDomain() + { + ZendeskInputPlugin.PluginTask task = + CONFIG_MAPPER.map(ZendeskTestHelper.getConfigSource("chat.yml").set("login_url", "https://www.zopim.com"), ZendeskInputPlugin.PluginTask.class); + setupZendeskChatService(task); + + JsonNode dataSearchJson = ZendeskTestHelper.getJsonFromFile("data/chat_search.json"); + JsonNode dataJson = ZendeskTestHelper.getJsonFromFile("data/chat.json"); + + when(zendeskRestClient.doGet(eq("https://www.zopim.com/api/v2/chats/search?q=timestamp%3A%5B2018-09-15T05%3A00%3A00Z+TO+2019-09-29T05%3A00%3A00Z%5D&page=1"), any(), anyBoolean())).thenReturn(dataSearchJson.toString()); + + when(zendeskRestClient.doGet(eq("https://www.zopim.com/api/v2/chats?ids=id_1%2Cid_2"), any(), anyBoolean())).thenReturn(dataJson.toString()); + + zendeskChatService.fetchData("2018-09-15T05:00:00Z", "2019-09-29T05:00:00Z", 1, recordImporter); + + verify(recordImporter, times(2)).addRecord(any()); + } + private void setup() { ZendeskInputPlugin.PluginTask task = From e96fa0512a10167bb34a2092da6ea3f508bb2674 Mon Sep 17 00:00:00 2001 From: Hieu Duong Date: Wed, 23 Oct 2024 20:00:45 +0700 Subject: [PATCH 4/4] Add comment for backward compatible --- .../org/embulk/input/zendesk/services/ZendeskChatService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/embulk/input/zendesk/services/ZendeskChatService.java b/src/main/java/org/embulk/input/zendesk/services/ZendeskChatService.java index 5d2c975..30b486f 100644 --- a/src/main/java/org/embulk/input/zendesk/services/ZendeskChatService.java +++ b/src/main/java/org/embulk/input/zendesk/services/ZendeskChatService.java @@ -276,6 +276,9 @@ private String getEndTime() : OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT); } + // Zopim domain is the domain for old Chat API + // But it will be removed soon and replaced by new Chat API follow new pattern {subdomain}.zendesk.com/api/v2/chat + // The expected released day is before October 29, 2024. So we need to handle this case private String resolveEndpointPatternByDomain(String endpoint) { if (isZopimDomain()) {