embulk-input-zendesk-all 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +5 -0
  4. data/CHANGELOG.md +126 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +91 -0
  7. data/build.gradle +123 -0
  8. data/config/checkstyle/checkstyle.xml +128 -0
  9. data/config/checkstyle/default.xml +108 -0
  10. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  11. data/gradle/wrapper/gradle-wrapper.properties +5 -0
  12. data/gradlew +172 -0
  13. data/gradlew.bat +84 -0
  14. data/lib/embulk/guess/zendesk.rb +21 -0
  15. data/lib/embulk/input/zendesk.rb +3 -0
  16. data/src/main/java/org/embulk/input/zendesk/RecordImporter.java +134 -0
  17. data/src/main/java/org/embulk/input/zendesk/ZendeskInputPlugin.java +513 -0
  18. data/src/main/java/org/embulk/input/zendesk/clients/ZendeskRestClient.java +291 -0
  19. data/src/main/java/org/embulk/input/zendesk/models/AuthenticationMethod.java +23 -0
  20. data/src/main/java/org/embulk/input/zendesk/models/Target.java +47 -0
  21. data/src/main/java/org/embulk/input/zendesk/models/ZendeskException.java +25 -0
  22. data/src/main/java/org/embulk/input/zendesk/services/ZendeskCustomObjectService.java +110 -0
  23. data/src/main/java/org/embulk/input/zendesk/services/ZendeskNPSService.java +30 -0
  24. data/src/main/java/org/embulk/input/zendesk/services/ZendeskNormalServices.java +347 -0
  25. data/src/main/java/org/embulk/input/zendesk/services/ZendeskService.java +14 -0
  26. data/src/main/java/org/embulk/input/zendesk/services/ZendeskSupportAPIService.java +63 -0
  27. data/src/main/java/org/embulk/input/zendesk/services/ZendeskUserEventService.java +158 -0
  28. data/src/main/java/org/embulk/input/zendesk/stream/PagingSpliterator.java +40 -0
  29. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/CustomObjectSpliterator.java +42 -0
  30. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/SunshineSpliterator.java +66 -0
  31. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/UserEventSpliterator.java +35 -0
  32. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/OrganizationSpliterator.java +13 -0
  33. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/SupportSpliterator.java +44 -0
  34. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/UserSpliterator.java +13 -0
  35. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java +72 -0
  36. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskDateUtils.java +68 -0
  37. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskUtils.java +92 -0
  38. data/src/test/java/org/embulk/input/zendesk/TestRecordImporter.java +114 -0
  39. data/src/test/java/org/embulk/input/zendesk/TestZendeskInputPlugin.java +402 -0
  40. data/src/test/java/org/embulk/input/zendesk/clients/TestZendeskRestClient.java +337 -0
  41. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskCustomObjectService.java +161 -0
  42. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNPSService.java +56 -0
  43. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNormalService.java +261 -0
  44. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskSupportAPIService.java +130 -0
  45. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskUserEventService.java +158 -0
  46. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskDateUtils.java +87 -0
  47. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskUtil.java +22 -0
  48. data/src/test/java/org/embulk/input/zendesk/utils/ZendeskPluginTestRuntime.java +133 -0
  49. data/src/test/java/org/embulk/input/zendesk/utils/ZendeskTestHelper.java +92 -0
  50. data/src/test/resources/config/base.yml +14 -0
  51. data/src/test/resources/config/base_validator.yml +48 -0
  52. data/src/test/resources/config/incremental.yml +54 -0
  53. data/src/test/resources/config/non-incremental.yml +39 -0
  54. data/src/test/resources/config/nps.yml +31 -0
  55. data/src/test/resources/config/object_records.yml +24 -0
  56. data/src/test/resources/config/relationship_records.yml +23 -0
  57. data/src/test/resources/config/user_events.yml +29 -0
  58. data/src/test/resources/config/util.yml +18 -0
  59. data/src/test/resources/data/client.json +293 -0
  60. data/src/test/resources/data/duplicate_user.json +0 -0
  61. data/src/test/resources/data/empty_result.json +7 -0
  62. data/src/test/resources/data/error_data.json +187 -0
  63. data/src/test/resources/data/expected/ticket_column.json +148 -0
  64. data/src/test/resources/data/expected/ticket_column_with_related_objects.json +152 -0
  65. data/src/test/resources/data/expected/ticket_fields_column.json +92 -0
  66. data/src/test/resources/data/expected/ticket_metrics_column.json +98 -0
  67. data/src/test/resources/data/expected/user_events_column.json +40 -0
  68. data/src/test/resources/data/object_records.json +30 -0
  69. data/src/test/resources/data/organization.json +39 -0
  70. data/src/test/resources/data/relationship_records.json +57 -0
  71. data/src/test/resources/data/scores.json +21 -0
  72. data/src/test/resources/data/scores_share_same_time_with_next_page.json +35 -0
  73. data/src/test/resources/data/scores_share_same_time_without_next_page.json +35 -0
  74. data/src/test/resources/data/simple_organization.json +23 -0
  75. data/src/test/resources/data/simple_user.json +50 -0
  76. data/src/test/resources/data/simple_user_event.json +19 -0
  77. data/src/test/resources/data/ticket_events_share_same_time_with_next_page.json +279 -0
  78. data/src/test/resources/data/ticket_events_share_same_time_without_next_page.json +279 -0
  79. data/src/test/resources/data/ticket_events_updated_by_system_records.json +279 -0
  80. data/src/test/resources/data/ticket_fields.json +225 -0
  81. data/src/test/resources/data/ticket_metrics.json +397 -0
  82. data/src/test/resources/data/ticket_share_same_time_with_next_page.json +232 -0
  83. data/src/test/resources/data/ticket_share_same_time_without_next_page.json +232 -0
  84. data/src/test/resources/data/ticket_with_related_objects.json +67 -0
  85. data/src/test/resources/data/ticket_with_updated_by_system_records.json +187 -0
  86. data/src/test/resources/data/tickets.json +232 -0
  87. data/src/test/resources/data/tickets_continue.json +52 -0
  88. data/src/test/resources/data/user_event.json +19 -0
  89. data/src/test/resources/data/user_event_contain_latter_create_at.json +19 -0
  90. data/src/test/resources/data/user_event_multiple.json +33 -0
  91. data/src/test/resources/data/util.json +19 -0
  92. data/src/test/resources/data/util_page.json +227 -0
  93. metadata +168 -0
@@ -0,0 +1,158 @@
1
+ package org.embulk.input.zendesk.services;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import com.fasterxml.jackson.databind.ObjectMapper;
5
+ import com.google.common.annotations.VisibleForTesting;
6
+ import org.apache.http.client.utils.URIBuilder;
7
+ import org.embulk.config.TaskReport;
8
+ import org.embulk.input.zendesk.RecordImporter;
9
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
10
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
11
+ import org.embulk.input.zendesk.models.Target;
12
+ import org.embulk.input.zendesk.stream.paginator.sunshine.UserEventSpliterator;
13
+ import org.embulk.input.zendesk.stream.paginator.support.OrganizationSpliterator;
14
+ import org.embulk.input.zendesk.stream.paginator.support.UserSpliterator;
15
+ import org.embulk.input.zendesk.utils.ZendeskConstants;
16
+ import org.embulk.input.zendesk.utils.ZendeskDateUtils;
17
+ import org.embulk.input.zendesk.utils.ZendeskUtils;
18
+ import org.embulk.spi.DataException;
19
+ import org.embulk.spi.Exec;
20
+
21
+ import java.io.IOException;
22
+ import java.time.Instant;
23
+ import java.util.List;
24
+ import java.util.Set;
25
+ import java.util.concurrent.ConcurrentHashMap;
26
+ import java.util.stream.Collectors;
27
+ import java.util.stream.Stream;
28
+ import java.util.stream.StreamSupport;
29
+
30
+ public class ZendeskUserEventService implements ZendeskService
31
+ {
32
+ protected ZendeskInputPlugin.PluginTask task;
33
+
34
+ private ZendeskRestClient zendeskRestClient;
35
+
36
+ public ZendeskUserEventService(final ZendeskInputPlugin.PluginTask task)
37
+ {
38
+ this.task = task;
39
+ }
40
+
41
+ public boolean isSupportIncremental()
42
+ {
43
+ return false;
44
+ }
45
+
46
+ @Override
47
+ public TaskReport addRecordToImporter(final int taskIndex, final RecordImporter recordImporter)
48
+ {
49
+ final TaskReport taskReport = Exec.newTaskReport();
50
+
51
+ if (Exec.isPreview()) {
52
+ JsonNode jsonNode = mockJsonNode();
53
+ recordImporter.addRecord(jsonNode.get(0));
54
+ return taskReport;
55
+ }
56
+
57
+ final List<JsonNode> organizations = StreamSupport.stream(new OrganizationSpliterator(buildOrganizationURI(), getZendeskRestClient(), task), false)
58
+ .collect(Collectors.toList());
59
+ final Set<String> knownUserIds = ConcurrentHashMap.newKeySet();
60
+ organizations.parallelStream().forEach(
61
+ organization -> {
62
+ Stream<JsonNode> stream = StreamSupport.stream(new UserSpliterator(buildOrganizationWithUserURI(organization.get("url").asText()),
63
+ getZendeskRestClient(), task, Exec.isPreview()), true);
64
+
65
+ if (task.getDedup()) {
66
+ stream = stream.filter(item -> knownUserIds.add(item.get("id").asText()));
67
+ }
68
+
69
+ stream.forEach(s ->
70
+ {
71
+ Stream<JsonNode> userEventStream = StreamSupport.stream(new UserEventSpliterator(s.get("id").asText(), buildUserEventURI(s.get("id").asText()),
72
+ getZendeskRestClient(), task, Exec.isPreview()), true);
73
+ userEventStream.forEach(recordImporter::addRecord);
74
+ });
75
+ }
76
+ );
77
+ return taskReport;
78
+ }
79
+
80
+ @Override
81
+ public JsonNode getDataFromPath(final String path, final int page, final boolean isPreview, final long startTime)
82
+ {
83
+ return new ObjectMapper().createObjectNode().set(task.getTarget().getJsonName(), mockJsonNode());
84
+ }
85
+
86
+ @VisibleForTesting
87
+ protected ZendeskRestClient getZendeskRestClient()
88
+ {
89
+ if (zendeskRestClient == null) {
90
+ zendeskRestClient = new ZendeskRestClient();
91
+ }
92
+ return zendeskRestClient;
93
+ }
94
+
95
+ private String buildOrganizationURI()
96
+ {
97
+ return ZendeskUtils.getURIBuilder(task.getLoginUrl())
98
+ .setPath(ZendeskConstants.Url.API + "/" + Target.ORGANIZATIONS.getJsonName())
99
+ .setParameter("per_page", "100")
100
+ .setParameter("page", "1")
101
+ .toString();
102
+ }
103
+
104
+ private String buildOrganizationWithUserURI(final String path)
105
+ {
106
+ return path.replace(".json", "")
107
+ + "/users.json?per_page=100&page=1";
108
+ }
109
+
110
+ private String buildUserEventURI(final String userID)
111
+ {
112
+ final URIBuilder uriBuilder = ZendeskUtils.getURIBuilder(task.getLoginUrl())
113
+ .setPath(ZendeskConstants.Url.API_USER_EVENT)
114
+ .setParameter("identifier", task.getProfileSource().get() + ":user_id:" + userID);
115
+
116
+ task.getUserEventSource().ifPresent(eventSource -> uriBuilder.setParameter("source", eventSource));
117
+ task.getUserEventType().ifPresent(eventType -> uriBuilder.setParameter("type", eventType));
118
+ task.getStartTime().ifPresent(startTime -> {
119
+ try {
120
+ uriBuilder.setParameter("start_time", ZendeskDateUtils.convertToDateTimeFormat(startTime, ZendeskConstants.Misc.ISO_INSTANT));
121
+ }
122
+ catch (DataException e) {
123
+ uriBuilder.setParameter("start_time", ZendeskDateUtils.convertToDateTimeFormat(Instant.EPOCH.toString(), ZendeskConstants.Misc.ISO_INSTANT));
124
+ }
125
+ });
126
+
127
+ task.getEndTime().ifPresent(endTime -> uriBuilder.setParameter("end_time", ZendeskDateUtils.convertToDateTimeFormat(endTime, ZendeskConstants.Misc.ISO_INSTANT)));
128
+
129
+ return uriBuilder.toString();
130
+ }
131
+
132
+ private JsonNode mockJsonNode()
133
+ {
134
+ try {
135
+ String mockData = "[\n" +
136
+ " {\n" +
137
+ " \"id\": \"5c7f31aef8df240001e60bbf\",\n" +
138
+ " \"type\": \"remove_from_cart\",\n" +
139
+ " \"source\": \"shopify\",\n" +
140
+ " \"description\": \"\",\n" +
141
+ " \"authenticated\": true,\n" +
142
+ " \"created_at\": \"2019-03-06T02:34:22Z\",\n" +
143
+ " \"received_at\": \"2019-03-06T02:34:22Z\",\n" +
144
+ " \"properties\": {\n" +
145
+ " \"model\": 221,\n" +
146
+ " \"size\": 6\n" +
147
+ " },\n" +
148
+ " \"user_id\": \"12312354234\"\n" +
149
+ " }\n" +
150
+ "]";
151
+
152
+ return new ObjectMapper().readTree(mockData);
153
+ }
154
+ catch (IOException ex) {
155
+ throw new RuntimeException("Can not create sample data " + ex.getMessage());
156
+ }
157
+ }
158
+ }
@@ -0,0 +1,40 @@
1
+ package org.embulk.input.zendesk.stream;
2
+
3
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
4
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
5
+
6
+ import java.util.Spliterator;
7
+
8
+ public abstract class PagingSpliterator<E> implements Spliterator<E>
9
+ {
10
+ protected ZendeskRestClient zendeskRestClient;
11
+ protected boolean isPreview;
12
+ protected ZendeskInputPlugin.PluginTask task;
13
+ protected String path;
14
+
15
+ protected PagingSpliterator(final String path, final ZendeskRestClient zendeskRestClient, final ZendeskInputPlugin.PluginTask task, final boolean isPreview)
16
+ {
17
+ this.path = path;
18
+ this.zendeskRestClient = zendeskRestClient;
19
+ this.task = task;
20
+ this.isPreview = isPreview;
21
+ }
22
+
23
+ @Override
24
+ public Spliterator<E> trySplit()
25
+ {
26
+ return null;
27
+ }
28
+
29
+ @Override
30
+ public int characteristics()
31
+ {
32
+ return DISTINCT | NONNULL | IMMUTABLE;
33
+ }
34
+
35
+ @Override
36
+ public long estimateSize()
37
+ {
38
+ return Long.MAX_VALUE;
39
+ }
40
+ }
@@ -0,0 +1,42 @@
1
+ package org.embulk.input.zendesk.stream.paginator.sunshine;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
5
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
6
+ import org.embulk.input.zendesk.utils.ZendeskUtils;
7
+
8
+ import java.util.Iterator;
9
+ import java.util.function.Consumer;
10
+
11
+ public class CustomObjectSpliterator extends SunshineSpliterator
12
+ {
13
+ public CustomObjectSpliterator(final String path, final ZendeskRestClient zendeskRestClient, final ZendeskInputPlugin.PluginTask task, final boolean isPreview)
14
+ {
15
+ super(path, zendeskRestClient, task, isPreview);
16
+ }
17
+
18
+ @Override
19
+ protected boolean isContinue(final JsonNode jsonNode, final Consumer<? super JsonNode> action)
20
+ {
21
+ final Iterator<JsonNode> iterator = ZendeskUtils.getListRecords(jsonNode, task.getTarget().getJsonName());
22
+
23
+ if (isPreview) {
24
+ if (iterator.hasNext()) {
25
+ JsonNode item = iterator.next();
26
+ // we have data for preview, no need to continue
27
+ if (item != null && !item.isNull()) {
28
+ action.accept(item);
29
+ return false;
30
+ }
31
+ }
32
+ }
33
+ handleRunIterator(iterator, action);
34
+
35
+ if (jsonNode.has("links") && !ZendeskUtils.isNull(jsonNode.get("links"))
36
+ && jsonNode.get("links").has("next") && !ZendeskUtils.isNull(jsonNode.get("links").get("next"))) {
37
+ path = task.getLoginUrl() + jsonNode.get("links").get("next");
38
+ return true;
39
+ }
40
+ return false;
41
+ }
42
+ }
@@ -0,0 +1,66 @@
1
+ package org.embulk.input.zendesk.stream.paginator.sunshine;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import org.apache.http.HttpStatus;
5
+ import org.embulk.config.ConfigException;
6
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
7
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
8
+ import org.embulk.input.zendesk.models.ZendeskException;
9
+ import org.embulk.input.zendesk.stream.PagingSpliterator;
10
+ import org.embulk.input.zendesk.utils.ZendeskUtils;
11
+
12
+ import java.util.Iterator;
13
+ import java.util.function.Consumer;
14
+
15
+ public class SunshineSpliterator extends PagingSpliterator<JsonNode>
16
+ {
17
+ public SunshineSpliterator(final String path, final ZendeskRestClient zendeskRestClient, final ZendeskInputPlugin.PluginTask task, final boolean isPreview)
18
+ {
19
+ super(path, zendeskRestClient, task, isPreview);
20
+ }
21
+
22
+ @Override
23
+ public boolean tryAdvance(final Consumer<? super JsonNode> action)
24
+ {
25
+ try {
26
+ final String result = zendeskRestClient.doGet(path, task, isPreview);
27
+
28
+ if (result != null && !result.isEmpty()) {
29
+ final JsonNode jsonNode = ZendeskUtils.parseJsonObject(result);
30
+ final JsonNode targetJsonNode = jsonNode.get(task.getTarget().getJsonName());
31
+ if (!ZendeskUtils.isNull(targetJsonNode)) {
32
+ return isContinue(jsonNode, action);
33
+ }
34
+ }
35
+ }
36
+ catch (final ConfigException e) {
37
+ if (!(e.getCause() instanceof ZendeskException && ((ZendeskException) e.getCause()).getStatusCode() == HttpStatus.SC_NOT_FOUND)) {
38
+ throw e;
39
+ }
40
+ }
41
+ return false;
42
+ }
43
+
44
+ protected void handleRunIterator(Iterator<JsonNode> iterator, final Consumer<? super JsonNode> action)
45
+ {
46
+ iterator.forEachRemaining(
47
+ item -> {
48
+ if (item != null && !item.isNull()) {
49
+ action.accept(iterator.next());
50
+ }
51
+ });
52
+ }
53
+
54
+ protected boolean isContinue(final JsonNode jsonNode, final Consumer<? super JsonNode> action)
55
+ {
56
+ final Iterator<JsonNode> iterator = ZendeskUtils.getListRecords(jsonNode, task.getTarget().getJsonName());
57
+ handleRunIterator(iterator, action);
58
+
59
+ if (jsonNode.has("links") && !ZendeskUtils.isNull(jsonNode.get("links"))
60
+ && jsonNode.get("links").has("next") && !ZendeskUtils.isNull(jsonNode.get("links").get("next"))) {
61
+ path = task.getLoginUrl() + jsonNode.get("links").get("next");
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ }
@@ -0,0 +1,35 @@
1
+ package org.embulk.input.zendesk.stream.paginator.sunshine;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import com.fasterxml.jackson.databind.node.ObjectNode;
5
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
6
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
7
+ import org.embulk.input.zendesk.utils.ZendeskUtils;
8
+
9
+ import java.util.Iterator;
10
+ import java.util.function.Consumer;
11
+
12
+ public class UserEventSpliterator extends SunshineSpliterator
13
+ {
14
+ private String userID;
15
+
16
+ public UserEventSpliterator(final String userID, final String path, final ZendeskRestClient zendeskRestClient, final ZendeskInputPlugin.PluginTask task, final boolean isPreview)
17
+ {
18
+ super(path, zendeskRestClient, task, isPreview);
19
+ this.userID = userID;
20
+ }
21
+
22
+ @Override
23
+ protected void handleRunIterator(final Iterator<JsonNode> iterator, final Consumer<? super JsonNode> action)
24
+ {
25
+ iterator.forEachRemaining(
26
+ item -> {
27
+ if (!ZendeskUtils.isNull(item)) {
28
+ JsonNode temp = iterator.next();
29
+ // Because in the returned json doesn't have user_id, so we try to add to it
30
+ ((ObjectNode) temp).put("user_id", this.userID);
31
+ action.accept(temp);
32
+ }
33
+ });
34
+ }
35
+ }
@@ -0,0 +1,13 @@
1
+ package org.embulk.input.zendesk.stream.paginator.support;
2
+
3
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
4
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
5
+ import org.embulk.input.zendesk.models.Target;
6
+
7
+ public class OrganizationSpliterator extends SupportSpliterator
8
+ {
9
+ public OrganizationSpliterator(final String path, final ZendeskRestClient zendeskRestClient, final ZendeskInputPlugin.PluginTask task)
10
+ {
11
+ super(Target.ORGANIZATIONS, path, zendeskRestClient, task, false);
12
+ }
13
+ }
@@ -0,0 +1,44 @@
1
+ package org.embulk.input.zendesk.stream.paginator.support;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
5
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
6
+ import org.embulk.input.zendesk.models.Target;
7
+ import org.embulk.input.zendesk.stream.PagingSpliterator;
8
+ import org.embulk.input.zendesk.utils.ZendeskUtils;
9
+
10
+ import java.util.Iterator;
11
+ import java.util.function.Consumer;
12
+
13
+ public class SupportSpliterator extends PagingSpliterator<JsonNode>
14
+ {
15
+ Target target;
16
+
17
+ public SupportSpliterator(final Target target, final String path, final ZendeskRestClient zendeskRestClient, final ZendeskInputPlugin.PluginTask task, final boolean isPreview)
18
+ {
19
+ super(path, zendeskRestClient, task, isPreview);
20
+ this.target = target;
21
+ }
22
+
23
+ @Override
24
+ public boolean tryAdvance(final Consumer<? super JsonNode> action)
25
+ {
26
+ final String result = zendeskRestClient.doGet(path, task, isPreview);
27
+ if (result != null && !result.isEmpty()) {
28
+ final JsonNode jsonNode = ZendeskUtils.parseJsonObject(result);
29
+ final Iterator<JsonNode> iterator = ZendeskUtils.getListRecords(jsonNode, target.getJsonName());
30
+ iterator.forEachRemaining(
31
+ item -> {
32
+ if (!ZendeskUtils.isNull(item)) {
33
+ action.accept(item);
34
+ }
35
+ });
36
+ if (jsonNode.get("next_page") != null && !jsonNode.get("next_page").isNull()) {
37
+ path = jsonNode.get("next_page").asText();
38
+ return true;
39
+ }
40
+ }
41
+
42
+ return false;
43
+ }
44
+ }
@@ -0,0 +1,13 @@
1
+ package org.embulk.input.zendesk.stream.paginator.support;
2
+
3
+ import org.embulk.input.zendesk.ZendeskInputPlugin;
4
+ import org.embulk.input.zendesk.clients.ZendeskRestClient;
5
+ import org.embulk.input.zendesk.models.Target;
6
+
7
+ public class UserSpliterator extends SupportSpliterator
8
+ {
9
+ public UserSpliterator(final String path, final ZendeskRestClient zendeskRestClient, final ZendeskInputPlugin.PluginTask task, final boolean isPreview)
10
+ {
11
+ super(Target.USERS, path, zendeskRestClient, task, isPreview);
12
+ }
13
+ }
@@ -0,0 +1,72 @@
1
+ package org.embulk.input.zendesk.utils;
2
+
3
+ import com.google.common.collect.ImmutableList;
4
+
5
+ import java.util.Arrays;
6
+ import java.util.List;
7
+
8
+ public class ZendeskConstants
9
+ {
10
+ private ZendeskConstants()
11
+ {
12
+ }
13
+
14
+ public static class Header
15
+ {
16
+ public static final String APPLICATION_JSON = "application/json";
17
+
18
+ public static final String ZENDESK_MARKETPLACE_NAME = "X-Zendesk-Marketplace-Name";
19
+ public static final String ZENDESK_MARKETPLACE_ORGANIZATION_ID = "X-Zendesk-Marketplace-Organization-Id";
20
+ public static final String ZENDESK_MARKETPLACE_APP_ID = "X-Zendesk-Marketplace-App-Id";
21
+ }
22
+
23
+ public static class Field
24
+ {
25
+ public static final String START_TIME = "start_time";
26
+ public static final String END_TIME = "end_time";
27
+ public static final String COUNT = "count";
28
+ public static final String GENERATED_TIMESTAMP = "generated_timestamp";
29
+ public static final String UPDATED_AT = "updated_at";
30
+ public static final String ID = "id";
31
+ public static final String NEXT_PAGE="next_page";
32
+ }
33
+
34
+ public static class Url
35
+ {
36
+ public static final String API = "/api/v2";
37
+ public static final String API_INCREMENTAL = API + "/incremental";
38
+ public static final String API_NPS_INCREMENTAL = API + "/nps/incremental";
39
+ public static final String API_OBJECT_RECORD = "api/sunshine/objects/records";
40
+ public static final String API_RELATIONSHIP_RECORD = "api/sunshine/relationships/records";
41
+ public static final String API_USER_EVENT = "api/sunshine/events";
42
+ }
43
+
44
+ public static class Misc
45
+ {
46
+ public static final String RUBY_TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S%z";
47
+ public static final String RUBY_TIMESTAMP_FORMAT_INPUT = "uuuu-MM-dd HH:mm:ss Z";
48
+ public static final String JAVA_TIMESTAMP_FORMAT = "uuuu-MM-dd'T'HH:mm:ss.SSS'Z'";
49
+ public static final String ISO_TIMESTAMP_FORMAT = "uuuu-MM-dd'T'HH:mm:ssXXX";
50
+ public static final String ISO_INSTANT = "uuuu-MM-dd'T'HH:mm:ss'Z'";
51
+ public static final String RUBY_TIMESTAMP_FORMAT_INPUT_NO_SPACE = "uuuu-MM-dd HH:mm:ssZ";
52
+ public static final String TOO_RECENT_START_TIME = "Too recent start_time.";
53
+ public static final int RECORDS_SIZE_PER_PAGE = 100;
54
+ public static final int MAXIMUM_RECORDS_INCREMENTAL = 1000;
55
+
56
+ // 1 MB
57
+ public static final int GUESS_BUFFER_SIZE = 1024 * 1024;
58
+ public static final List<String> SUPPORT_DATE_TIME_FORMAT = ImmutableList.copyOf(Arrays.asList(ZendeskConstants.Misc.ISO_INSTANT, ZendeskConstants.Misc.RUBY_TIMESTAMP_FORMAT_INPUT,
59
+ ZendeskConstants.Misc.JAVA_TIMESTAMP_FORMAT, ZendeskConstants.Misc.ISO_TIMESTAMP_FORMAT,
60
+ ZendeskConstants.Misc.RUBY_TIMESTAMP_FORMAT_INPUT_NO_SPACE));
61
+ }
62
+
63
+ public static class Regex
64
+ {
65
+ public static final String ID = "_id$";
66
+ }
67
+
68
+ public static class HttpStatus
69
+ {
70
+ public static final int TOO_MANY_REQUEST = 429;
71
+ }
72
+ }