Skip to content

Commit ea7c63f

Browse files
authored
Merge pull request #33 from railsware/feature/contact-imports
Implemented Contact Imports API
2 parents 93685cf + b98abe3 commit ea7c63f

File tree

18 files changed

+363
-19
lines changed

18 files changed

+363
-19
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.mailtrap.examples.contactimports;
2+
3+
import io.mailtrap.config.MailtrapConfig;
4+
import io.mailtrap.factory.MailtrapClientFactory;
5+
import io.mailtrap.model.request.contactimports.Contact;
6+
import io.mailtrap.model.request.contactimports.ImportContactsRequest;
7+
import io.mailtrap.model.request.contacts.UpdateContact;
8+
import io.mailtrap.model.request.contacts.UpdateContactRequest;
9+
10+
import java.util.Collections;
11+
import java.util.List;
12+
import java.util.Map;
13+
14+
public class ContactImports {
15+
16+
private static final String TOKEN = "<YOUR MAILTRAP TOKEN>";
17+
private static final long ACCOUNT_ID = 1L;
18+
private static final long LIST_1_ID = 1L;
19+
private static final long LIST_2_ID = 2L;
20+
private static final String EMAIL = "contact_email@email.com";
21+
22+
public static void main(String[] args) {
23+
final var config = new MailtrapConfig.Builder()
24+
.token(TOKEN)
25+
.build();
26+
27+
final var client = MailtrapClientFactory.createMailtrapClient(config);
28+
29+
var importRequest = new ImportContactsRequest(
30+
List.of(new Contact(EMAIL, Map.of("first_name", "Nick"), List.of(LIST_1_ID), List.of(LIST_2_ID))));
31+
32+
var createResponse = client.contactsApi().contactImports()
33+
.importContacts(ACCOUNT_ID, importRequest);
34+
35+
System.out.println(createResponse);
36+
37+
var contactImportResponse = client.contactsApi().contactImports()
38+
.getContactImport(ACCOUNT_ID, createResponse.getId());
39+
40+
System.out.println(contactImportResponse);
41+
}
42+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.mailtrap.api.contactimports;
2+
3+
import io.mailtrap.model.request.contactimports.ImportContactsRequest;
4+
import io.mailtrap.model.response.contactimports.ContactsImportResponse;
5+
import io.mailtrap.model.response.contactimports.CreateContactsImportResponse;
6+
7+
public interface ContactImports {
8+
9+
/**
10+
* Import contacts in bulk with support for custom fields and list management.
11+
* Existing contacts with matching email addresses will be updated automatically.
12+
* Up to 50,000 contacts per request
13+
*
14+
* @param accountId unique account ID
15+
* @param request request body
16+
* @return contact data
17+
*/
18+
CreateContactsImportResponse importContacts(long accountId, ImportContactsRequest request);
19+
20+
/**
21+
* Get Contact Import
22+
*
23+
* @param accountId unique account ID
24+
* @param importId unique Contact Import ID
25+
* @return contact data
26+
*/
27+
ContactsImportResponse getContactImport(long accountId, long importId);
28+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.mailtrap.api.contactimports;
2+
3+
import io.mailtrap.Constants;
4+
import io.mailtrap.CustomValidator;
5+
import io.mailtrap.api.apiresource.ApiResourceWithValidation;
6+
import io.mailtrap.config.MailtrapConfig;
7+
import io.mailtrap.http.RequestData;
8+
import io.mailtrap.model.request.contactimports.ImportContactsRequest;
9+
import io.mailtrap.model.response.contactimports.ContactsImportResponse;
10+
import io.mailtrap.model.response.contactimports.CreateContactsImportResponse;
11+
12+
public class ContactImportsImpl extends ApiResourceWithValidation implements ContactImports {
13+
14+
public ContactImportsImpl(final MailtrapConfig config, final CustomValidator validator) {
15+
super(config, validator);
16+
this.apiHost = Constants.GENERAL_HOST;
17+
}
18+
19+
@Override
20+
public CreateContactsImportResponse importContacts(long accountId, ImportContactsRequest request) {
21+
22+
validateRequestBodyAndThrowException(request);
23+
24+
return httpClient.post(
25+
String.format(apiHost + "/api/accounts/%s/contacts/imports", accountId),
26+
request,
27+
new RequestData(),
28+
CreateContactsImportResponse.class
29+
);
30+
}
31+
32+
@Override
33+
public ContactsImportResponse getContactImport(long accountId, long importId) {
34+
return httpClient.get(
35+
String.format(apiHost + "/api/accounts/%s/contacts/imports/%s", accountId, importId),
36+
new RequestData(),
37+
ContactsImportResponse.class
38+
);
39+
}
40+
}

src/main/java/io/mailtrap/client/api/MailtrapContactsApi.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.mailtrap.client.api;
22

3+
import io.mailtrap.api.contactimports.ContactImports;
34
import io.mailtrap.api.contactlists.ContactLists;
45
import io.mailtrap.api.contacts.Contacts;
56
import lombok.Getter;
@@ -15,4 +16,5 @@
1516
public class MailtrapContactsApi {
1617
private final ContactLists contactLists;
1718
private final Contacts contacts;
19+
private final ContactImports contactImports;
1820
}

src/main/java/io/mailtrap/factory/MailtrapClientFactory.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.mailtrap.api.attachments.AttachmentsImpl;
77
import io.mailtrap.api.billing.BillingImpl;
88
import io.mailtrap.api.bulkemails.BulkEmailsImpl;
9+
import io.mailtrap.api.contactimports.ContactImportsImpl;
910
import io.mailtrap.api.contactlists.ContactListsImpl;
1011
import io.mailtrap.api.contacts.ContactsImpl;
1112
import io.mailtrap.api.inboxes.InboxesImpl;
@@ -43,18 +44,19 @@ public static MailtrapClient createMailtrapClient(MailtrapConfig config) {
4344
final var testingApi = createTestingApi(config, customValidator);
4445
final var bulkSendingApi = createBulkSendingApi(config, customValidator);
4546
final var generalApi = createGeneralApi(config);
46-
final var contactsApi = createContactsApi(config);
47+
final var contactsApi = createContactsApi(config, customValidator);
4748

4849
final var sendingContextHolder = configureSendingContext(config);
4950

5051
return new MailtrapClient(sendingApi, testingApi, bulkSendingApi, generalApi, contactsApi, sendingContextHolder);
5152
}
5253

53-
private static MailtrapContactsApi createContactsApi(MailtrapConfig config) {
54+
private static MailtrapContactsApi createContactsApi(MailtrapConfig config, CustomValidator customValidator) {
5455
final var contactLists = new ContactListsImpl(config);
5556
final var contacts = new ContactsImpl(config);
57+
final var contactImports = new ContactImportsImpl(config, customValidator);
5658

57-
return new MailtrapContactsApi(contactLists, contacts);
59+
return new MailtrapContactsApi(contactLists, contacts, contactImports);
5860
}
5961

6062
private static MailtrapGeneralApi createGeneralApi(MailtrapConfig config) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.mailtrap.model.request.contactimports;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import java.util.List;
5+
import java.util.Map;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
9+
@Getter
10+
@AllArgsConstructor
11+
public class Contact {
12+
13+
private String email;
14+
15+
private Map<String, Object> fields;
16+
17+
@JsonProperty("list_ids_included")
18+
private List<Long> listIdsIncluded;
19+
20+
@JsonProperty("list_ids_excluded")
21+
private List<Long> listIdsExcluded;
22+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.mailtrap.model.request.contactimports;
2+
3+
import io.mailtrap.model.AbstractModel;
4+
import java.util.List;
5+
6+
import jakarta.validation.constraints.Size;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
public class ImportContactsRequest extends AbstractModel {
13+
14+
@Size(max = 50_000, message = "Maximum 50000 contacts per request")
15+
private List<Contact> contacts;
16+
17+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.mailtrap.model.response.contactimports;
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import com.fasterxml.jackson.annotation.JsonValue;
5+
6+
public enum ContactImportStatus {
7+
CREATED("created"),
8+
STARTED("started"),
9+
FINISHED("finished"),
10+
FAILED("failed");
11+
12+
private final String value;
13+
14+
ContactImportStatus(String value) {
15+
this.value = value;
16+
}
17+
18+
@JsonValue
19+
public String getValue() {
20+
return value;
21+
}
22+
23+
@JsonCreator
24+
public static ContactImportStatus fromValue(Object value) {
25+
for (ContactImportStatus level : ContactImportStatus.values()) {
26+
if (level.value.equalsIgnoreCase((String) value)) {
27+
return level;
28+
}
29+
}
30+
31+
throw new IllegalArgumentException("Unknown value: " + value);
32+
}
33+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.mailtrap.model.response.contactimports;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Data;
5+
6+
@Data
7+
public class ContactsImportResponse {
8+
9+
private long id;
10+
11+
private ContactImportStatus status;
12+
13+
@JsonProperty("created_contacts_count")
14+
private Long createdContactsCount;
15+
16+
@JsonProperty("updated_contacts_count")
17+
private Long updatedContactsCount;
18+
19+
@JsonProperty("contacts_over_limit_count")
20+
private Long contactsOverLimitCount;
21+
22+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.mailtrap.model.response.contactimports;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class CreateContactsImportResponse {
7+
8+
private long id;
9+
10+
private ContactImportStatus status;
11+
12+
}

0 commit comments

Comments
 (0)