Skip to content
This repository was archived by the owner on Dec 16, 2021. It is now read-only.

Repository files navigation

Circle CI

intercom-java

Java bindings for the Intercom API

Add a dependency

Download

The distribution is hosted on bintray. To use the client, you can add the jcenter repository to your dependencies.

### maven

Add jcenter to your repositories in pom.xml or settings.xml:

<repositories>
<repository>
<id>jcenter</id>
<url>http://jcenter.bintray.com</url>
</repository>
</repositories>

and add the project declaration to your pom.xml:

<dependency>
<groupId>io.intercom</groupId>
<artifactId>intercom-java</artifactId>
<version>2.2.3</version>
</dependency>

### gradle

Add jcenter to your repositories block:

repositories {
jcenter()
}

and add the project to the dependencies block in your build.gradle:

dependencies {
compile 'io.intercom:intercom-java:2.2.3'
} 

### sbt

Add jcenter to your resolvers in your build.sbt:

resolvers +="jcenter" at "http://jcenter.bintray.com"

and add the project to your libraryDependencies in your build.sbt:

libraryDependencies +="io.intercom"%"intercom-java"%"2.2.3"

Resources

Resources this API supports:

Authorization

If you already have an access token you can find it here. If you want to create or learn more about access tokens then you can find more info here.

# WithanOAuthorAccesstoken:
Intercom.setToken("da39a3ee5e6b4b0d3255bfef95601890afd80709");

If you are building a third party application you can get your OAuth token by setting-up-oauth for Intercom.

Usage

Users

// Create a userUseruser = newUser()
.setEmail("malcolm@serenity.io")
.setUserId("1")
.addCustomAttribute(CustomAttribute.newStringAttribute("role", "sergeant"))
.addCustomAttribute(CustomAttribute.newBooleanAttribute("browncoat", true));
Usercreated = User.create(user);
// Find user by iduser = User.find("541a144b201ebf2ec5000001");
// Find user by emailMap<String, String> params = Maps.newHashMap();
params.put("email", "malcolm@serenity.io");
user = User.find(params);
// Find user by user_idparams = Maps.newHashMap();
params.put("user_id", "1");
user = User.find(params);
// Update custom_attributes for a useruser.addCustomAttribute(CustomAttribute.newStringAttribute("role", "captain"));
User.update(user);
// Iterate over all usersUserCollectionusers = User.list();
while(users.hasNext()) {
System.out.println(users.next().getUserId());
}
// Bulk submit usersfinalList<JobItem<User>> items = Lists.newArrayList();
items.add(newJobItem<User>("post", user1));
items.add(newJobItem<User>("post", user2));
items.add(newJobItem<User>("delete", user3));
finalJobjob = User.submit(items);
System.out.println(job.getID());
// Bulk submit, add to an existing jobfinalList<JobItem<User>> moreItems = Lists.newArrayList();
items.add(newJobItem<User>("post", user4));
items.add(newJobItem<User>("delete", user5));
User.submit(moreItems, job);
//View a bulk job error feedUser.listJobErrorFeed(jobId)
// Delete a userUseruser = User.find("541a144b201ebf2ec5000001");
User.delete(user.getId());

Contacts

Contacts were added in version 1.1 of the client.

// Create a ContactContactcontact = newContact()
.setEmail("fantastic@serenity.io")
.addCustomAttribute(newStringAttribute("role", "fence"));
Contactcreated = Contact.create(contact);
// Find a single contact by server supplied user id or idcontact = Contact.findByID("541a144b201ebf2ec5000002");
contact = Contact.findByUserID("e1a7d875-d83a-46f7-86f4-73be98a98584");
// Update a contactcontact.setName("Stitch Hessian");
Contactupdated = Contact.update(contact);
// Read a contact list by emailContactCollectioncontacts = Contact.listByEmail("jubal@serenity.io");
while(contacts.hasNext()) {
System.out.println(contacts.next());
}
// Iterate over all contactsContactCollectionallContacts = Contact.list();
while(allContacts.hasNext()) {
System.out.println(allContacts.next());
}
// Remove a contactContact.delete(contact);
// Convert a contactUserconverted = Contact.convert(contact, user);

Companies

// Create a companyCompanycompany = newCompany();
company.setName("Blue Sun");
company.setCompanyID("1");
company.setPlan(newCompany.Plan("premium"));
company.addCustomAttribute(CustomAttribute.newIntegerAttribute("foddstuff-items", 246));
company.addCustomAttribute(CustomAttribute.newStringAttribute("bestseller", "fruity oaty bar"));
Company.create(company);
// Find a company by company_idmap = Maps.newHashMap();
map.put("company_id", "1");
Companycompany = Company.find(map);
// Find a company by namemap = Maps.newHashMap();
map.put("name", "Blue Sun");
Companycompany = Company.find(map);
// Find a company by idCompanycompany = Company.find("541a144b201ebf2ec5000001");
// Update a companycompany.setName("Blue Sun Corporation");
Company.update(company);
// Iterate over all companiesCompanyCollectioncompanies = Company.list();
while(companies.hasNext()) {
System.out.println(companies.next().getName());
}
// Get a list of users in a companymap = Maps.newHashMap();
map.put("company_id", "6");
UserCollectionusers = Company.listUsers(map);
// Add a user to one or more companiesUseruser = User.find("541a144b201ebf2ec5000001");
user.addCompany(company);
User.update(user);

Admins

// Iterate over all adminsAdminCollectionadmins = Admin.list();
while(admins.hasNext()) {
System.out.println(admins.next().getName());
}

Events

Eventevent = newEvent().setEventName("bought-hat")
.setUserID("1")
.putMetadata("invitee_email", "jayne@serenity.io")
.putMetadata("found_date", System.currentTimeMillis())
.putMetadata("new_signup", true);
Event.create(event);
// Bulk submit eventsfinalList<JobItem<Event>> items = Lists.newArrayList();
items.add(newJobItem<Event>("post", event1));
items.add(newJobItem<Event>("post", event2));
items.add(newJobItem<Event>("post", event3));
finalJobjob = Event.submit(items);
System.out.println(job.getID());
// Bulk submit, add to an existing jobfinalList<JobItem<Event>> moreItems = Lists.newArrayList();
moreItems.add(newJobItem<Event>("post", event4));
moreItems.add(newJobItem<Event>("delete", event5));
Event.submit(moreItems, job);
//View a bulk job error feedEvent.listJobErrorFeed(jobId)

Tags

// create a tagTagtag = newTag().setName("alliance");
tag = Tag.create(tag);
// update a tagtag.setName("independent");
tag = Tag.update(tag);
// tag and untag usersUserone = newUser().setEmail("river@serenity.io");
Usertwo = newUser().setEmail("simon@serenity.io").untag();
User.create(one);
User.create(two);
Tag.tag(tag, one, two);
// iterate over all tagsfinalTagCollectiontags = Tag.list();
while (tags.hasNext()) {
System.out.println(tags.next().getId());
}
// tag and untag companiesCompanyc1 = newCompany().setCompanyID("1");
Companyc2 = newCompany().setCompanyID("2").untag();
Company.create(c1);
Company.create(c2);
Tag.tag(tag, c1, c2);
// delete a tagTag.delete(tag);

Segments

// Find a segmentSegmentsegment = Segment.find("1");
// Update a segmentsegment.setName("new name");
Segment.update(segment);
// Iterate over all segmentsSegmentCollectionsegments = Segment.list();
while(segments.hasNext()) {
System.out.println(segments.next().getId());
}

Notes

// create a user noteUseruser = newUser().setId("5310d8e8598c9a0b24000005");
Authorauthor = newAuthor().setId("1");
Notenote = newNote()
.setUser(user)
.setAuthor(author)
.setBody("The note");
Note.create(note);
// Find a note by idnote = Note.find("1");
// Iterate over all notes for a user via their user_idMap<String, String> params = Maps.newHashMap();
params.put("user_id", "1");
NoteCollectionnotes = Note.list(params);
while(notes.hasNext()) {
System.out.println(notes.next().getBody());
}
// Iterate over all notes for a user via their email addressparams = Maps.newHashMap();
params.put("email", "malcolm@serenity.io");
notes = Note.list(params);
while(notes.hasNext()) {
System.out.println(notes.next().getBody());
}

Conversations

// send a message to a userUseruser = newUser().setId("5310d8e8598c9a0b24000005");
Adminadmin = newAdmin().setId("1");
AdminMessageadminMessage = newAdminMessage()
.setAdmin(admin)
.setUser(user)
.setSubject("This Land")
.setBody("Har har har! Mine is an evil laugh!")
.setMessageType("email")
.setTemplate("plain");
Conversation.create(adminMessage);
// send a message from a userUserMessageuserMessage = newUserMessage()
.setBody("Hey! Is there, is there a reward?")
.setUser(user);
Conversation.create(userMessage);
// send a message from a contactContactMessagecontactMessage = newContactMessage()
.setBody("Hey! Is there, is there a reward?")
.setUser(contact);
Conversation.create(contactMessage);
// find admin conversationsMap<String, String> params = Maps.newHashMap();
params.put("type", "admin");
params.put("admin_id", "1");
ConversationCollectionadminConversations = Conversation.list(params);
while (adminConversations.hasNext()) {
Conversationconversation = adminConversations.next();
}
// find user conversationsparams = Maps.newHashMap();
params.put("type", "user");
params.put("user_id", "1");
ConversationCollectionuserConversations = Conversation.list(params);
while (userConversations.hasNext()) {
Conversationconversation = userConversations.next();
}
// find a conversation by idfinalConversationconversation = Conversation.find("66");
ConversationMessageconversationMessage = conversation.getConversationMessage();
ConversationPartCollectionparts = conversation.getConversationPartCollection();
List<ConversationPart> partList = parts.getPage();
for (ConversationPartpart : partList) {
StringpartType = part.getPartType();
Authorauthor = part.getAuthor();
Stringbody = part.getBody();
}
ConversationPartpart = conversation.getMostRecentConversationPart();
Adminassignee = conversation.getAssignee();
Useruser = conversation.getUser();
// Find all open conversations assigned to an admin and render as plaintextparams = Maps.newHashMap();
params.put("type", "admin");
params.put("admin_id", "7");
params.put("display_as", "plaintext");
ConversationCollectionopenForAdmin = Conversation.list(params);
// admin replyAdminadmin = newAdmin().setId("1");
AdminReplyadminReply = newAdminReply(admin);
adminReply.setBody("These apples are healthsome");
adminReply.setAttachmentUrls(newString[]{"http://www.example.com/attachment.jpg"}); // optional - list of attachmentsConversation.reply("66", adminReply);
// admin closeAdminadmin = newAdmin().setId("1");
AdminReplyadminReply = newAdminReply(admin);
adminReply.setMessageType("close");
Conversation.reply("66", adminReply);
// user replyUseruser1 = newUser().setId("5310d8e8598c9a0b24000005");
UserReplyuserReply = newUserReply(user1);
userReply.setBody("Mighty fine shindig");
userReply.setAttachmentUrls(newString[]{"http://www.example.com/attachment.jpg"}); // optional - list of attachmentsSystem.out.println(MapperSupport.objectMapper().writeValueAsString(userReply));
Conversation.reply("66", userReply);

Webhooks

// create a subscriptionSubscriptionsubscription = newSubscription();
subscription.setUrl(newURI("https://example.org/webhooks/1"));
subscription.addTopic(Subscription.Topic.USER_CREATED);
subscription.addTopic(Subscription.Topic.USER_TAG_CREATED);
subscription.addTopic(Subscription.Topic.COMPANY);
subscription.setAppID("pi3243fa");
Subscription.create(subscription);
// find a subscriptionsubscription = Subscription.find("nsub_60ca7690-4020-11e4-b789-4961958e51bd");
// list subscriptionsSubscriptionCollectionlist = Subscription.list();
while(list.hasNext()) {
Subscriptionsub = list.next();
StringappID = sub.getAppID();
StringserviceType = sub.getServiceType();
List<Subscription.Topic> topics = sub.getTopics();
StringhubSecret = sub.getHubSecret();
}
// notification sent feedNotificationCollectionsent = Subscription.sentFeed(subscription.getId());
while(sent.hasNext()) {
Notificationnotification = sent.next();
Stringid = notification.getId();
Stringtopic = notification.getTopic();
NotificationDatadata = notification.getData();
Stringtype = data.getType();
// raw map representation of the payloadMapitem = data.getItem();
}
// notification error feedNotificationErrorCollectionerrors = Subscription.errorFeed(subscription.getId());
while (errors.hasNext()) {
NotificationErrornotificationError = errors.next();
RequestResponseCapturecapture = notificationError.getCapture();
URIrequestURI = capture.getRequestURI();
StringrequestMethod = capture.getRequestMethod();
Map<String, String> requestHeaders = capture.getRequestHeaders();
StringrequestEntity = capture.getRequestEntity();
intstatusCode = capture.getResponseStatusCode();
Map<String, String> responseHeaders = capture.getResponseHeaders();
StringresponseEntity = capture.getResponseEntity();
}
// consume a webhook notificationInputStreamjsonStream = ...;
finalNotificationnotification = Notification.readJSON(jsonStream);
StringjsonString = ...;
finalNotificationnotification = Notification.readJSON(jsonString);

Counts

// app totalsCounts.Totalstotals = Counts.appTotals();
System.out.println("companies: " + totals.getCompany().getValue());
System.out.println("segments: :" + totals.getSegment().getValue());
System.out.println("tags: :" + totals.getTag().getValue());
System.out.println("users: :" + totals.getUser().getValue());
// conversation totalsCounts.ConversationconversationTotals = Counts.conversationTotals();
System.out.println("assigned: " + conversationTotals.getAssigned());
System.out.println("closed: :" + conversationTotals.getClosed());
System.out.println("open: :" + conversationTotals.getOpen());
System.out.println("unassigned: :" + conversationTotals.getUnassigned());
// admin open/close countsCounts.ConversationadminCounts = Counts.conversationAdmins();
List<Admin> admins = adminCounts.getAdmins();
for (Adminadmin : admins) {
System.out.println(admin.getName() + ": " + admin.getClosed() + ", " + admin.getOpen());
}
// tag user countsSystem.out.println("tag user counts: ");
List<Counts.CountItem> tags = Counts.userTags();
for (Counts.CountItemtag : tags) {
System.out.println(tag.getName()+": " +tag.getValue());
}
// segment user countsList<Counts.CountItem> segments = Counts.userSegments();
for (Counts.CountItemsegment : segments) {
System.out.println(segment.getName()+": " +segment.getValue());
}
// company user countsList<Counts.CountItem> companyUsers = Counts.companyUsers();
for (Counts.CountItemcompany : companyUsers) {
System.out.println(company.getName()+": " +company.getValue());
}
// company tag countsList<Counts.CountItem> companyTags = Counts.companyTags();
for (Counts.CountItemtag : companyTags) {
System.out.println(tag.getName()+": " +tag.getValue());
}

Idioms

### HTTP requests

To signal local versus remote methods, calls that result in HTTP requests are performed using static methods, for example User.find(). The objects returned by static methods are built from server responses. The exception to the static idiom is where the next(), hasNext() and nextPage() methods on Collections are used to abstract over pagination.

### Pagination

Some API classes have static list() methods that correspond to paginated API responses. These return a Collection object (eg UserCollection) which can be iterated in two ways

  • The collection's getPage(), hasNextPage() and nextPage() methods - these are useful when you want to fetch one or just a few pages directly.

  • Java's inbuilt iterator methods next() and hasNext() - these are useful when you want to fetch data without manually handling pagination.

Error handling

You do not need to deal with the HTTP response from an API call directly. If there is an unsuccessful response then an IntercomException or a subclass of IntercomException will be thrown. The exception will have Error objects that can be examined via getErrorCollection and getFirstError for more detail.

The API throws the following runtime exceptions -

  • AuthorizationException: for a 401 or 403 response
  • InvalidException: for a 422 response or a local validation failure
  • RateLimitException: for a 429 rate limit exceeded response
  • ClientException: for a general 4xx response
  • ServerException: for a 500 or 503 response
  • IntercomException: general exception

Configuration

HTTP

The client can be configured to accept any http stack that implements java.net.HttpURLConnection by implementing the HttpConnectorSupplier interface.

For example, to use OkHttp as a connection supplier, create a supplier class -

publicclassOkHttpSupplierimplementsHttpConnectorSupplier {
privatefinalOkUrlFactoryurlFactory;
publicOkHttpSupplier(OkUrlFactoryurlFactory) {
this.urlFactory = urlFactory;
}
@OverridepublicHttpURLConnectionconnect(URIuri) throwsIOException {
returnurlFactory.open(uri.toURL());
}
}

and hand a supplier to the Intercom object -

final OkHttpClient client = new OkHttpClient();
final OkUrlFactory factory = new OkUrlFactory(client);
final OkHttpSupplier supplier = new OkHttpSupplier(factory);
Intercom.setHttpConnectorSupplier(supplier);

Timeouts

The default connection and request timeouts can be set in milliseconds using the Intercom.setConnectionTimeout and Intercom.setRequestTimeout methods.

Target API Server

The base URI to target can be changed for testing purposes

URIbaseURI = newURI("https://example.org/server");
Intercom.setApiBaseURI(baseURI);

About

Java bindings for the Intercom API

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages