Browse Source

Refactoring of MailService

pull/4884/head
Andrii Shvaika 5 years ago
parent
commit
6f67e72afd
  1. 33
      application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java
  2. 4
      rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/MailService.java
  3. 4
      rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbEmail.java
  4. 9
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java
  5. 15
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java
  6. 5
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java

33
application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java

@ -31,6 +31,7 @@ import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.thingsboard.rule.engine.api.MailService; import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.rule.engine.api.TbEmail;
import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.ApiFeature; import org.thingsboard.server.common.data.ApiFeature;
import org.thingsboard.server.common.data.ApiUsageRecordKey; import org.thingsboard.server.common.data.ApiUsageRecordKey;
@ -250,35 +251,35 @@ public class DefaultMailService implements MailService {
} }
@Override @Override
public void send(TenantId tenantId, CustomerId customerId, String from, String to, String cc, String bcc, String subject, String body, boolean isHtml, Map<String, String> images) throws ThingsboardException { public void send(TenantId tenantId, CustomerId customerId, TbEmail tbEmail) throws ThingsboardException {
sendMail(tenantId, customerId, from, to, cc, bcc, subject, body, isHtml, images, this.mailSender); sendMail(tenantId, customerId, tbEmail, this.mailSender);
} }
@Override @Override
public void send(TenantId tenantId, CustomerId customerId, String from, String to, String cc, String bcc, String subject, String body, boolean isHtml, Map<String, String> images, JavaMailSender javaMailSender) throws ThingsboardException { public void send(TenantId tenantId, CustomerId customerId, TbEmail tbEmail, JavaMailSender javaMailSender) throws ThingsboardException {
sendMail(tenantId, customerId, from, to, cc, bcc, subject, body, isHtml, images, javaMailSender); sendMail(tenantId, customerId, tbEmail, javaMailSender);
} }
private void sendMail(TenantId tenantId, CustomerId customerId, String from, String to, String cc, String bcc, String subject, String body, boolean isHtml, Map<String, String> images, JavaMailSender javaMailSender) throws ThingsboardException { private void sendMail(TenantId tenantId, CustomerId customerId, TbEmail tbEmail, JavaMailSender javaMailSender) throws ThingsboardException {
if (apiUsageStateService.getApiUsageState(tenantId).isEmailSendEnabled()) { if (apiUsageStateService.getApiUsageState(tenantId).isEmailSendEnabled()) {
try { try {
MimeMessage mailMsg = javaMailSender.createMimeMessage(); MimeMessage mailMsg = javaMailSender.createMimeMessage();
boolean multipart = (images != null && !images.isEmpty()); boolean multipart = (tbEmail.getImages() != null && !tbEmail.getImages().isEmpty());
MimeMessageHelper helper = new MimeMessageHelper(mailMsg, multipart, "UTF-8"); MimeMessageHelper helper = new MimeMessageHelper(mailMsg, multipart, "UTF-8");
helper.setFrom(StringUtils.isBlank(from) ? mailFrom : from); helper.setFrom(StringUtils.isBlank(tbEmail.getFrom()) ? mailFrom : tbEmail.getFrom());
helper.setTo(to.split("\\s*,\\s*")); helper.setTo(tbEmail.getTo().split("\\s*,\\s*"));
if (!StringUtils.isBlank(cc)) { if (!StringUtils.isBlank(tbEmail.getCc())) {
helper.setCc(cc.split("\\s*,\\s*")); helper.setCc(tbEmail.getCc().split("\\s*,\\s*"));
} }
if (!StringUtils.isBlank(bcc)) { if (!StringUtils.isBlank(tbEmail.getBcc())) {
helper.setBcc(bcc.split("\\s*,\\s*")); helper.setBcc(tbEmail.getBcc().split("\\s*,\\s*"));
} }
helper.setSubject(subject); helper.setSubject(tbEmail.getSubject());
helper.setText(body, isHtml); helper.setText(tbEmail.getBody(), tbEmail.isHtml());
if (multipart) { if (multipart) {
for (String imgId : images.keySet()) { for (String imgId : tbEmail.getImages().keySet()) {
String imgValue = images.get(imgId); String imgValue = tbEmail.getImages().get(imgId);
String value = imgValue.replaceFirst("^data:image/[^;]*;base64,?", ""); String value = imgValue.replaceFirst("^data:image/[^;]*;base64,?", "");
byte[] bytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(value); byte[] bytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(value);
String contentType = helper.getFileTypeMap().getContentType(imgId); String contentType = helper.getFileTypeMap().getContentType(imgId);

4
rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/MailService.java

@ -46,9 +46,9 @@ public interface MailService {
void sendAccountLockoutEmail(String lockoutEmail, String email, Integer maxFailedLoginAttempts) throws ThingsboardException; void sendAccountLockoutEmail(String lockoutEmail, String email, Integer maxFailedLoginAttempts) throws ThingsboardException;
void send(TenantId tenantId, CustomerId customerId, String from, String to, String cc, String bcc, String subject, String body, boolean isHtml, Map<String, String> images) throws ThingsboardException; void send(TenantId tenantId, CustomerId customerId, TbEmail tbEmail) throws ThingsboardException;
void send(TenantId tenantId, CustomerId customerId, String from, String to, String cc, String bcc, String subject, String body, boolean isHtml, Map<String, String> images, JavaMailSender javaMailSender) throws ThingsboardException; void send(TenantId tenantId, CustomerId customerId, TbEmail tbEmail, JavaMailSender javaMailSender) throws ThingsboardException;
void sendApiFeatureStateEmail(ApiFeature apiFeature, ApiUsageStateValue stateValue, String email, ApiUsageStateMailMessage msg) throws ThingsboardException; void sendApiFeatureStateEmail(ApiFeature apiFeature, ApiUsageStateValue stateValue, String email, ApiUsageStateMailMessage msg) throws ThingsboardException;

4
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/EmailPojo.java → rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbEmail.java

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.thingsboard.rule.engine.mail; package org.thingsboard.rule.engine.api;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -22,7 +22,7 @@ import java.util.Map;
@Data @Data
@Builder @Builder
class EmailPojo { public class TbEmail {
private final String from; private final String from;
private final String to; private final String to;

9
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java

@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.RuleNode;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbEmail;
import org.thingsboard.rule.engine.api.TbNode; import org.thingsboard.rule.engine.api.TbNode;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.api.TbNodeException;
@ -65,7 +66,7 @@ public class TbMsgToEmailNode implements TbNode {
@Override @Override
public void onMsg(TbContext ctx, TbMsg msg) { public void onMsg(TbContext ctx, TbMsg msg) {
try { try {
EmailPojo email = convert(msg); TbEmail email = convert(msg);
TbMsg emailMsg = buildEmailMsg(ctx, msg, email); TbMsg emailMsg = buildEmailMsg(ctx, msg, email);
ctx.tellNext(emailMsg, SUCCESS); ctx.tellNext(emailMsg, SUCCESS);
} catch (Exception ex) { } catch (Exception ex) {
@ -74,13 +75,13 @@ public class TbMsgToEmailNode implements TbNode {
} }
} }
private TbMsg buildEmailMsg(TbContext ctx, TbMsg msg, EmailPojo email) throws JsonProcessingException { private TbMsg buildEmailMsg(TbContext ctx, TbMsg msg, TbEmail email) throws JsonProcessingException {
String emailJson = MAPPER.writeValueAsString(email); String emailJson = MAPPER.writeValueAsString(email);
return ctx.transformMsg(msg, SEND_EMAIL_TYPE, msg.getOriginator(), msg.getMetaData().copy(), emailJson); return ctx.transformMsg(msg, SEND_EMAIL_TYPE, msg.getOriginator(), msg.getMetaData().copy(), emailJson);
} }
private EmailPojo convert(TbMsg msg) throws IOException { private TbEmail convert(TbMsg msg) throws IOException {
EmailPojo.EmailPojoBuilder builder = EmailPojo.builder(); TbEmail.TbEmailBuilder builder = TbEmail.builder();
builder.from(fromTemplate(this.config.getFromTemplate(), msg)); builder.from(fromTemplate(this.config.getFromTemplate(), msg));
builder.to(fromTemplate(this.config.getToTemplate(), msg)); builder.to(fromTemplate(this.config.getToTemplate(), msg));
builder.cc(fromTemplate(this.config.getCcTemplate(), msg)); builder.cc(fromTemplate(this.config.getCcTemplate(), msg));

15
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java

@ -21,6 +21,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.RuleNode;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbEmail;
import org.thingsboard.rule.engine.api.TbNode; import org.thingsboard.rule.engine.api.TbNode;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.api.TbNodeException;
@ -71,7 +72,7 @@ public class TbSendEmailNode implements TbNode {
public void onMsg(TbContext ctx, TbMsg msg) { public void onMsg(TbContext ctx, TbMsg msg) {
try { try {
validateType(msg.getType()); validateType(msg.getType());
EmailPojo email = getEmail(msg); TbEmail email = getEmail(msg);
withCallback(ctx.getMailExecutor().executeAsync(() -> { withCallback(ctx.getMailExecutor().executeAsync(() -> {
sendEmail(ctx, msg, email); sendEmail(ctx, msg, email);
return null; return null;
@ -83,18 +84,16 @@ public class TbSendEmailNode implements TbNode {
} }
} }
private void sendEmail(TbContext ctx, TbMsg msg, EmailPojo email) throws Exception { private void sendEmail(TbContext ctx, TbMsg msg, TbEmail email) throws Exception {
if (this.config.isUseSystemSmtpSettings()) { if (this.config.isUseSystemSmtpSettings()) {
ctx.getMailService().send(ctx.getTenantId(), msg.getCustomerId(), email.getFrom(), email.getTo(), email.getCc(), ctx.getMailService().send(ctx.getTenantId(), msg.getCustomerId(), email);
email.getBcc(), email.getSubject(), email.getBody(), email.isHtml(), email.getImages());
} else { } else {
ctx.getMailService().send(ctx.getTenantId(), msg.getCustomerId(), email.getFrom(), email.getTo(), email.getCc(), ctx.getMailService().send(ctx.getTenantId(), msg.getCustomerId(), email, this.mailSender);
email.getBcc(), email.getSubject(), email.getBody(), email.isHtml(), email.getImages(), this.mailSender);
} }
} }
private EmailPojo getEmail(TbMsg msg) throws IOException { private TbEmail getEmail(TbMsg msg) throws IOException {
EmailPojo email = MAPPER.readValue(msg.getData(), EmailPojo.class); TbEmail email = MAPPER.readValue(msg.getData(), TbEmail.class);
if (StringUtils.isBlank(email.getTo())) { if (StringUtils.isBlank(email.getTo())) {
throw new IllegalStateException("Email destination can not be blank [" + email.getTo() + "]"); throw new IllegalStateException("Email destination can not be blank [" + email.getTo() + "]");
} }

5
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java

@ -23,6 +23,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbEmail;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.api.TbNodeException;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
@ -79,9 +80,9 @@ public class TbMsgToEmailNodeTest {
assertEquals("oreo", metadataCaptor.getValue().getValue("username")); assertEquals("oreo", metadataCaptor.getValue().getValue("username"));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
EmailPojo actual = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), EmailPojo.class); TbEmail actual = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), TbEmail.class);
EmailPojo expected = new EmailPojo.EmailPojoBuilder() TbEmail expected = TbEmail.builder()
.from("test@mail.org") .from("test@mail.org")
.to("user@email.io") .to("user@email.io")
.subject("Hi oreo there") .subject("Hi oreo there")

Loading…
Cancel
Save