Upload files to 'src/main/java/ca/mgamble/postman/api'
This commit is contained in:
parent
a44d9e4c19
commit
cfbe6e6cc8
204
src/main/java/ca/mgamble/postman/api/PostmanService.java
Normal file
204
src/main/java/ca/mgamble/postman/api/PostmanService.java
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mgamble
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2017 Matthew M. Gamble https://www.mgamble.ca
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ca.mgamble.postman.api;
|
||||||
|
|
||||||
|
|
||||||
|
import ca.mgamble.postman.api.message.PostmanMessage;
|
||||||
|
import ca.mgamble.postman.api.message.PostmanRawMessage;
|
||||||
|
import ca.mgamble.postman.api.message.PostmanRawMessageBuilder;
|
||||||
|
import ca.mgamble.postman.api.response.PostmanApiResponse;
|
||||||
|
import ca.mgamble.postman.api.utils.RawEmailUtils;
|
||||||
|
import ca.mgamble.postman.api.utils.StringEscapeUtils;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.asynchttpclient.AsyncHttpClient;
|
||||||
|
import org.asynchttpclient.DefaultAsyncHttpClient;
|
||||||
|
import org.asynchttpclient.Request;
|
||||||
|
import org.asynchttpclient.RequestBuilder;
|
||||||
|
import org.asynchttpclient.Response;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mgamble
|
||||||
|
*/
|
||||||
|
public class PostmanService implements Closeable {
|
||||||
|
|
||||||
|
private static final String JSON = "application/json";
|
||||||
|
private final AsyncHttpClient client;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private String apiKey;
|
||||||
|
|
||||||
|
private boolean closed = false;
|
||||||
|
private Gson gson = new GsonBuilder().serializeNulls().create();
|
||||||
|
private final RawEmailUtils rawEmailUtils;
|
||||||
|
|
||||||
|
public PostmanService() {
|
||||||
|
this.client = new DefaultAsyncHttpClient();
|
||||||
|
rawEmailUtils = new RawEmailUtils();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PostmanService(String url, String apiKey) {
|
||||||
|
this();
|
||||||
|
this.url = url;
|
||||||
|
this.apiKey = apiKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isClosed() {
|
||||||
|
return closed || client.isClosed();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
if (!client.isClosed()) {
|
||||||
|
try {
|
||||||
|
client.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
java.util.logging.Logger.getLogger(PostmanService.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PostmanApiResponse sendRawmessage(PostmanRawMessage message) throws Exception {
|
||||||
|
Future<Response> f = client.executeRequest(buildRequest("POST", "send/raw", gson.toJson(message)));
|
||||||
|
Response r = f.get();
|
||||||
|
if (r.getStatusCode() != 200) {
|
||||||
|
throw new Exception("Could not send raw message");
|
||||||
|
} else {
|
||||||
|
return gson.fromJson(r.getResponseBody(), PostmanApiResponse.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public PostmanApiResponse sendMessage(PostmanMessage message) throws Exception {
|
||||||
|
|
||||||
|
validateRecipientsMaxLength(message);
|
||||||
|
encodeAccentedCharactersFromMessage(message);
|
||||||
|
|
||||||
|
if (message.getEmbeddedImages() != null && message.getEmbeddedImages().size() > 0) {
|
||||||
|
return sendRawmessage(computeRawMessage(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Response> future = client.executeRequest(buildRequest("POST", "send/message", gson.toJson(message)));
|
||||||
|
Response response = future.get();
|
||||||
|
if (response.getStatusCode() != 200) {
|
||||||
|
throw new Exception("Could not send message, server responded with " + response.getStatusCode());
|
||||||
|
} else {
|
||||||
|
return gson.fromJson(response.getResponseBody(), PostmanApiResponse.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private PostmanRawMessage computeRawMessage(PostmanMessage message) throws IOException, MessagingException {
|
||||||
|
return new PostmanRawMessageBuilder()
|
||||||
|
.from(message.getFrom())
|
||||||
|
.tos(message.getTo())
|
||||||
|
.withData(rawEmailUtils.convertPostmanMessageToRawMessage(message))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateRecipientsMaxLength(PostmanMessage message) throws Exception {
|
||||||
|
if (message.getTo().size() > 50) {
|
||||||
|
throw new Exception("Too many recipients");
|
||||||
|
}
|
||||||
|
if (message.getCc().size() > 50) {
|
||||||
|
throw new Exception("Too many CC contacts");
|
||||||
|
}
|
||||||
|
if (message.getBcc().size() > 50) {
|
||||||
|
throw new Exception("Too many BCC contacts");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void encodeAccentedCharactersFromMessage(PostmanMessage message) {
|
||||||
|
if (message.getHtmlBody() != null) {
|
||||||
|
message.setHtmlBody(StringEscapeUtils.encodeHtml(message.getHtmlBody()));
|
||||||
|
}
|
||||||
|
if (message.getPlainBody() != null) {
|
||||||
|
message.setPlainBody(StringEscapeUtils.encodeHtml(message.getPlainBody()));
|
||||||
|
}
|
||||||
|
if (message.getSubject() != null) {
|
||||||
|
message.setSubject(StringEscapeUtils.encodeHtml(message.getSubject()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Request buildRequest(String type, String subUrl) {
|
||||||
|
validatePostmanParameters();
|
||||||
|
RequestBuilder builder = new RequestBuilder(type);
|
||||||
|
return builder.setUrl(this.url + "/api/v1/" + subUrl)
|
||||||
|
.addHeader("Accept", JSON)
|
||||||
|
.addHeader("Content-Type", JSON)
|
||||||
|
.addHeader("x-server-api-key", this.apiKey)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validatePostmanParameters() {
|
||||||
|
if (this.url == null) {
|
||||||
|
throw new RuntimeException("Postman URL can't be null");
|
||||||
|
}
|
||||||
|
if (!isValidURL(this.url)) {
|
||||||
|
throw new RuntimeException("URL format is incorrect.");
|
||||||
|
}
|
||||||
|
if (this.apiKey == null) {
|
||||||
|
throw new RuntimeException("Postman API Key can't be null");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidURL(String urlStr) {
|
||||||
|
try {
|
||||||
|
URL url = new URL(urlStr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (MalformedURLException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Request buildRequest(String type, String subUrl, String requestBody) {
|
||||||
|
validatePostmanParameters();
|
||||||
|
RequestBuilder builder = new RequestBuilder(type);
|
||||||
|
return builder.setUrl(this.url + "/api/v1/" + subUrl)
|
||||||
|
.addHeader("Accept", JSON)
|
||||||
|
.addHeader("Content-Type", JSON)
|
||||||
|
.addHeader("x-server-api-key", this.apiKey)
|
||||||
|
.setBody(requestBody)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user