Skip to content

Commit c709eb3

Browse files
authored
Merge pull request #36 from railsware/feature/email-templates
Implemented Email Templates API
2 parents b3ae7da + 38be8ef commit c709eb3

File tree

20 files changed

+566
-1
lines changed

20 files changed

+566
-1
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package io.mailtrap.examples.emailtemplates;
2+
3+
import io.mailtrap.config.MailtrapConfig;
4+
import io.mailtrap.factory.MailtrapClientFactory;
5+
import io.mailtrap.model.request.emailtemplates.CreateEmailTemplateRequest;
6+
import io.mailtrap.model.request.emailtemplates.EmailTemplate;
7+
import io.mailtrap.model.request.emailtemplates.UpdateEmailTemplateRequest;
8+
import io.mailtrap.model.response.emailtemplates.EmailTemplateResponse;
9+
10+
import java.util.List;
11+
12+
public class EmailTemplates {
13+
14+
private static final String TOKEN = "<YOUR MAILTRAP TOKEN>";
15+
private static final long ACCOUNT_ID = 1L;
16+
private static final String EMAIL_TEMPLATE_NAME = "My Email Template";
17+
private static final String EMAIL_TEMPLATE_CATEGORY = "Promotion";
18+
private static final String EMAIL_TEMPLATE_SUBJECT = "Promotion Template subject";
19+
private static final String EMAIL_TEMPLATE_BODY_TEXT = "Promotion Text body";
20+
private static final String EMAIL_TEMPLATE_BODY_HTML = "<div>Promotion body</div>";
21+
private static final String UPDATED_EMAIL_TEMPLATE_NAME = "My Updated Email Template";
22+
23+
public static void main(String[] args) {
24+
final var config = new MailtrapConfig.Builder()
25+
.token(TOKEN)
26+
.build();
27+
28+
new EmailTemplate(EMAIL_TEMPLATE_NAME, EMAIL_TEMPLATE_CATEGORY, EMAIL_TEMPLATE_SUBJECT, EMAIL_TEMPLATE_BODY_TEXT, EMAIL_TEMPLATE_BODY_HTML);
29+
30+
final var client = MailtrapClientFactory.createMailtrapClient(config);
31+
32+
final var createRequest = new CreateEmailTemplateRequest(
33+
new EmailTemplate(
34+
EMAIL_TEMPLATE_NAME,
35+
EMAIL_TEMPLATE_CATEGORY,
36+
EMAIL_TEMPLATE_SUBJECT,
37+
EMAIL_TEMPLATE_BODY_TEXT,
38+
EMAIL_TEMPLATE_BODY_HTML
39+
));
40+
41+
final var createdEmailTemplate = client.emailTemplatesApi().emailTemplates()
42+
.createEmailTemplate(ACCOUNT_ID, createRequest);
43+
44+
System.out.println(createdEmailTemplate);
45+
46+
final var allTemplates = client.emailTemplatesApi().emailTemplates()
47+
.getAllTemplates(ACCOUNT_ID);
48+
49+
System.out.println(allTemplates);
50+
51+
final var emailTemplate = client.emailTemplatesApi().emailTemplates()
52+
.getEmailTemplate(ACCOUNT_ID, createdEmailTemplate.getId());
53+
54+
System.out.println(emailTemplate);
55+
56+
final var updateRequest = new UpdateEmailTemplateRequest(
57+
new EmailTemplate(
58+
UPDATED_EMAIL_TEMPLATE_NAME,
59+
EMAIL_TEMPLATE_CATEGORY,
60+
EMAIL_TEMPLATE_SUBJECT,
61+
EMAIL_TEMPLATE_BODY_TEXT,
62+
EMAIL_TEMPLATE_BODY_HTML
63+
));
64+
65+
final var updatedEmailTemplate = client.emailTemplatesApi().emailTemplates()
66+
.updateEmailTemplate(ACCOUNT_ID, createdEmailTemplate.getId(), updateRequest);
67+
68+
System.out.println(updatedEmailTemplate);
69+
70+
client.emailTemplatesApi().emailTemplates()
71+
.deleteEmailTemplate(ACCOUNT_ID, updatedEmailTemplate.getId());
72+
}
73+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.mailtrap.api.emailtemplates;
2+
3+
import io.mailtrap.model.request.emailtemplates.CreateEmailTemplateRequest;
4+
import io.mailtrap.model.request.emailtemplates.UpdateEmailTemplateRequest;
5+
import io.mailtrap.model.response.emailtemplates.EmailTemplateResponse;
6+
7+
import java.util.List;
8+
9+
public interface EmailTemplates {
10+
11+
/**
12+
* Get all email templates existing in your account
13+
*
14+
* @param accountId unique account ID
15+
* @return list of existing email templates
16+
*/
17+
List<EmailTemplateResponse> getAllTemplates(long accountId);
18+
19+
/**
20+
* Create a new email template
21+
*
22+
* @param accountId unique account ID
23+
* @param request email template create payload
24+
* @return created email template
25+
*/
26+
EmailTemplateResponse createEmailTemplate(long accountId, CreateEmailTemplateRequest request);
27+
28+
/**
29+
* Get an email template by ID
30+
*
31+
* @param accountId unique account ID
32+
* @param emailTemplateId unique email template ID
33+
* @return email template attributes
34+
*/
35+
EmailTemplateResponse getEmailTemplate(long accountId, long emailTemplateId);
36+
37+
/**
38+
* Update an email template
39+
*
40+
* @param accountId unique account ID
41+
* @param emailTemplateId unique email template ID
42+
* @param request email template update payload
43+
* @return updated email template
44+
*/
45+
EmailTemplateResponse updateEmailTemplate(long accountId, long emailTemplateId, UpdateEmailTemplateRequest request);
46+
47+
/**
48+
* Delete an email template
49+
*
50+
* @param accountId unique account ID
51+
* @param emailTemplateId unique email template ID
52+
*/
53+
void deleteEmailTemplate(long accountId, long emailTemplateId);
54+
55+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package io.mailtrap.api.emailtemplates;
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.emailtemplates.CreateEmailTemplateRequest;
9+
import io.mailtrap.model.request.emailtemplates.UpdateEmailTemplateRequest;
10+
import io.mailtrap.model.response.emailtemplates.EmailTemplateResponse;
11+
12+
import java.util.List;
13+
14+
public class EmailTemplatesImpl extends ApiResourceWithValidation implements EmailTemplates {
15+
16+
public EmailTemplatesImpl(MailtrapConfig config, CustomValidator customValidator) {
17+
super(config, customValidator);
18+
this.apiHost = Constants.GENERAL_HOST;
19+
}
20+
21+
@Override
22+
public List<EmailTemplateResponse> getAllTemplates(long accountId) {
23+
return
24+
httpClient.getList(
25+
String.format(apiHost + "/api/accounts/%d/email_templates", accountId),
26+
new RequestData(),
27+
EmailTemplateResponse.class
28+
);
29+
}
30+
31+
@Override
32+
public EmailTemplateResponse createEmailTemplate(long accountId, CreateEmailTemplateRequest request) {
33+
validateRequestBodyAndThrowException(request);
34+
35+
return
36+
httpClient.post(
37+
String.format(apiHost + "/api/accounts/%d/email_templates", accountId),
38+
request,
39+
new RequestData(),
40+
EmailTemplateResponse.class
41+
);
42+
}
43+
44+
@Override
45+
public EmailTemplateResponse getEmailTemplate(long accountId, long emailTemplateId) {
46+
return
47+
httpClient.get(
48+
String.format(apiHost + "/api/accounts/%d/email_templates/%d", accountId, emailTemplateId),
49+
new RequestData(),
50+
EmailTemplateResponse.class
51+
);
52+
}
53+
54+
@Override
55+
public EmailTemplateResponse updateEmailTemplate(long accountId, long emailTemplateId, UpdateEmailTemplateRequest request) {
56+
validateRequestBodyAndThrowException(request);
57+
58+
return
59+
httpClient.patch(
60+
String.format(apiHost + "/api/accounts/%d/email_templates/%d", accountId, emailTemplateId),
61+
request,
62+
new RequestData(),
63+
EmailTemplateResponse.class
64+
);
65+
}
66+
67+
@Override
68+
public void deleteEmailTemplate(long accountId, long emailTemplateId) {
69+
httpClient
70+
.delete(
71+
String.format(apiHost + "/api/accounts/%d/email_templates/%d", accountId, emailTemplateId),
72+
new RequestData(),
73+
Void.class
74+
);
75+
}
76+
}

src/main/java/io/mailtrap/client/MailtrapClient.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ public class MailtrapClient {
4848
@Getter
4949
private final MailtrapContactsApi contactsApi;
5050

51+
/**
52+
* API for Mailtrap.io Email Templates management functionality
53+
*/
54+
@Getter
55+
private final MailtrapEmailTemplatesApi emailTemplatesApi;
56+
5157
/**
5258
* Utility class which holds sending context (which API to use: Email Sending API, Bulk Sending API or
5359
* Email Testing API, inbox id for Email Testing API) to make it possible to perform send directly from MailtrapClient
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.mailtrap.client.api;
2+
3+
import io.mailtrap.api.emailtemplates.EmailTemplates;
4+
import lombok.Getter;
5+
import lombok.RequiredArgsConstructor;
6+
import lombok.experimental.Accessors;
7+
8+
@Getter
9+
@Accessors(fluent = true)
10+
@RequiredArgsConstructor
11+
public class MailtrapEmailTemplatesApi {
12+
private final EmailTemplates emailTemplates;
13+
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.mailtrap.api.contactimports.ContactImportsImpl;
1111
import io.mailtrap.api.contactlists.ContactListsImpl;
1212
import io.mailtrap.api.contacts.ContactsImpl;
13+
import io.mailtrap.api.emailtemplates.EmailTemplatesImpl;
1314
import io.mailtrap.api.inboxes.InboxesImpl;
1415
import io.mailtrap.api.messages.MessagesImpl;
1516
import io.mailtrap.api.permissions.PermissionsImpl;
@@ -47,10 +48,11 @@ public static MailtrapClient createMailtrapClient(MailtrapConfig config) {
4748
final var bulkSendingApi = createBulkSendingApi(config, customValidator);
4849
final var generalApi = createGeneralApi(config);
4950
final var contactsApi = createContactsApi(config, customValidator);
51+
final var emailTemplatesApi = createEmailTemplatesApi(config, customValidator);
5052

5153
final var sendingContextHolder = configureSendingContext(config);
5254

53-
return new MailtrapClient(sendingApi, testingApi, bulkSendingApi, generalApi, contactsApi, sendingContextHolder);
55+
return new MailtrapClient(sendingApi, testingApi, bulkSendingApi, generalApi, contactsApi, emailTemplatesApi, sendingContextHolder);
5456
}
5557

5658
private static MailtrapContactsApi createContactsApi(MailtrapConfig config, CustomValidator customValidator) {
@@ -95,6 +97,12 @@ private static MailtrapBulkSendingApi createBulkSendingApi(MailtrapConfig config
9597
return new MailtrapBulkSendingApi(emails);
9698
}
9799

100+
private static MailtrapEmailTemplatesApi createEmailTemplatesApi(MailtrapConfig config, CustomValidator customValidator) {
101+
final var emailTemplates = new EmailTemplatesImpl(config, customValidator);
102+
103+
return new MailtrapEmailTemplatesApi(emailTemplates);
104+
}
105+
98106
private static SendingContextHolder configureSendingContext(MailtrapConfig config) {
99107

100108
return SendingContextHolder.builder()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.mailtrap.model.request.emailtemplates;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import io.mailtrap.model.AbstractModel;
5+
import jakarta.validation.Valid;
6+
import jakarta.validation.constraints.NotNull;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
public class CreateEmailTemplateRequest extends AbstractModel {
13+
14+
@Valid
15+
@NotNull
16+
@JsonProperty("email_template")
17+
private EmailTemplate emailTemplate;
18+
19+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.mailtrap.model.request.emailtemplates;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import jakarta.validation.constraints.NotNull;
5+
import jakarta.validation.constraints.Size;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Data;
8+
9+
@Data
10+
@AllArgsConstructor
11+
public class EmailTemplate {
12+
13+
@NotNull
14+
@Size(min = 1, max = 255)
15+
private String name;
16+
17+
@NotNull
18+
@Size(min = 1, max = 255)
19+
private String category;
20+
21+
@NotNull
22+
@Size(min = 1, max = 255)
23+
private String subject;
24+
25+
@Size(max = 10_000_000)
26+
@JsonProperty("body_text")
27+
private String bodyText;
28+
29+
@Size(max = 10_000_000)
30+
@JsonProperty("body_html")
31+
private String bodyHtml;
32+
33+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.mailtrap.model.request.emailtemplates;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import io.mailtrap.model.AbstractModel;
6+
import jakarta.validation.Valid;
7+
import jakarta.validation.constraints.NotNull;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Getter;
10+
11+
@Getter
12+
@AllArgsConstructor
13+
@JsonInclude(JsonInclude.Include.NON_NULL)
14+
public class UpdateEmailTemplateRequest extends AbstractModel {
15+
16+
@Valid
17+
@NotNull
18+
@JsonProperty("email_template")
19+
private EmailTemplate emailTemplate;
20+
21+
}

src/main/java/io/mailtrap/model/request/inboxes/CreateInboxRequest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fasterxml.jackson.annotation.JsonProperty;
44
import io.mailtrap.model.AbstractModel;
5+
import jakarta.validation.Valid;
56
import jakarta.validation.constraints.Size;
67
import lombok.AllArgsConstructor;
78
import lombok.Getter;
@@ -10,6 +11,7 @@
1011
@AllArgsConstructor
1112
public class CreateInboxRequest extends AbstractModel {
1213

14+
@Valid
1315
@JsonProperty("inbox")
1416
private InboxCreateData inboxCreateData;
1517

0 commit comments

Comments
 (0)