diff --git a/README.md b/README.md index 6ca9a907..dab94e42 100644 --- a/README.md +++ b/README.md @@ -281,9 +281,22 @@ Event event = new Event() .setEventName("bought-hat") .setId("599d6aeeda850883ed8ba7c2"); Event.create(event); -``` +// List events 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"); +EventCollection events = Event.list(params); +while (events.hasNext()) { + System.out.println(events.next().getEventName()); +} +``` + ### Tags ```java 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 fb9864e5..0b239fa3 100644 --- a/intercom-java/src/main/java/io/intercom/api/Event.java +++ b/intercom-java/src/main/java/io/intercom/api/Event.java @@ -8,7 +8,10 @@ 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; @@ -50,6 +53,13 @@ public static JobItemCollection listJobErrorFeed(String jobID) return Job.listJobErrorFeed(jobID, Event.class); } + public static EventCollection list(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"); + } + return DataResource.list(params, "events", EventCollection.class); + } + @VisibleForTesting static List> validateJobItems(List> items) { final JobSupport jobSupport = new JobSupport(); @@ -101,6 +111,9 @@ static void validateCreateEvent(Event event) { @JsonProperty("user_id") private String userID; + @JsonProperty("intercom_user_id") + private String intercomUserID; + @JsonProperty("metadata") private Map metadata = Maps.newHashMap(); @@ -157,6 +170,15 @@ public Event setUserID(String userID) { return this; } + public String getIntercomUserID() { + return intercomUserID ; + } + + public Event setIntercomUserID(String intercomUserID ) { + this.intercomUserID = intercomUserID ; + return this; + } + public Event putMetadata(String name, String value) { metadata.put(name, value); return this; diff --git a/intercom-java/src/main/java/io/intercom/api/EventCollection.java b/intercom-java/src/main/java/io/intercom/api/EventCollection.java new file mode 100644 index 00000000..adcc18ab --- /dev/null +++ b/intercom-java/src/main/java/io/intercom/api/EventCollection.java @@ -0,0 +1,46 @@ +package io.intercom.api; + +import java.util.Iterator; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@SuppressWarnings("UnusedDeclaration") +@JsonIgnoreProperties(ignoreUnknown = true) +public class EventCollection extends TypedDataCollection implements Iterator { + protected TypedDataCollectionIterator iterator; + + public EventCollection() { + iterator = new TypedDataCollectionIterator(this); + } + + public EventCollection(List events) { + this(); + this.page = events; + } + + @SuppressWarnings("EmptyMethod") + @JsonProperty("events") + @Override + public List getPage() { + return super.getPage(); + } + + @Override + public EventCollection nextPage() { + return fetchNextPage(EventCollection.class); + } + + public boolean hasNext() { + return iterator.hasNext(); + } + + public Event next() { + return iterator.next(); + } + + public void remove() { + iterator.remove(); + } +} 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 8695ab2b..d32a75a3 100644 --- a/intercom-java/src/test/java/io/intercom/api/EventTest.java +++ b/intercom-java/src/test/java/io/intercom/api/EventTest.java @@ -1,12 +1,20 @@ package io.intercom.api; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; +import org.junit.BeforeClass; import org.junit.Test; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static io.intercom.api.TestSupport.load; +import static org.junit.Assert.*; public class EventTest { + private static ObjectMapper mapper; + + @BeforeClass + public static void beforeClass() { + mapper = MapperSupport.objectMapper(); + } @Test public void testBulkValidation() { @@ -180,4 +188,31 @@ public void testValid() { } } -} \ No newline at end of file + @Test + public void testListing() throws Exception { + String json = load("events.json"); + final EventCollection eventCollection = mapper.readValue(json, EventCollection.class); + assertEquals(2, eventCollection.getPage().size()); + + final Event eventWithNoMetadata = eventCollection.getPage().get(0); + assertEquals("cc7e2992-e6f1-11e7-9f85-25b0a92374f6", eventWithNoMetadata.getId()); + assertEquals(1513931185, eventWithNoMetadata.getCreatedAt()); + assertEquals("test-event", eventWithNoMetadata.getEventName()); + assertEquals("25", eventWithNoMetadata.getUserID()); + assertEquals("530370b477ad7120001d", eventWithNoMetadata.getIntercomUserID()); + assertEquals(0, eventWithNoMetadata.getMetadata().size()); + + final Event eventWithMetadata = eventCollection.getPage().get(1); + assertEquals("9a096a26-b8c5-11e7-b012-3f043042e6d0", eventWithMetadata.getId()); + assertEquals(1508854449, eventWithMetadata.getCreatedAt()); + assertEquals("invited-friend", eventWithMetadata.getEventName()); + assertEquals("25", eventWithMetadata.getUserID()); + assertEquals("530370b477ad7120001d", eventWithMetadata.getIntercomUserID()); + assertNotEquals(null, eventWithMetadata.getMetadata()); + assertEquals(2, eventWithMetadata.getMetadata().size()); + assertEquals("pi@example.org", eventWithMetadata.getMetadata().get("invitee_email")); + assertEquals("ADDAFRIEND", eventWithMetadata.getMetadata().get("invite_code")); + assertEquals(null, eventWithMetadata.getMetadata().get("non_existing_key")); + } +} + diff --git a/intercom-java/src/test/resources/events.json b/intercom-java/src/test/resources/events.json new file mode 100644 index 00000000..5ba3e594 --- /dev/null +++ b/intercom-java/src/test/resources/events.json @@ -0,0 +1,32 @@ +{ + "type": "event.list", + "events": [ + { + "type": "event", + "id": "cc7e2992-e6f1-11e7-9f85-25b0a92374f6", + "created_at": 1513931185, + "event_name": "test-event", + "user_id": "25", + "email": "wash@serenity.io", + "intercom_user_id": "530370b477ad7120001d", + "metadata": {} + }, + { + "type": "event", + "id": "9a096a26-b8c5-11e7-b012-3f043042e6d0", + "created_at": 1508854449, + "event_name": "invited-friend", + "user_id": "25", + "email": "wash@serenity.io", + "intercom_user_id": "530370b477ad7120001d", + "metadata": { + "invitee_email": "pi@example.org", + "invite_code": "ADDAFRIEND" + } + } + ], + "pages": { + "since": "https://api.intercom.io/events?intercom_user_id=530370b477ad7120001d&type=user&since=1513931185041" + } +} +