Skip to content

Commit 2682572

Browse files
committed
refactor: introduce interface for postmarkClient
1 parent ddd1d07 commit 2682572

12 files changed

+116
-100
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package io.rocketbase.mail;
2+
3+
import io.rocketbase.mail.config.PostmarkProperties;
4+
import io.rocketbase.mail.dto.EmailAttachment;
5+
import io.rocketbase.mail.dto.Message;
6+
import io.rocketbase.mail.dto.MessageResponse;
7+
import io.rocketbase.mail.dto.MessageWithTemplate;
8+
import io.rocketbase.mail.util.MessageJsonWriter;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.core.ParameterizedTypeReference;
11+
import org.springframework.core.io.FileSystemResource;
12+
import org.springframework.http.HttpEntity;
13+
import org.springframework.http.HttpHeaders;
14+
import org.springframework.http.HttpMethod;
15+
import org.springframework.http.ResponseEntity;
16+
import org.springframework.web.client.RestTemplate;
17+
import org.springframework.web.util.UriComponentsBuilder;
18+
19+
import java.io.File;
20+
import java.util.List;
21+
22+
@RequiredArgsConstructor
23+
public class DefaultPostmarkClient implements PostmarkClient {
24+
25+
private final PostmarkProperties postmarkProperties;
26+
27+
protected RestTemplate restTemplate;
28+
29+
protected RestTemplate getRestTemplate() {
30+
if (restTemplate == null) {
31+
restTemplate = new RestTemplate();
32+
}
33+
return restTemplate;
34+
}
35+
36+
@Override
37+
public MessageResponse deliverMessage(Message msg) {
38+
ResponseEntity<MessageResponse> response = getRestTemplate().exchange(createUriBuilder().path("/email/")
39+
.toUriString(),
40+
HttpMethod.POST,
41+
new HttpEntity<>(msg, buildHeaders()),
42+
MessageResponse.class);
43+
return response.getBody();
44+
}
45+
46+
@Override
47+
public MessageResponse deliverMessage(Message msg, EmailAttachment... emailAttachments) {
48+
ResponseEntity<MessageResponse> response = null;
49+
File json = null;
50+
try {
51+
json = new MessageJsonWriter().writeMessageFile(msg, emailAttachments);
52+
response = getRestTemplate().exchange(createUriBuilder().path("/email/")
53+
.toUriString(),
54+
HttpMethod.POST,
55+
new HttpEntity<>(new FileSystemResource(json), buildHeaders()),
56+
MessageResponse.class);
57+
} finally {
58+
if (json != null) {
59+
json.delete();
60+
}
61+
}
62+
return response.getBody();
63+
}
64+
65+
@Override
66+
public List<MessageResponse> deliverMessage(List<Message> messages) {
67+
ResponseEntity<List<MessageResponse>> response = getRestTemplate().exchange(createUriBuilder().path("/email/batch")
68+
.toUriString(),
69+
HttpMethod.POST,
70+
new HttpEntity<>(messages, buildHeaders()),
71+
new ParameterizedTypeReference<List<MessageResponse>>() {
72+
});
73+
return response.getBody();
74+
}
75+
76+
@Override
77+
public MessageResponse deliverMessageWithTemplate(MessageWithTemplate msg) {
78+
ResponseEntity<MessageResponse> response = getRestTemplate().exchange(createUriBuilder().path("/email/withTemplate")
79+
.toUriString(),
80+
HttpMethod.POST,
81+
new HttpEntity<>(msg, buildHeaders()),
82+
MessageResponse.class);
83+
return response.getBody();
84+
}
85+
86+
protected UriComponentsBuilder createUriBuilder() {
87+
return UriComponentsBuilder.fromUriString(postmarkProperties.getApi().getUrl());
88+
}
89+
90+
protected HttpHeaders buildHeaders() {
91+
HttpHeaders headers = new HttpHeaders();
92+
headers.add(postmarkProperties.getApi().getHeader(), postmarkProperties.getToken());
93+
return headers;
94+
}
95+
96+
}
Lines changed: 5 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,19 @@
11
package io.rocketbase.mail;
22

3-
import io.rocketbase.mail.config.PostmarkProperties;
43
import io.rocketbase.mail.dto.EmailAttachment;
54
import io.rocketbase.mail.dto.Message;
65
import io.rocketbase.mail.dto.MessageResponse;
76
import io.rocketbase.mail.dto.MessageWithTemplate;
8-
import io.rocketbase.mail.util.MessageJsonWriter;
9-
import lombok.RequiredArgsConstructor;
10-
import org.springframework.core.ParameterizedTypeReference;
11-
import org.springframework.core.io.FileSystemResource;
12-
import org.springframework.http.HttpEntity;
13-
import org.springframework.http.HttpHeaders;
14-
import org.springframework.http.HttpMethod;
15-
import org.springframework.http.ResponseEntity;
16-
import org.springframework.web.client.RestTemplate;
17-
import org.springframework.web.util.UriComponentsBuilder;
187

19-
import java.io.File;
208
import java.util.List;
219

22-
@RequiredArgsConstructor
23-
public class PostmarkClient {
10+
public interface PostmarkClient {
2411

25-
private final PostmarkProperties postmarkProperties;
12+
MessageResponse deliverMessage(Message msg);
2613

27-
protected RestTemplate restTemplate;
14+
MessageResponse deliverMessage(Message msg, EmailAttachment... emailAttachments);
2815

29-
protected RestTemplate getRestTemplate() {
30-
if (restTemplate == null) {
31-
restTemplate = new RestTemplate();
32-
}
33-
return restTemplate;
34-
}
35-
36-
public MessageResponse deliverMessage(Message msg) {
37-
ResponseEntity<MessageResponse> response = getRestTemplate().exchange(createUriBuilder().path("/email/")
38-
.toUriString(),
39-
HttpMethod.POST,
40-
new HttpEntity<>(msg, buildHeaders()),
41-
MessageResponse.class);
42-
return response.getBody();
43-
}
44-
45-
public MessageResponse deliverMessage(Message msg, EmailAttachment... emailAttachments) {
46-
ResponseEntity<MessageResponse> response = null;
47-
File json = null;
48-
try {
49-
json = new MessageJsonWriter().writeMessageFile(msg, emailAttachments);
50-
response = getRestTemplate().exchange(createUriBuilder().path("/email/")
51-
.toUriString(),
52-
HttpMethod.POST,
53-
new HttpEntity<>(new FileSystemResource(json), buildHeaders()),
54-
MessageResponse.class);
55-
} finally {
56-
if (json != null) {
57-
json.delete();
58-
}
59-
}
60-
return response.getBody();
61-
}
62-
63-
public List<MessageResponse> deliverMessage(List<Message> messages) {
64-
ResponseEntity<List<MessageResponse>> response = getRestTemplate().exchange(createUriBuilder().path("/email/batch")
65-
.toUriString(),
66-
HttpMethod.POST,
67-
new HttpEntity<>(messages, buildHeaders()),
68-
new ParameterizedTypeReference<List<MessageResponse>>() {
69-
});
70-
return response.getBody();
71-
}
72-
73-
public MessageResponse deliverMessageWithTemplate(MessageWithTemplate msg) {
74-
ResponseEntity<MessageResponse> response = getRestTemplate().exchange(createUriBuilder().path("/email/withTemplate")
75-
.toUriString(),
76-
HttpMethod.POST,
77-
new HttpEntity<>(msg, buildHeaders()),
78-
MessageResponse.class);
79-
return response.getBody();
80-
}
81-
82-
protected UriComponentsBuilder createUriBuilder() {
83-
return UriComponentsBuilder.fromUriString(postmarkProperties.getApi().getUrl());
84-
}
85-
86-
protected HttpHeaders buildHeaders() {
87-
HttpHeaders headers = new HttpHeaders();
88-
headers.add(postmarkProperties.getApi().getHeader(), postmarkProperties.getToken());
89-
return headers;
90-
}
16+
List<MessageResponse> deliverMessage(List<Message> messages);
9117

18+
MessageResponse deliverMessageWithTemplate(MessageWithTemplate msg);
9219
}

src/main/java/io/rocketbase/mail/config/PostmarkAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.rocketbase.mail.config;
22

33
import io.rocketbase.mail.PostmarkClient;
4+
import io.rocketbase.mail.DefaultPostmarkClient;
45
import lombok.RequiredArgsConstructor;
56
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
67
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -21,7 +22,7 @@ public class PostmarkAutoConfiguration implements Serializable {
2122
@ConditionalOnMissingBean
2223
@ConditionalOnProperty(name = "postmark.enabled", matchIfMissing = true)
2324
public PostmarkClient postmarkClient() {
24-
return new PostmarkClient(postmarkProperties);
25+
return new DefaultPostmarkClient(postmarkProperties);
2526
}
2627

2728
}

src/main/java/io/rocketbase/mail/dto/MessageResponse.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package io.rocketbase.mail.dto;
22

3+
import lombok.Data;
4+
import lombok.Getter;
5+
36
import java.util.Date;
47

8+
@Data
59
public class MessageResponse {
610

711
private String to;

src/main/java/io/rocketbase/mail/dto/webhook/BounceWebhookMessage.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.rocketbase.mail.dto.webhook;
22

3-
import com.fasterxml.jackson.annotation.JsonFormat;
43
import com.fasterxml.jackson.annotation.JsonProperty;
54
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
65
import io.rocketbase.mail.dto.webhook.sub.BounceType;
@@ -10,7 +9,6 @@
109
import lombok.NoArgsConstructor;
1110

1211
import java.time.Instant;
13-
import java.util.Date;
1412
import java.util.Map;
1513

1614
@Data
@@ -55,7 +53,7 @@ public WebhookRecordType getRecordType() {
5553
private boolean canActivate;
5654

5755
@JsonProperty("BouncedAt")
58-
@JsonDeserialize(using = PostmarkInstantDeserialzer.class)
56+
@JsonDeserialize(using = PostmarkInstantDeserializer.class)
5957
private Instant bouncedAt;
6058

6159

src/main/java/io/rocketbase/mail/dto/webhook/ClickWebhookMessage.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.rocketbase.mail.dto.webhook;
22

3-
import com.fasterxml.jackson.annotation.JsonFormat;
43
import com.fasterxml.jackson.annotation.JsonProperty;
54
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
65
import io.rocketbase.mail.dto.webhook.sub.ClickLocation;
@@ -12,7 +11,6 @@
1211
import lombok.NoArgsConstructor;
1312

1413
import java.time.Instant;
15-
import java.util.Date;
1614
import java.util.Map;
1715

1816
@Data
@@ -45,7 +43,7 @@ public WebhookRecordType getRecordType() {
4543
private ClickLocation clickLocation;
4644

4745
@JsonProperty("ReceivedAt")
48-
@JsonDeserialize(using = PostmarkInstantDeserialzer.class)
46+
@JsonDeserialize(using = PostmarkInstantDeserializer.class)
4947
private Instant receivedAt;
5048

5149
@JsonProperty("Client")

src/main/java/io/rocketbase/mail/dto/webhook/DeliveryWebhookMessage.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.rocketbase.mail.dto.webhook;
22

3-
import com.fasterxml.jackson.annotation.JsonFormat;
43
import com.fasterxml.jackson.annotation.JsonProperty;
54
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
65
import lombok.AllArgsConstructor;
@@ -9,7 +8,6 @@
98
import lombok.NoArgsConstructor;
109

1110
import java.time.Instant;
12-
import java.util.Date;
1311
import java.util.Map;
1412

1513
@Data
@@ -33,7 +31,7 @@ public WebhookRecordType getRecordType() {
3331
private String tag;
3432

3533
@JsonProperty("DeliveredAt")
36-
@JsonDeserialize(using = PostmarkInstantDeserialzer.class)
34+
@JsonDeserialize(using = PostmarkInstantDeserializer.class)
3735
private Instant deliveredAt;
3836

3937
@JsonProperty("Details")

src/main/java/io/rocketbase/mail/dto/webhook/OpenWebhookMessage.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.rocketbase.mail.dto.webhook;
22

3-
import com.fasterxml.jackson.annotation.JsonFormat;
43
import com.fasterxml.jackson.annotation.JsonProperty;
54
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
65
import io.rocketbase.mail.dto.webhook.sub.Client;
@@ -12,7 +11,6 @@
1211
import lombok.NoArgsConstructor;
1312

1413
import java.time.Instant;
15-
import java.util.Date;
1614
import java.util.Map;
1715

1816
@Data
@@ -42,7 +40,7 @@ public WebhookRecordType getRecordType() {
4240
private Map<String, Object> metadata;
4341

4442
@JsonProperty("ReceivedAt")
45-
@JsonDeserialize(using = PostmarkInstantDeserialzer.class)
43+
@JsonDeserialize(using = PostmarkInstantDeserializer.class)
4644
private Instant receivedAt;
4745

4846
@JsonProperty("Client")

src/main/java/io/rocketbase/mail/dto/webhook/PostmarkInstantDeserialzer.java renamed to src/main/java/io/rocketbase/mail/dto/webhook/PostmarkInstantDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import java.time.Instant;
1010
import java.time.format.DateTimeParseException;
1111

12-
public class PostmarkInstantDeserialzer extends JsonDeserializer<Instant> {
12+
public class PostmarkInstantDeserializer extends JsonDeserializer<Instant> {
1313

1414
@Override
1515
public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

src/main/java/io/rocketbase/mail/dto/webhook/SpamComplaintWebhookMessage.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.rocketbase.mail.dto.webhook;
22

3-
import com.fasterxml.jackson.annotation.JsonFormat;
43
import com.fasterxml.jackson.annotation.JsonProperty;
54
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
65
import lombok.AllArgsConstructor;
@@ -9,7 +8,6 @@
98
import lombok.NoArgsConstructor;
109

1110
import java.time.Instant;
12-
import java.util.Date;
1311
import java.util.Map;
1412

1513
@Data
@@ -33,7 +31,7 @@ public WebhookRecordType getRecordType() {
3331
private String tag;
3432

3533
@JsonProperty("BouncedAt")
36-
@JsonDeserialize(using = PostmarkInstantDeserialzer.class)
34+
@JsonDeserialize(using = PostmarkInstantDeserializer.class)
3735
private Instant bouncedAt;
3836

3937
@JsonProperty("Subject")

0 commit comments

Comments
 (0)