|
5 | 5 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; |
6 | 6 | import com.fasterxml.jackson.annotation.JsonInclude; |
7 | 7 | import com.fasterxml.jackson.annotation.JsonProperty; |
| 8 | +import com.google.common.annotations.VisibleForTesting; |
8 | 9 | import com.google.common.collect.Maps; |
9 | 10 |
|
10 | 11 | import java.net.URI; |
| 12 | +import java.util.HashMap; |
11 | 13 | import java.util.List; |
12 | 14 | import java.util.Map; |
13 | 15 |
|
@@ -62,10 +64,115 @@ public static Contact delete(Contact c) |
62 | 64 | return DataResource.delete(c.getID(), "contacts", Contact.class); |
63 | 65 | } |
64 | 66 |
|
| 67 | + public static User convert(Contact c, User u) |
| 68 | + throws AuthorizationException, ClientException, ServerException, InvalidException, RateLimitException { |
| 69 | + return DataResource.post(ContactConvertBuilder.buildConvert(c, u), convertURI(), User.class); |
| 70 | + } |
| 71 | + |
65 | 72 | private static URI contactURI(String id) { |
66 | 73 | return UriBuilder.newBuilder().path("contacts").path(id).build(); |
67 | 74 | } |
68 | 75 |
|
| 76 | + private static URI convertURI() { |
| 77 | + return UriBuilder.newBuilder().path("contacts").path("convert").build(); |
| 78 | + } |
| 79 | + |
| 80 | + static class ContactConvertBuilder { |
| 81 | + |
| 82 | + static ContactConvert buildConvert(Contact c, User u) throws InvalidException { |
| 83 | + return new ContactConvertBuilder().build(c, u); |
| 84 | + } |
| 85 | + |
| 86 | + ContactConvert build(Contact c, User u) throws InvalidException { |
| 87 | + return new ContactConvert(buildConvertContact(c), buildConvertUser(u)); |
| 88 | + } |
| 89 | + |
| 90 | + HashMap<String, String> buildConvertUser(User u) { |
| 91 | + final HashMap<String, String> convertUser = Maps.newHashMap(); |
| 92 | + |
| 93 | + if (u.getId() != null) { |
| 94 | + convertUser.put("id", u.getId()); |
| 95 | + } |
| 96 | + |
| 97 | + if (u.getUserId() != null) { |
| 98 | + convertUser.put("user_id", u.getUserId()); |
| 99 | + } |
| 100 | + |
| 101 | + if (u.getEmail() != null) { |
| 102 | + convertUser.put("email", u.getEmail()); |
| 103 | + } |
| 104 | + |
| 105 | + checkValidConvertContact(convertUser); |
| 106 | + |
| 107 | + return convertUser; |
| 108 | + } |
| 109 | + |
| 110 | + void checkValidConvertContact(HashMap<String, String> convertUser) { |
| 111 | + if ((!convertUser.containsKey("id")) && (!convertUser.containsKey("user_id")) && (!convertUser.containsKey("email"))) { |
| 112 | + throw new InvalidException("a convert user must include at least one of, an id, user_id or email parameter"); |
| 113 | + } |
| 114 | + } |
| 115 | + |
| 116 | + HashMap<String, String> buildConvertContact(Contact c) { |
| 117 | + final HashMap<String, String> convertContact = Maps.newHashMap(); |
| 118 | + |
| 119 | + if (c.getID() != null) { |
| 120 | + convertContact.put("id", c.getID()); |
| 121 | + } |
| 122 | + |
| 123 | + if (c.getUserID() != null) { |
| 124 | + convertContact.put("user_id", c.getUserID()); |
| 125 | + } |
| 126 | + |
| 127 | + checkValidConvertUser(convertContact); |
| 128 | + |
| 129 | + return convertContact; |
| 130 | + } |
| 131 | + |
| 132 | + void checkValidConvertUser(HashMap<String, String> convertContact) { |
| 133 | + if ((!convertContact.containsKey("id")) && (!convertContact.containsKey("user_id"))) { |
| 134 | + throw new InvalidException("a convert contact must include at least one of, an id or a user_id parameter"); |
| 135 | + } |
| 136 | + } |
| 137 | + } |
| 138 | + |
| 139 | + |
| 140 | + @SuppressWarnings("UnusedDeclaration") |
| 141 | + @JsonIgnoreProperties(ignoreUnknown = true) |
| 142 | + @JsonInclude(JsonInclude.Include.NON_DEFAULT) |
| 143 | + static class ContactConvert extends TypedData { |
| 144 | + |
| 145 | + @JsonProperty("contact") |
| 146 | + private Map<String, String> contact; |
| 147 | + |
| 148 | + @JsonProperty("user") |
| 149 | + private Map<String, String> user; |
| 150 | + |
| 151 | + public ContactConvert() { |
| 152 | + } |
| 153 | + |
| 154 | + public ContactConvert(Map<String, String> contact, Map<String, String> user) { |
| 155 | + this.contact = contact; |
| 156 | + this.user = user; |
| 157 | + } |
| 158 | + |
| 159 | + public Map<String, String> getContact() { |
| 160 | + return contact; |
| 161 | + } |
| 162 | + |
| 163 | + public void setContact(Map<String, String> contact) { |
| 164 | + this.contact = contact; |
| 165 | + } |
| 166 | + |
| 167 | + public Map<String, String> getUser() { |
| 168 | + return user; |
| 169 | + } |
| 170 | + |
| 171 | + public void setUser(Map<String, String> user) { |
| 172 | + this.user = user; |
| 173 | + } |
| 174 | + } |
| 175 | + |
69 | 176 | @SuppressWarnings("UnusedDeclaration") |
70 | 177 | @JsonIgnoreProperties(ignoreUnknown = true) |
71 | 178 | @JsonInclude(JsonInclude.Include.NON_DEFAULT) |
@@ -289,6 +396,12 @@ public String getID() { |
289 | 396 | return id; |
290 | 397 | } |
291 | 398 |
|
| 399 | + @VisibleForTesting |
| 400 | + Contact setID(String id) { |
| 401 | + this.id = id; |
| 402 | + return this; |
| 403 | + } |
| 404 | + |
292 | 405 | public String getName() { |
293 | 406 | return name; |
294 | 407 | } |
|
0 commit comments