From dd33138ecd8a013690d66b7e8f0f754784182bf5 Mon Sep 17 00:00:00 2001 From: Timothy Lim Date: Sat, 27 Oct 2018 23:24:45 +0800 Subject: [PATCH] Support Event Summaries --- README.md | 13 +++ .../src/main/java/io/intercom/api/Event.java | 11 +- .../java/io/intercom/api/EventSummary.java | 101 ++++++++++++++++++ .../intercom/api/EventSummaryCollection.java | 88 +++++++++++++++ .../test/java/io/intercom/api/EventTest.java | 26 +++++ .../src/test/resources/event_summary.json | 29 +++++ 6 files changed, 265 insertions(+), 3 deletions(-) create mode 100644 intercom-java/src/main/java/io/intercom/api/EventSummary.java create mode 100644 intercom-java/src/main/java/io/intercom/api/EventSummaryCollection.java create mode 100644 intercom-java/src/test/resources/event_summary.json diff --git a/README.md b/README.md index 27ca8fc0..148b3be3 100644 --- a/README.md +++ b/README.md @@ -389,6 +389,19 @@ EventCollection events = Event.list(params); while (events.hasNext()) { System.out.println(events.next().getEventName()); } + +// List event summaries of a user +Map params = Maps.newHashMap(); +params.put("type", "user"); +params.put("user_id", "1"); +// Alternatively list by Intercom ID +// params.put("intercom_user_id", "541a144b201ebf2ec5000001"); +// Or by email +// params.put("email", "river@serenity.io"); +EventSummaryCollection eventSummaryCollection = Event.listSummary(params); +for(EventSummary eventSummary : eventSummaryCollection.getEventSummaries()){ + System.out.println(eventSummary); +} ``` ### Tags diff --git a/intercom-java/src/main/java/io/intercom/api/Event.java b/intercom-java/src/main/java/io/intercom/api/Event.java index 0b239fa3..70227cb0 100644 --- a/intercom-java/src/main/java/io/intercom/api/Event.java +++ b/intercom-java/src/main/java/io/intercom/api/Event.java @@ -8,10 +8,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import java.net.URI; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -60,6 +57,14 @@ public static EventCollection list(Map params) throws InvalidExc return DataResource.list(params, "events", EventCollection.class); } + public static EventSummaryCollection listSummary(Map params) throws InvalidException, AuthorizationException { + if ((!params.containsKey("email")) && (!params.containsKey("user_id")) && (!params.containsKey("intercom_user_id"))) { + throw new InvalidException("an event query must include an email, user_id or intercom_user_id parameter"); + } + params.put("summary", "true"); + return DataResource.list(params, "events", EventSummaryCollection.class); + } + @VisibleForTesting static List> validateJobItems(List> items) { final JobSupport jobSupport = new JobSupport(); diff --git a/intercom-java/src/main/java/io/intercom/api/EventSummary.java b/intercom-java/src/main/java/io/intercom/api/EventSummary.java new file mode 100644 index 00000000..81892755 --- /dev/null +++ b/intercom-java/src/main/java/io/intercom/api/EventSummary.java @@ -0,0 +1,101 @@ +package io.intercom.api; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +@SuppressWarnings("UnusedDeclaration") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_DEFAULT) +public class EventSummary { + + @JsonProperty("name") + private String name; + + @JsonProperty("first") + private String first; + + @JsonProperty("last") + private String last; + + @JsonProperty("count") + private int count; + + @JsonProperty("description") + private String description; + + public EventSummary() { + } + + public String getName() { + return name; + } + + public String getFirstOccurredAtString() { + return first; + } + + public Date getFirstOccurredAt() throws ParseException { + return stringToDate(first); + } + + public String getLastOccurredAtString() { + return last; + } + + public Date getLastOccurredAt() throws ParseException { + return stringToDate(last); + } + + public int getCount() { + return count; + } + + public String getDescription() { + return description; + } + + private Date stringToDate(String dateString) throws ParseException { + return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX").parse(dateString); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + EventSummary eventSummary = (EventSummary) o; + + if (name != null ? !name.equals(eventSummary.name) : eventSummary.name != null) return false; + if (first != null ? !first.equals(eventSummary.first) : eventSummary.first != null) return false; + if (last != null ? !last.equals(eventSummary.last) : eventSummary.last != null) return false; + if (count != eventSummary.count) return false; + if (description != null ? !description.equals(eventSummary.description) : eventSummary.description != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = (name!= null ? name.hashCode() : 0); + result = 31 * result + (description != null ? description.hashCode() : 0); + result = 31 * result + (first != null ? first.hashCode() : 0); + result = 31 * result + (last != null ? last.hashCode() : 0); + result = 31 * result + count; + return result; + } + @Override + public String toString() { + return "EventSummaryCollection{" + + "name='" + name+ '\'' + + ", count=" + count + + ", description='" + description + '\'' + + ", first='" + first + '\'' + + ", last='" + last + '\'' + + "} " + super.toString(); + } +} diff --git a/intercom-java/src/main/java/io/intercom/api/EventSummaryCollection.java b/intercom-java/src/main/java/io/intercom/api/EventSummaryCollection.java new file mode 100644 index 00000000..2e17903e --- /dev/null +++ b/intercom-java/src/main/java/io/intercom/api/EventSummaryCollection.java @@ -0,0 +1,88 @@ +package io.intercom.api; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +@SuppressWarnings("UnusedDeclaration") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_DEFAULT) +public class EventSummaryCollection extends TypedData { + + @JsonProperty("type") + private final String type = "event.summary"; + + @JsonProperty("email") + private String email; + + @JsonProperty("user_id") + private String userID; + + @JsonProperty("intercom_user_id") + private String intercomUserID; + + @JsonProperty("events") + private List eventSummaries; + + public EventSummaryCollection() { + } + + public String getType() { + return type; + } + + public String getEmail() { + return email; + } + + public String getUserID() { + return userID; + } + + public String getIntercomUserID() { + return intercomUserID ; + } + + public List getEventSummaries() { + return eventSummaries; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + EventSummaryCollection eventSummaryCollection = (EventSummaryCollection) o; + + if (email != null ? !email.equals(eventSummaryCollection.email) : eventSummaryCollection.email != null) return false; + if (userID != null ? !userID.equals(eventSummaryCollection.userID) : eventSummaryCollection.userID != null) return false; + if (intercomUserID!= null ? !intercomUserID.equals(eventSummaryCollection.intercomUserID) : eventSummaryCollection.intercomUserID != null) return false; + if (eventSummaries!= null ? !eventSummaries.equals(eventSummaryCollection.eventSummaries) : eventSummaryCollection.eventSummaries != null) return false; + if (!type.equals(eventSummaryCollection.type)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = type.hashCode(); + result = 31 * result + (email != null ? email.hashCode() : 0); + result = 31 * result + (userID != null ? userID.hashCode() : 0); + result = 31 * result + (intercomUserID != null ? intercomUserID.hashCode() : 0); + result = 31 * result + (eventSummaries != null ? eventSummaries.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "Event{" + + "type='" + type + '\'' + + ", email='" + email + '\'' + + ", userID='" + userID + '\'' + + ", intercomUserID='" + intercomUserID + '\'' + + ", eventSummaries=" + eventSummaries + + "} " + super.toString(); + } +} diff --git a/intercom-java/src/test/java/io/intercom/api/EventTest.java b/intercom-java/src/test/java/io/intercom/api/EventTest.java index d32a75a3..8969251a 100644 --- a/intercom-java/src/test/java/io/intercom/api/EventTest.java +++ b/intercom-java/src/test/java/io/intercom/api/EventTest.java @@ -5,6 +5,8 @@ import org.junit.BeforeClass; import org.junit.Test; +import java.util.List; + import static io.intercom.api.TestSupport.load; import static org.junit.Assert.*; @@ -214,5 +216,29 @@ public void testListing() throws Exception { assertEquals("ADDAFRIEND", eventWithMetadata.getMetadata().get("invite_code")); assertEquals(null, eventWithMetadata.getMetadata().get("non_existing_key")); } + + @Test + public void testEventSummaryParsing() throws Exception { + String json = load("event_summary.json"); + final EventSummaryCollection eventSummaryCollection = mapper.readValue(json, EventSummaryCollection.class); + assertEquals("event.summary", eventSummaryCollection.getType()); + assertEquals("wash@serenity.io", eventSummaryCollection.getEmail()); + assertEquals("530370b477ad7120001d", eventSummaryCollection.getIntercomUserID()); + assertEquals("25",eventSummaryCollection.getUserID()); + List eventSummaries = eventSummaryCollection.getEventSummaries(); + assertEquals(3, eventSummaries.size()); + + assertEquals("test-event", eventSummaries.get(0).getName()); + assertEquals("2016-12-22T03:54:57.000Z", eventSummaries.get(0).getFirstOccurredAtString()); + assertEquals("2018-10-10T06:51:02.000Z", eventSummaries.get(0).getLastOccurredAtString()); + assertEquals(8, eventSummaries.get(0).getCount()); + assertEquals(null, eventSummaries.get(0).getDescription()); + + assertEquals("clicked-button", eventSummaries.get(1).getName()); + assertEquals("2018-02-20T06:40:16.000Z", eventSummaries.get(1).getFirstOccurredAtString()); + assertEquals("2018-02-20T06:40:16.000Z", eventSummaries.get(1).getLastOccurredAtString()); + assertEquals(1, eventSummaries.get(1).getCount()); + assertEquals("Clicking home page button", eventSummaries.get(1).getDescription()); + } } diff --git a/intercom-java/src/test/resources/event_summary.json b/intercom-java/src/test/resources/event_summary.json new file mode 100644 index 00000000..c5c0da73 --- /dev/null +++ b/intercom-java/src/test/resources/event_summary.json @@ -0,0 +1,29 @@ +{ + "type": "event.summary", + "email": "wash@serenity.io", + "intercom_user_id": "530370b477ad7120001d", + "user_id": "25", + "events": [ + { + "name": "test-event", + "first": "2016-12-22T03:54:57.000Z", + "last": "2018-10-10T06:51:02.000Z", + "count": 8, + "description": null + }, + { + "name": "clicked-button", + "first": "2018-02-20T06:40:16.000Z", + "last": "2018-02-20T06:40:16.000Z", + "count": 1, + "description": "Clicking home page button" + }, + { + "name": "completed purchase", + "first": "2018-03-13T02:52:53.000Z", + "last": "2018-03-13T02:58:31.000Z", + "count": 4, + "description": null + } + ] +}