diff --git a/README.md b/README.md index 1bfdde73..c68596e8 100644 --- a/README.md +++ b/README.md @@ -305,6 +305,12 @@ AdminCollection admins = Admin.list(); while(admins.hasNext()) { System.out.println(admins.next().getName()); } + +// Find admin by ID +Admin admin = Admin.find("123456"); + +// Set admin as away and enable away mode reassignment +Admin admin = Admin.setAwayMode("123456", true, true); ``` diff --git a/intercom-java/src/main/java/io/intercom/api/Admin.java b/intercom-java/src/main/java/io/intercom/api/Admin.java index a0630719..f3444d96 100644 --- a/intercom-java/src/main/java/io/intercom/api/Admin.java +++ b/intercom-java/src/main/java/io/intercom/api/Admin.java @@ -7,6 +7,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.Maps; +import java.net.URI; +import java.util.List; import java.util.Map; @@ -30,9 +32,25 @@ public static AdminCollection list() return DataResource.list(SENTINEL, "admins", AdminCollection.class); } + public static Admin find(String id) + throws AuthorizationException, ClientException, ServerException, InvalidException, RateLimitException { + final HttpClient resource = new HttpClient(UriBuilder.newBuilder().path("admins").path(id).build()); + return resource.get(Admin.class); + } + + public static Admin setAwayMode(String id, boolean away_mode_enabled, boolean away_mode_reassign) { + final URI uri = UriBuilder.newBuilder() + .path("admins") + .path(id) + .path("away") + .build(); + return new HttpClient(uri) + .put(Admin.class, new AdminAwayMode(id, away_mode_enabled, away_mode_reassign)); + } + @SuppressWarnings("FieldCanBeLocal") @JsonProperty("type") - private final String type = "admin"; + private String type = "admin"; @JsonProperty("id") private String id; @@ -55,6 +73,21 @@ public static AdminCollection list() @JsonProperty("closed") private long closed; + @JsonProperty("away_mode_enabled") + private boolean awayModeEnabled; + + @JsonProperty("away_mode_reassign") + private boolean awayModeReassign; + + @JsonProperty("avatar") + private Avatar avatar; + + @JsonProperty("team_ids") + private List teamIds; + + @JsonProperty("admin_ids") + private List adminIds; + public Admin() { } @@ -110,6 +143,26 @@ public long getClosed() { return closed; } + public boolean getAwayModeEnabled(){ + return awayModeEnabled; + } + + public boolean getAwayModeReassign(){ + return awayModeReassign; + } + + public Avatar getAvatar(){ + return avatar; + } + + public List getTeamIds(){ + return teamIds; + } + public List getAdminIds(){ + return adminIds; + } + + @Override public boolean equals(Object o) { if (this == o) return true; @@ -124,6 +177,12 @@ public boolean equals(Object o) { if (email != null ? !email.equals(admin.email) : admin.email != null) return false; if (id != null ? !id.equals(admin.id) : admin.id != null) return false; if (name != null ? !name.equals(admin.name) : admin.name != null) return false; + if (awayModeEnabled != admin.awayModeEnabled) return false; + if (awayModeReassign != admin.awayModeReassign) return false; + if (avatar != null ? !avatar.equals(admin.avatar) : admin.avatar != null) return false; + if (teamIds != null ? !teamIds.equals(admin.teamIds) : admin.teamIds != null) return false; + if (adminIds != null ? !adminIds.equals(admin.adminIds) : admin.adminIds != null) return false; + //noinspection RedundantIfStatement if (!type.equals(admin.type)) return false; @@ -140,6 +199,11 @@ public int hashCode() { result = 31 * result + (int) (updatedAt ^ (updatedAt >>> 32)); result = 31 * result + (int) (open ^ (open >>> 32)); result = 31 * result + (int) (closed ^ (closed >>> 32)); + result = 31 * result + (awayModeEnabled ? 1 : 0); + result = 31 * result + (awayModeReassign ? 1 : 0); + result = 31 * result + (avatar != null ? avatar.hashCode() : 0); + result = 31 * result + (teamIds != null ? teamIds.hashCode() : 0); + result = 31 * result + (adminIds != null ? adminIds.hashCode() : 0); return result; } @@ -151,6 +215,11 @@ public String toString() { ", email='" + email + '\'' + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt + + ", awayModeEnabled=" + awayModeEnabled + + ", awayModeReassign=" + awayModeReassign + + ", teamIds=" + teamIds + + ", adminIds=" + adminIds+ + ", avatar=" + avatar+ "} " + super.toString(); } diff --git a/intercom-java/src/main/java/io/intercom/api/AdminAwayMode.java b/intercom-java/src/main/java/io/intercom/api/AdminAwayMode.java new file mode 100644 index 00000000..280fe191 --- /dev/null +++ b/intercom-java/src/main/java/io/intercom/api/AdminAwayMode.java @@ -0,0 +1,44 @@ +package io.intercom.api; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +@SuppressWarnings("UnusedDeclaration") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class AdminAwayMode extends TypedData { + + @JsonProperty("id") + private String id; + + @JsonProperty("away_mode_enabled") + private boolean awayModeEnabled; + + @JsonProperty("away_mode_reassign") + private boolean awayModeReassign; + + public AdminAwayMode(String Id, boolean awayModeEnabled, boolean awayModeReassign) { + this.id = id; + this.awayModeEnabled = awayModeEnabled; + this.awayModeReassign = awayModeReassign; + } + String getId() { + return id; + } + public boolean getAwayModeEnabled(){ + return awayModeEnabled; + } + + public boolean getAwayModeReassign(){ + return awayModeReassign; + } + + @Override + public String toString() { + return "AdminAwayMode{" + + "id='" + id + '\'' + + ", awayModeEnabled=" + awayModeEnabled + + ", awayModeReassign=" + awayModeReassign + + "} " + super.toString(); + } +} diff --git a/intercom-java/src/test/java/io/intercom/api/AdminTest.java b/intercom-java/src/test/java/io/intercom/api/AdminTest.java new file mode 100644 index 00000000..03250532 --- /dev/null +++ b/intercom-java/src/test/java/io/intercom/api/AdminTest.java @@ -0,0 +1,78 @@ +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 java.util.List; +import java.util.Map; + +import static io.intercom.api.TestSupport.load; +import static org.junit.Assert.*; + +public class AdminTest { + + private static ObjectMapper mapper; + + @BeforeClass + public static void beforeClass() { + mapper = MapperSupport.objectMapper(); + } + + @Test + public void TestAdminParseJson() throws Exception { + String json = load("admin.json"); + final Admin admin = mapper.readValue(json, Admin.class); + assertEquals("admin", admin.getType()); + assertEquals("123456", admin.getId()); + assertEquals("Admin Name", admin.getName()); + assertEquals("admin@domain.com", admin.getEmail()); + assertTrue(admin.getAwayModeEnabled()); + assertFalse(admin.getAwayModeReassign()); + assertEquals( "https://avatarurl.com/image.jpg", admin.getAvatar().getImageURL().toString()); + assertNotNull(admin.getTeamIds()); + assertEquals(3, admin.getTeamIds().size()); + assertTrue(admin.getTeamIds().contains("123")); + assertTrue(admin.getTeamIds().contains("456")); + assertTrue(admin.getTeamIds().contains("789")); + } + + @Test + public void TestAdminTeamParseJson() throws Exception { + String json = load("admin_team.json"); + final Admin admin = mapper.readValue(json, Admin.class); + assertEquals("team", admin.getType()); + assertEquals("654321", admin.getId()); + assertEquals("A Team", admin.getName()); + assertEquals("team-email@teams.intercom.io", admin.getEmail()); + assertFalse(admin.getAwayModeEnabled()); + assertFalse(admin.getAwayModeReassign()); + assertEquals("https://domain.com/avatar", admin.getAvatar().getImageURL().toString()); + assertNotNull(admin.getAdminIds()); + assertEquals(3, admin.getAdminIds().size()); + assertTrue(admin.getAdminIds().contains("321")); + assertTrue(admin.getAdminIds().contains("654")); + assertTrue(admin.getAdminIds().contains("987")); + } + + + @Test + public void TestAdminParseAdminList() throws Exception { + String json = load("admins.json"); + final AdminCollection adminCollection = mapper.readValue(json, AdminCollection.class); + + assertEquals(6, adminCollection.getPage().size()); + } + + @Test + public void TestAdminSerialiseDeserialise() throws Exception { + String json = load("admin.json"); + final Admin admin = mapper.readValue(json, Admin.class); + final String json1 = mapper.writeValueAsString(admin); + System.out.println(json1); + final Admin admin1 = mapper.readValue(json1, Admin.class); + assertTrue(admin.equals(admin1)); + } + +} diff --git a/intercom-java/src/test/resources/admin.json b/intercom-java/src/test/resources/admin.json new file mode 100644 index 00000000..0936a99a --- /dev/null +++ b/intercom-java/src/test/resources/admin.json @@ -0,0 +1,16 @@ +{ + "type": "admin", + "id": "123456", + "name": "Admin Name", + "email": "admin@domain.com", + "away_mode_enabled": true, + "away_mode_reassign": false, + "avatar": { + "image_url": "https://avatarurl.com/image.jpg" + }, + "team_ids": [ + 123, + 456, + 789 + ] +} \ No newline at end of file diff --git a/intercom-java/src/test/resources/admin_team.json b/intercom-java/src/test/resources/admin_team.json new file mode 100644 index 00000000..dd2601b9 --- /dev/null +++ b/intercom-java/src/test/resources/admin_team.json @@ -0,0 +1,16 @@ +{ + "type": "team", + "id": "654321", + "name": "A Team", + "email": "team-email@teams.intercom.io", + "away_mode_enabled": false, + "away_mode_reassign": false, + "avatar": { + "image_url": "https://domain.com/avatar" + }, + "admin_ids": [ + 987, + 654, + 321 + ] +} \ No newline at end of file diff --git a/intercom-java/src/test/resources/admins.json b/intercom-java/src/test/resources/admins.json new file mode 100644 index 00000000..bddc282b --- /dev/null +++ b/intercom-java/src/test/resources/admins.json @@ -0,0 +1,86 @@ +{ + "type": "admin.list", + "admins": [ + { + "type": "admin", + "id": "123456", + "name": "Admin Name", + "email": "admin@domain.com", + "away_mode_enabled": true, + "away_mode_reassign": false, + "avatar": { + "image_url": "https://avatarurl.com/image.jpg" + }, + "team_ids": [ + 123, + 456, + 789 + ] + }, + { + "type": "admin", + "id": "234567", + "name": "Admin2 Name", + "email": "admin2@domain.com", + "away_mode_enabled": false, + "away_mode_reassign": false, + "avatar": { + "image_url": "https://avatarurl.com/image2.jpg" + }, + "team_ids": [ + 456, + 789 + ] + }, + { + "type": "team", + "id": "123", + "name": "A Team", + "email": "team-email@teams.intercom.io", + "away_mode_enabled": false, + "away_mode_reassign": false, + "avatar": { + "image_url": "https://domain.com/avatar" + }, + "admin_ids": [ + 123456, + 234567 + ] + }, + { + "type": "team", + "id": "456", + "name": "B Team", + "email": "team-email2@teams.intercom.io", + "away_mode_enabled": false, + "away_mode_reassign": false, + "avatar": { + "image_url": "https://domain.com/avatar2" + }, + "admin_ids": [ + 123456 + ] + }, + { + "type": "team", + "id": "789", + "name": "C Team", + "email": "team-email3@teams.intercom.io", + "away_mode_enabled": false, + "away_mode_reassign": false, + "avatar": { + "image_url": "https://domain.com/avatar3" + }, + "admin_ids": [ + ] + }, + { + "type": "admin", + "email": "bot-123123123@bots.intercom.io", + "id": "807", + "name": "A bot", + "away_mode_enabled": false, + "away_mode_reassign": false + } + ] +} \ No newline at end of file