embulk-input-zendesk-all 0.3.9 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 66b582f9b7eb1e5b3269b334e7c8dd46fb8bcd01
4
- data.tar.gz: 1fd7ead56fc82aa40b9d9c9786491b9de5d20fe3
3
+ metadata.gz: 0bfa12fca52df30c6d53c787b0c1fbcc3607d83e
4
+ data.tar.gz: 9366de09a25cc4a53db47131de1381edd136bcda
5
5
  SHA512:
6
- metadata.gz: 7f8b5f051215b0cc328a96b1a7d5c6729102283821f0fbc5a9e9cf0f8a58d45e32a2d9da240a97924a6bcc0b7ccef16c35cd36936b934a96cba46f365845d25e
7
- data.tar.gz: c06cf6a71c462fe6e598d2977745ec129dc5c32130c0fa63d05015b2f08c8942ed1803edb391338f760ab2652a0a3c485596672d5c842a24a2b872e546055dd8
6
+ metadata.gz: ac55e4011b761639f55d3fcbd1fd2f9f3d54556114d164cbd4bf13eb51fa5ad5dd3d0ed2d8840303274c6e6348dc835a6026fac4d6ed0d5db4d1f321cfec6bf8
7
+ data.tar.gz: 935c10be956e9ef20c5cbf761f3f90e800d37f0bb8e844813926b03aab90fd9bedb8ddcf3b8f71963ecef2b7342ee8a0df4d2de590eb6a36fa7fdabca09379a8
data/README.md CHANGED
@@ -15,6 +15,8 @@ Required Embulk version >= 0.9.6.
15
15
  * DOES support JSON type columns
16
16
  * Supports satisfaction_ratings API
17
17
  * Supports ticket_metric_events API
18
+ * Supports SLA Policies API
19
+ * Supports Groups API
18
20
 
19
21
 
20
22
  * **Plugin type**: input
data/build.gradle CHANGED
@@ -15,7 +15,7 @@ configurations {
15
15
  provided
16
16
  }
17
17
 
18
- version = "0.3.9"
18
+ version = "0.4.5"
19
19
 
20
20
  sourceCompatibility = 1.8
21
21
  targetCompatibility = 1.8
data/gradlew CHANGED
@@ -168,5 +168,5 @@ eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$A
168
168
  if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169
169
  cd "$(dirname "$0")"
170
170
  fi
171
-
171
+ echo "$JAVACMD" "$@"
172
172
  exec "$JAVACMD" "$@"
@@ -374,6 +374,8 @@ public class ZendeskInputPlugin implements InputPlugin
374
374
  return new ZendeskCustomObjectService(task);
375
375
  case USER_EVENTS:
376
376
  return new ZendeskUserEventService(task);
377
+ case GROUPS:
378
+ return new ZendeskSupportAPIService(task);
377
379
  default:
378
380
  throw new ConfigException("Unsupported " + task.getTarget() + ", supported values: '" + Arrays.toString(Target.values()) + "'");
379
381
  }
@@ -235,6 +235,8 @@ public class ZendeskRestClient
235
235
  final HttpGet request = new HttpGet(url);
236
236
  final ImmutableMap<String, String> headers = buildAuthHeader(task);
237
237
  headers.forEach(request::setHeader);
238
+
239
+ // headers.values().forEach(logger::info);
238
240
  return request;
239
241
  }
240
242
 
@@ -14,7 +14,7 @@ public enum Target
14
14
  TICKET_METRICS("metric_sets"), TICKET_FIELDS("ticket_fields"), TICKET_FORMS("ticket_forms"),
15
15
  TICKET_METRIC_EVENTS("ticket_metric_events"), SATISFACTION_RATINGS("satisfaction_ratings"),
16
16
  SLA_POLICIES("sla_policies"), SCORES("responses"), OBJECT_RECORDS("data"),
17
- RECIPIENTS("recipients"), RELATIONSHIP_RECORDS("data"), USER_EVENTS("data");
17
+ RECIPIENTS("recipients"), RELATIONSHIP_RECORDS("data"), USER_EVENTS("data"), GROUPS("groups");
18
18
 
19
19
  String jsonName;
20
20
 
@@ -15,6 +15,11 @@ public class ZendeskNPSService extends ZendeskNormalServices
15
15
  {
16
16
  return true;
17
17
  }
18
+ @Override
19
+ protected String buildURI(final int page, final long startTime, final long endTime)
20
+ {
21
+ return buildURI(page, startTime);
22
+ }
18
23
 
19
24
  @Override
20
25
  protected String buildURI(final int page, final long startTime)
@@ -59,11 +59,15 @@ public abstract class ZendeskNormalServices implements ZendeskService
59
59
 
60
60
  return taskReport;
61
61
  }
62
-
63
62
  public JsonNode getDataFromPath(String path, final int page, final boolean isPreview, final long startTime)
63
+ {
64
+ return getDataFromPath(path, page,isPreview, startTime, 0);
65
+ }
66
+
67
+ public JsonNode getDataFromPath(String path, final int page, final boolean isPreview, final long startTime, final long endTime)
64
68
  {
65
69
  if (path.isEmpty()) {
66
- path = buildURI(page, startTime);
70
+ path = buildURI(page, startTime, endTime);
67
71
  }
68
72
 
69
73
  final String response = getZendeskRestClient().doGet(path, task, isPreview);
@@ -71,6 +75,8 @@ public abstract class ZendeskNormalServices implements ZendeskService
71
75
  }
72
76
 
73
77
  protected abstract String buildURI(int page, long startTime);
78
+ protected abstract String buildURI(int page, long startTime, long endTime);
79
+
74
80
 
75
81
  @VisibleForTesting
76
82
  protected ZendeskRestClient getZendeskRestClient()
@@ -127,14 +133,16 @@ public abstract class ZendeskNormalServices implements ZendeskService
127
133
  int numberOfRecords = 0;
128
134
  if (result.has(ZendeskConstants.Field.COUNT)) {
129
135
  numberOfRecords = result.get(ZendeskConstants.Field.COUNT).asInt();
136
+ logger.info("Number of Records {}", numberOfRecords);
130
137
  }
131
138
 
132
139
  while (iterator.hasNext()) {
133
140
  final JsonNode recordJsonNode = iterator.next();
134
141
 
135
- if (isUpdatedBySystem(recordJsonNode, startTime)) {
136
- continue;
137
- }
142
+ // if (isUpdatedBySystem(recordJsonNode, startTime)) {
143
+ // logger.info("This record is update by system? {} IGNORED!! ", recordJsonNode.get("id"));
144
+ // continue;
145
+ // }
138
146
 
139
147
  // Contain some records that later than end_time. Checked and don't add.
140
148
  // Because the api already sorted by updated_at or timestamp for ticket_events, we just need to break no need to check further.
@@ -142,6 +150,7 @@ public abstract class ZendeskNormalServices implements ZendeskService
142
150
  long checkedTime = 0;
143
151
  if (recordJsonNode.has(ZendeskConstants.Field.UPDATED_AT) && !recordJsonNode.get(ZendeskConstants.Field.UPDATED_AT).isNull()) {
144
152
  checkedTime = ZendeskDateUtils.isoToEpochSecond(recordJsonNode.get(ZendeskConstants.Field.UPDATED_AT).textValue());
153
+ // logger.info("Checked time {}", checkedTime);
145
154
  }
146
155
 
147
156
  // ticket events is updated by system not user's action so it only has timestamp field
@@ -155,11 +164,13 @@ public abstract class ZendeskNormalServices implements ZendeskService
155
164
  }
156
165
 
157
166
  if (checkedTime > endTime) {
167
+ logger.info("Lets break since checked time > endTime {}", endTime);
158
168
  break;
159
169
  }
160
170
  }
161
171
 
162
172
  if (task.getDedup()) {
173
+ // logger.info("Do we dedup??");
163
174
  final String recordID = recordJsonNode.get(ZendeskConstants.Field.ID).asText();
164
175
 
165
176
  // add success -> no duplicate
@@ -170,6 +181,7 @@ public abstract class ZendeskNormalServices implements ZendeskService
170
181
 
171
182
  pool.submit(() -> fetchSubResourceAndAddToImporter(recordJsonNode, task, recordImporter));
172
183
  recordCount++;
184
+ // logger.info("Record count {}", recordCount);
173
185
  if (Exec.isPreview()) {
174
186
  return;
175
187
  }
@@ -184,6 +196,8 @@ public abstract class ZendeskNormalServices implements ZendeskService
184
196
  : apiEndTime;
185
197
 
186
198
  if (numberOfRecords < ZendeskConstants.Misc.MAXIMUM_RECORDS_INCREMENTAL || startTime > endTime) {
199
+ logger.info("Break because number of Records < MAXIMUM RECORDS {}", numberOfRecords);
200
+ logger.info("or start time {}> end Time {}", startTime, endTime);
187
201
  break;
188
202
  }
189
203
  }
@@ -239,6 +253,7 @@ public abstract class ZendeskNormalServices implements ZendeskService
239
253
 
240
254
  private void fetchSubResourceAndAddToImporter(final JsonNode jsonNode, final ZendeskInputPlugin.PluginTask task, final RecordImporter recordImporter)
241
255
  {
256
+ // logger.info("Fetch Sub Resource {}", jsonNode.get("id"));
242
257
  task.getIncludes().forEach(include -> {
243
258
  final String relatedObjectName = include.trim();
244
259
 
@@ -254,13 +269,14 @@ public abstract class ZendeskNormalServices implements ZendeskService
254
269
  }
255
270
  }
256
271
  catch (final ConfigException e) {
272
+ logger.info("Some exception for id {}", jsonNode.get("id"));
257
273
  // Sometimes we get 404 when having invalid endpoint, so ignore when we get 404 InvalidEndpoint
258
274
  if (!(e.getCause() instanceof ZendeskException && ((ZendeskException) e.getCause()).getStatusCode() == HttpStatus.SC_NOT_FOUND)) {
259
275
  throw e;
260
276
  }
261
277
  }
262
278
  });
263
-
279
+ // logger.info("Add record {}", jsonNode.get("id"));
264
280
  recordImporter.addRecord(jsonNode);
265
281
  }
266
282
 
@@ -287,6 +303,7 @@ public abstract class ZendeskNormalServices implements ZendeskService
287
303
  private void importDataForNonIncremental(final ZendeskInputPlugin.PluginTask task, final int taskIndex, RecordImporter recordImporter, final boolean getStartDate)
288
304
  {
289
305
  long startTime = 0;
306
+ long endTime = 0;
290
307
 
291
308
  if (Target.SATISFACTION_RATINGS.equals(task.getTarget())){
292
309
  if (getStartDate && task.getStartTime().isPresent()) {
@@ -294,10 +311,16 @@ public abstract class ZendeskNormalServices implements ZendeskService
294
311
  }
295
312
  logger.info("Start time = {}", startTime);
296
313
 
314
+ if (task.getEndTime().isPresent()) {
315
+ endTime = ZendeskDateUtils.isoToEpochSecond(task.getEndTime().get());
316
+ }
317
+
318
+ logger.info("End time = {}", endTime);
319
+
297
320
  int i = 1;
298
321
  final Set<String> knownIds = ConcurrentHashMap.newKeySet();
299
322
  while (true) {
300
- final JsonNode result = getDataFromPath("", taskIndex +i, false, startTime);
323
+ final JsonNode result = getDataFromPath("", taskIndex +i, false, startTime, endTime);
301
324
  final Iterator<JsonNode> iterator = ZendeskUtils.getListRecords(result, task.getTarget().getJsonName());
302
325
  while (iterator.hasNext()) {
303
326
  final JsonNode recordJsonNode = iterator.next();
@@ -18,11 +18,17 @@ public class ZendeskSupportAPIService extends ZendeskNormalServices
18
18
  return !(task.getTarget().equals(Target.TICKET_FORMS)
19
19
  || task.getTarget().equals(Target.SLA_POLICIES)
20
20
  || task.getTarget().equals(Target.TICKET_FIELDS)
21
- || task.getTarget().equals(Target.SATISFACTION_RATINGS));
21
+ || task.getTarget().equals(Target.SATISFACTION_RATINGS)
22
+ || task.getTarget().equals(Target.GROUPS));
22
23
  }
23
24
 
24
25
  @Override
25
- protected String buildURI(final int page, long startTime)
26
+ protected String buildURI(final int page, long startTime){
27
+ return buildURI(page, startTime);
28
+ }
29
+
30
+ @Override
31
+ protected String buildURI(final int page, long startTime, long endTime)
26
32
  {
27
33
  final URIBuilder uriBuilder = ZendeskUtils.getURIBuilder(task.getLoginUrl()).setPath(buildPath());
28
34
 
@@ -34,11 +40,18 @@ public class ZendeskSupportAPIService extends ZendeskNormalServices
34
40
  }
35
41
  else {
36
42
  if (Target.SATISFACTION_RATINGS.equals(task.getTarget())){
37
- uriBuilder.setParameter(ZendeskConstants.Field.START_TIME, String.valueOf(startTime))
38
- .setParameter("sort_by", "id")
39
- .setParameter("per_page", String.valueOf(100))
40
- .setParameter("page", String.valueOf(page));
41
-
43
+ if (endTime>0){
44
+ uriBuilder.setParameter(ZendeskConstants.Field.START_TIME, String.valueOf(startTime))
45
+ .setParameter(ZendeskConstants.Field.END_TIME, String.valueOf(endTime))
46
+ .setParameter("sort_by", "id")
47
+ .setParameter("per_page", String.valueOf(100))
48
+ .setParameter("page", String.valueOf(page));
49
+ }else{
50
+ uriBuilder.setParameter(ZendeskConstants.Field.START_TIME, String.valueOf(startTime))
51
+ .setParameter("sort_by", "id")
52
+ .setParameter("per_page", String.valueOf(100))
53
+ .setParameter("page", String.valueOf(page));
54
+ }
42
55
  }
43
56
  else{
44
57
  uriBuilder.setParameter("sort_by", "id")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-input-zendesk-all
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - hieu.duong
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-31 00:00:00.000000000 Z
11
+ date: 2021-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -138,9 +138,9 @@ files:
138
138
  - src/test/resources/data/util_page.json
139
139
  - classpath/commons-logging-1.2.jar
140
140
  - classpath/httpcore-4.4.10.jar
141
+ - classpath/embulk-input-zendesk-all-0.4.5.jar
141
142
  - classpath/httpclient-4.5.6.jar
142
143
  - classpath/commons-codec-1.10.jar
143
- - classpath/embulk-input-zendesk-all-0.3.9.jar
144
144
  homepage: https://github.com/treasure-data/embulk-input-zendesk
145
145
  licenses:
146
146
  - MIT