diff --git a/examples/java/io/mailtrap/examples/contactevents/ContactEventsExample.java b/examples/java/io/mailtrap/examples/contactevents/ContactEventsExample.java new file mode 100644 index 0000000..3f2395d --- /dev/null +++ b/examples/java/io/mailtrap/examples/contactevents/ContactEventsExample.java @@ -0,0 +1,32 @@ +package io.mailtrap.examples.contactevents; + +import io.mailtrap.config.MailtrapConfig; +import io.mailtrap.factory.MailtrapClientFactory; +import io.mailtrap.model.request.contactevents.CreateContactEventRequest; +import io.mailtrap.model.response.contactevents.ContactEventResponse; + +import java.util.Map; + +public class ContactEventsExample { + + private static final String TOKEN = ""; + private static final long ACCOUNT_ID = 1L; + private static final String CONTACT_IDENTIFIER = "b691272b-3e50-4813-997b-c7c9b317dcb2"; + + public static void main(String[] args) { + final var config = new MailtrapConfig.Builder() + .token(TOKEN) + .build(); + + final var client = MailtrapClientFactory.createMailtrapClient(config); + + final CreateContactEventRequest request = new CreateContactEventRequest("UserLogin", Map.of( + "user_id", 11, + "user_name", "Dillan Doe", + "is_active", true + )); + + final ContactEventResponse contactEvent = client.contactsApi().contactEvents().createContactEvent(ACCOUNT_ID, CONTACT_IDENTIFIER, request); + System.out.println(contactEvent); + } +} diff --git a/examples/java/io/mailtrap/examples/contactlists/ContactListsExample.java b/examples/java/io/mailtrap/examples/contactlists/ContactListsExample.java index c405ede..c013ce8 100644 --- a/examples/java/io/mailtrap/examples/contactlists/ContactListsExample.java +++ b/examples/java/io/mailtrap/examples/contactlists/ContactListsExample.java @@ -2,21 +2,34 @@ import io.mailtrap.config.MailtrapConfig; import io.mailtrap.factory.MailtrapClientFactory; +import io.mailtrap.model.request.contactlists.CreateUpdateContactListRequest; public class ContactListsExample { private static final String TOKEN = ""; private static final long ACCOUNT_ID = 1L; + private static final String NAME_FOR_CREATE = "Clients"; + private static final String NAME_FOR_UPDATE = "Customers"; public static void main(String[] args) { final var config = new MailtrapConfig.Builder() - .token(TOKEN) - .build(); + .token(TOKEN) + .build(); final var client = MailtrapClientFactory.createMailtrapClient(config); - final var contacts = client.contactsApi().contactLists().findAll(ACCOUNT_ID); + final var created = client.contactsApi().contactLists().createContactList(ACCOUNT_ID, new CreateUpdateContactListRequest(NAME_FOR_CREATE)); + System.out.println(created); - System.out.println(contacts); + final var updated = client.contactsApi().contactLists().updateContactList(ACCOUNT_ID, created.getId(), new CreateUpdateContactListRequest(NAME_FOR_UPDATE)); + System.out.println(updated); + + final var byId = client.contactsApi().contactLists().getContactList(ACCOUNT_ID, updated.getId()); + System.out.println(byId); + + final var contactLists = client.contactsApi().contactLists().findAll(ACCOUNT_ID); + System.out.println(contactLists); + + client.contactsApi().contactLists().deleteContactList(ACCOUNT_ID, byId.getId()); } } diff --git a/src/main/java/io/mailtrap/api/contactevents/ContactEvents.java b/src/main/java/io/mailtrap/api/contactevents/ContactEvents.java new file mode 100644 index 0000000..a811fc8 --- /dev/null +++ b/src/main/java/io/mailtrap/api/contactevents/ContactEvents.java @@ -0,0 +1,17 @@ +package io.mailtrap.api.contactevents; + +import io.mailtrap.model.request.contactevents.CreateContactEventRequest; +import io.mailtrap.model.response.contactevents.ContactEventResponse; + +public interface ContactEvents { + + /** + * Submit custom event for contact + * + * @param accountId unique account ID + * @param contactIdentifier Contact UUID or Email + * @param request body + * @return created contact event + */ + ContactEventResponse createContactEvent(long accountId, String contactIdentifier, CreateContactEventRequest request); +} diff --git a/src/main/java/io/mailtrap/api/contactevents/ContactEventsImpl.java b/src/main/java/io/mailtrap/api/contactevents/ContactEventsImpl.java new file mode 100644 index 0000000..53d4b9f --- /dev/null +++ b/src/main/java/io/mailtrap/api/contactevents/ContactEventsImpl.java @@ -0,0 +1,29 @@ +package io.mailtrap.api.contactevents; + +import io.mailtrap.Constants; +import io.mailtrap.api.apiresource.ApiResource; +import io.mailtrap.config.MailtrapConfig; +import io.mailtrap.http.RequestData; +import io.mailtrap.model.request.contactevents.CreateContactEventRequest; +import io.mailtrap.model.response.contactevents.ContactEventResponse; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +public class ContactEventsImpl extends ApiResource implements ContactEvents { + + public ContactEventsImpl(final MailtrapConfig config) { + super(config); + this.apiHost = Constants.GENERAL_HOST; + } + + @Override + public ContactEventResponse createContactEvent(final long accountId, final String contactIdentifier, final CreateContactEventRequest request) { + return httpClient.post( + String.format(apiHost + "/api/accounts/%d/contacts/%s/events", accountId, URLEncoder.encode(contactIdentifier, StandardCharsets.UTF_8)), + request, + new RequestData(), + ContactEventResponse.class + ); + } +} diff --git a/src/main/java/io/mailtrap/api/contactlists/ContactLists.java b/src/main/java/io/mailtrap/api/contactlists/ContactLists.java index 7ddbfbb..2b2028a 100644 --- a/src/main/java/io/mailtrap/api/contactlists/ContactLists.java +++ b/src/main/java/io/mailtrap/api/contactlists/ContactLists.java @@ -1,5 +1,6 @@ package io.mailtrap.api.contactlists; +import io.mailtrap.model.request.contactlists.CreateUpdateContactListRequest; import io.mailtrap.model.response.contactlists.ContactListResponse; import java.util.List; @@ -13,4 +14,40 @@ public interface ContactLists { * @return contacts list */ List findAll(long accountId); + + /** + * Create new Contact List + * + * @param accountId unique account ID + * @param request body + * @return created contact list + */ + ContactListResponse createContactList(long accountId, CreateUpdateContactListRequest request); + + /** + * Get a contact list by ID + * + * @param accountId unique account ID + * @param contactListId unique contact list ID + * @return found contact list + */ + ContactListResponse getContactList(long accountId, long contactListId); + + /** + * Update existing Contact List + * + * @param accountId unique account ID + * @param contactListId unique contact list ID + * @param request body + * @return updated contact list + */ + ContactListResponse updateContactList(long accountId, long contactListId, CreateUpdateContactListRequest request); + + /** + * Delete existing Contact List + * + * @param accountId unique account ID + * @param contactListId unique contact list ID + */ + void deleteContactList(long accountId, long contactListId); } diff --git a/src/main/java/io/mailtrap/api/contactlists/ContactListsImpl.java b/src/main/java/io/mailtrap/api/contactlists/ContactListsImpl.java index c22996e..3196b2f 100644 --- a/src/main/java/io/mailtrap/api/contactlists/ContactListsImpl.java +++ b/src/main/java/io/mailtrap/api/contactlists/ContactListsImpl.java @@ -4,6 +4,7 @@ import io.mailtrap.api.apiresource.ApiResource; import io.mailtrap.config.MailtrapConfig; import io.mailtrap.http.RequestData; +import io.mailtrap.model.request.contactlists.CreateUpdateContactListRequest; import io.mailtrap.model.response.contactlists.ContactListResponse; import java.util.List; @@ -23,4 +24,42 @@ public List findAll(final long accountId) { ContactListResponse.class ); } + + @Override + public ContactListResponse createContactList(final long accountId, final CreateUpdateContactListRequest request) { + return httpClient.post( + String.format(apiHost + "/api/accounts/%d/contacts/lists", accountId), + request, + new RequestData(), + ContactListResponse.class + ); + } + + @Override + public ContactListResponse getContactList(final long accountId, final long contactListId) { + return httpClient.get( + String.format(apiHost + "/api/accounts/%d/contacts/lists/%d", accountId, contactListId), + new RequestData(), + ContactListResponse.class + ); + } + + @Override + public ContactListResponse updateContactList(final long accountId, final long contactListId, final CreateUpdateContactListRequest request) { + return httpClient.patch( + String.format(apiHost + "/api/accounts/%d/contacts/lists/%d", accountId, contactListId), + request, + new RequestData(), + ContactListResponse.class + ); + } + + @Override + public void deleteContactList(final long accountId, final long contactListId) { + httpClient.delete( + String.format(apiHost + "/api/accounts/%d/contacts/lists/%d", accountId, contactListId), + new RequestData(), + Void.class + ); + } } diff --git a/src/main/java/io/mailtrap/client/api/MailtrapContactsApi.java b/src/main/java/io/mailtrap/client/api/MailtrapContactsApi.java index bfb9b16..b031ae2 100644 --- a/src/main/java/io/mailtrap/client/api/MailtrapContactsApi.java +++ b/src/main/java/io/mailtrap/client/api/MailtrapContactsApi.java @@ -1,5 +1,6 @@ package io.mailtrap.client.api; +import io.mailtrap.api.contactevents.ContactEvents; import io.mailtrap.api.contactexports.ContactExports; import io.mailtrap.api.contactfields.ContactFields; import io.mailtrap.api.contactimports.ContactImports; @@ -21,4 +22,5 @@ public class MailtrapContactsApi { private final ContactImports contactImports; private final ContactFields contactFields; private final ContactExports contactExports; + private final ContactEvents contactEvents; } diff --git a/src/main/java/io/mailtrap/factory/MailtrapClientFactory.java b/src/main/java/io/mailtrap/factory/MailtrapClientFactory.java index 89b5e44..572e523 100644 --- a/src/main/java/io/mailtrap/factory/MailtrapClientFactory.java +++ b/src/main/java/io/mailtrap/factory/MailtrapClientFactory.java @@ -6,6 +6,7 @@ import io.mailtrap.api.attachments.AttachmentsImpl; import io.mailtrap.api.billing.BillingImpl; import io.mailtrap.api.bulkemails.BulkEmailsImpl; +import io.mailtrap.api.contactevents.ContactEventsImpl; import io.mailtrap.api.contactexports.ContactExportsImpl; import io.mailtrap.api.contactfields.ContactFieldsImpl; import io.mailtrap.api.contactimports.ContactImportsImpl; @@ -76,8 +77,9 @@ private static MailtrapContactsApi createContactsApi(final MailtrapConfig config final var contactImports = new ContactImportsImpl(config, VALIDATOR); final var contactFields = new ContactFieldsImpl(config, VALIDATOR); final var contactExports = new ContactExportsImpl(config); + final var contactEvents = new ContactEventsImpl(config); - return new MailtrapContactsApi(contactLists, contacts, contactImports, contactFields, contactExports); + return new MailtrapContactsApi(contactLists, contacts, contactImports, contactFields, contactExports, contactEvents); } private static MailtrapGeneralApi createGeneralApi(final MailtrapConfig config) { diff --git a/src/main/java/io/mailtrap/model/request/contactevents/CreateContactEventRequest.java b/src/main/java/io/mailtrap/model/request/contactevents/CreateContactEventRequest.java new file mode 100644 index 0000000..d5cf887 --- /dev/null +++ b/src/main/java/io/mailtrap/model/request/contactevents/CreateContactEventRequest.java @@ -0,0 +1,14 @@ +package io.mailtrap.model.request.contactevents; + +import io.mailtrap.model.AbstractModel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Map; + +@Getter +@AllArgsConstructor +public class CreateContactEventRequest extends AbstractModel { + private String name; + private Map params; +} diff --git a/src/main/java/io/mailtrap/model/request/contactlists/CreateUpdateContactListRequest.java b/src/main/java/io/mailtrap/model/request/contactlists/CreateUpdateContactListRequest.java new file mode 100644 index 0000000..e8e5372 --- /dev/null +++ b/src/main/java/io/mailtrap/model/request/contactlists/CreateUpdateContactListRequest.java @@ -0,0 +1,11 @@ +package io.mailtrap.model.request.contactlists; + +import io.mailtrap.model.AbstractModel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CreateUpdateContactListRequest extends AbstractModel { + private String name; +} diff --git a/src/main/java/io/mailtrap/model/response/contactevents/ContactEventResponse.java b/src/main/java/io/mailtrap/model/response/contactevents/ContactEventResponse.java new file mode 100644 index 0000000..7b2df73 --- /dev/null +++ b/src/main/java/io/mailtrap/model/response/contactevents/ContactEventResponse.java @@ -0,0 +1,21 @@ +package io.mailtrap.model.response.contactevents; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.Map; + +@Data +public class ContactEventResponse { + + @JsonProperty("contact_id") + private String contactId; + + @JsonProperty("contact_email") + private String contactEmail; + + private String name; + + private Map params; + +} diff --git a/src/test/java/io/mailtrap/api/contactevents/ContactEventsImplTest.java b/src/test/java/io/mailtrap/api/contactevents/ContactEventsImplTest.java new file mode 100644 index 0000000..b4b639f --- /dev/null +++ b/src/test/java/io/mailtrap/api/contactevents/ContactEventsImplTest.java @@ -0,0 +1,53 @@ +package io.mailtrap.api.contactevents; + +import io.mailtrap.Constants; +import io.mailtrap.config.MailtrapConfig; +import io.mailtrap.factory.MailtrapClientFactory; +import io.mailtrap.model.request.contactevents.CreateContactEventRequest; +import io.mailtrap.model.response.contactevents.ContactEventResponse; +import io.mailtrap.testutils.BaseTest; +import io.mailtrap.testutils.DataMock; +import io.mailtrap.testutils.TestHttpClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class ContactEventsImplTest extends BaseTest { + private ContactEvents api; + + @BeforeEach + public void init() { + final TestHttpClient httpClient = new TestHttpClient(List.of( + DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/contacts/" + contactEventIdEncoded + "/events", + "POST", "api/contactevents/createRequest.json", "api/contactevents/contactEvent.json") + )); + + final MailtrapConfig testConfig = new MailtrapConfig.Builder() + .httpClient(httpClient) + .token("dummy_token") + .build(); + + api = MailtrapClientFactory.createMailtrapClient(testConfig).contactsApi().contactEvents(); + } + + @Test + void test_createContactEvent() { + final CreateContactEventRequest request = new CreateContactEventRequest("UserLogin", Map.of( + "user_id", 11, + "user_name", "Dillan Doe", + "is_active", true + )); + + final ContactEventResponse created = api.createContactEvent(accountId, contactEventId, request); + + assertNotNull(created); + assertEquals(contactEventId, created.getContactId()); + assertEquals(3, created.getParams().size()); + assertEquals("Dillan Doe", created.getParams().get("user_name")); + } +} diff --git a/src/test/java/io/mailtrap/api/contactlists/ContactListsImplTest.java b/src/test/java/io/mailtrap/api/contactlists/ContactListsImplTest.java index b553f8c..cbd054a 100644 --- a/src/test/java/io/mailtrap/api/contactlists/ContactListsImplTest.java +++ b/src/test/java/io/mailtrap/api/contactlists/ContactListsImplTest.java @@ -3,6 +3,7 @@ import io.mailtrap.Constants; import io.mailtrap.config.MailtrapConfig; import io.mailtrap.factory.MailtrapClientFactory; +import io.mailtrap.model.request.contactlists.CreateUpdateContactListRequest; import io.mailtrap.model.response.contactlists.ContactListResponse; import io.mailtrap.testutils.BaseTest; import io.mailtrap.testutils.DataMock; @@ -12,8 +13,7 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.*; class ContactListsImplTest extends BaseTest { private ContactLists api; @@ -21,14 +21,22 @@ class ContactListsImplTest extends BaseTest { @BeforeEach public void init() { final TestHttpClient httpClient = new TestHttpClient(List.of( - DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/contacts/lists", - "GET", null, "api/contact_lists/contactLists.json") + DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/contacts/lists", + "GET", null, "api/contact_lists/contactLists.json"), + DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/contacts/lists", + "POST", "api/contact_lists/createRequest.json", "api/contact_lists/contactList.json"), + DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/contacts/lists/" + contactListId, + "GET", null, "api/contact_lists/contactList.json"), + DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/contacts/lists/" + contactListId, + "PATCH", "api/contact_lists/updateRequest.json", "api/contact_lists/updatedContactList.json"), + DataMock.build(Constants.GENERAL_HOST + "/api/accounts/" + accountId + "/contacts/lists/" + contactListId, + "DELETE", null, null) )); final MailtrapConfig testConfig = new MailtrapConfig.Builder() - .httpClient(httpClient) - .token("dummy_token") - .build(); + .httpClient(httpClient) + .token("dummy_token") + .build(); api = MailtrapClientFactory.createMailtrapClient(testConfig).contactsApi().contactLists(); } @@ -40,4 +48,34 @@ void test_findAll() { assertFalse(contacts.isEmpty()); assertEquals(2, contacts.size()); } + + @Test + void test_create() { + final ContactListResponse contactList = api.createContactList(accountId, new CreateUpdateContactListRequest("Customers")); + + assertNotNull(contactList); + assertEquals(contactListId, contactList.getId()); + } + + @Test + void test_findOne() { + final ContactListResponse contactList = api.getContactList(accountId, contactListId); + + assertNotNull(contactList); + assertEquals(contactListId, contactList.getId()); + } + + @Test + void test_update() { + final ContactListResponse contactList = api.updateContactList(accountId, contactListId, new CreateUpdateContactListRequest("Old-Customers")); + + assertNotNull(contactList); + assertEquals(contactListId, contactList.getId()); + assertEquals("Old-Customers", contactList.getName()); + } + + @Test + void test_delete() { + assertDoesNotThrow(() -> api.deleteContactList(accountId, contactListId)); + } } diff --git a/src/test/java/io/mailtrap/testutils/BaseTest.java b/src/test/java/io/mailtrap/testutils/BaseTest.java index 961befe..d53222e 100644 --- a/src/test/java/io/mailtrap/testutils/BaseTest.java +++ b/src/test/java/io/mailtrap/testutils/BaseTest.java @@ -26,4 +26,7 @@ public class BaseTest { protected final String suppressionId = "2fe148b8-b019-431f-ab3f-107663fdf868"; protected final String suppressionIdEncoded = URLEncoder.encode(suppressionId, StandardCharsets.UTF_8); protected final Long emailTemplateId = 2222L; + protected final Long contactListId = 1337L; + protected final String contactEventId = "b691272b-3e50-4813-997b-c7c9b317dcb2"; + protected final String contactEventIdEncoded = URLEncoder.encode(contactEventId, StandardCharsets.UTF_8); } diff --git a/src/test/resources/api/contact_lists/contactList.json b/src/test/resources/api/contact_lists/contactList.json new file mode 100644 index 0000000..e7f6442 --- /dev/null +++ b/src/test/resources/api/contact_lists/contactList.json @@ -0,0 +1,4 @@ +{ + "id": 1337, + "name": "Customers" +} diff --git a/src/test/resources/api/contact_lists/createRequest.json b/src/test/resources/api/contact_lists/createRequest.json new file mode 100644 index 0000000..3838280 --- /dev/null +++ b/src/test/resources/api/contact_lists/createRequest.json @@ -0,0 +1,3 @@ +{ + "name": "Customers" +} diff --git a/src/test/resources/api/contact_lists/updateRequest.json b/src/test/resources/api/contact_lists/updateRequest.json new file mode 100644 index 0000000..948d628 --- /dev/null +++ b/src/test/resources/api/contact_lists/updateRequest.json @@ -0,0 +1,3 @@ +{ + "name": "Old-Customers" +} diff --git a/src/test/resources/api/contact_lists/updatedContactList.json b/src/test/resources/api/contact_lists/updatedContactList.json new file mode 100644 index 0000000..2dd3d69 --- /dev/null +++ b/src/test/resources/api/contact_lists/updatedContactList.json @@ -0,0 +1,4 @@ +{ + "id": 1337, + "name": "Old-Customers" +} diff --git a/src/test/resources/api/contactevents/contactEvent.json b/src/test/resources/api/contactevents/contactEvent.json new file mode 100644 index 0000000..49855ad --- /dev/null +++ b/src/test/resources/api/contactevents/contactEvent.json @@ -0,0 +1,10 @@ +{ + "contact_id": "b691272b-3e50-4813-997b-c7c9b317dcb2", + "contact_email": "dill@example.com", + "name": "UserLogin", + "params": { + "user_id": 11, + "user_name": "Dillan Doe", + "is_active": true + } +} diff --git a/src/test/resources/api/contactevents/createRequest.json b/src/test/resources/api/contactevents/createRequest.json new file mode 100644 index 0000000..d17e2db --- /dev/null +++ b/src/test/resources/api/contactevents/createRequest.json @@ -0,0 +1,8 @@ +{ + "name": "UserLogin", + "params": { + "user_id": 11, + "user_name": "Dillan Doe", + "is_active": true + } +}