Merge pull request #5065 from volodymyr-babak/mail-setting-fix
[3.3.0] Fixed fetch of admin settings
This commit is contained in:
commit
a9a864e81f
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package org.thingsboard.server.service.edge;
|
||||
|
||||
import freemarker.template.Configuration;
|
||||
import lombok.Data;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
@ -65,6 +66,9 @@ public class EdgeContextComponent {
|
||||
@Autowired
|
||||
private AdminSettingsService adminSettingsService;
|
||||
|
||||
@Autowired
|
||||
private Configuration freemarkerConfig;
|
||||
|
||||
@Autowired
|
||||
private AssetService assetService;
|
||||
|
||||
|
||||
@ -50,7 +50,7 @@ public class EdgeSyncCursor {
|
||||
fetchers.add(new CustomerEdgeEventFetcher());
|
||||
fetchers.add(new CustomerUsersEdgeEventFetcher(ctx.getUserService(), edge.getCustomerId()));
|
||||
}
|
||||
fetchers.add(new AdminSettingsEdgeEventFetcher(ctx.getAdminSettingsService()));
|
||||
fetchers.add(new AdminSettingsEdgeEventFetcher(ctx.getAdminSettingsService(), ctx.getFreemarkerConfig()));
|
||||
fetchers.add(new AssetsEdgeEventFetcher(ctx.getAssetService()));
|
||||
fetchers.add(new DashboardsEdgeEventFetcher(ctx.getDashboardService()));
|
||||
}
|
||||
|
||||
@ -19,12 +19,12 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import freemarker.template.Configuration;
|
||||
import freemarker.template.Template;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.text.WordUtils;
|
||||
import org.springframework.core.io.DefaultResourceLoader;
|
||||
import org.thingsboard.server.common.data.AdminSettings;
|
||||
import org.thingsboard.server.common.data.edge.Edge;
|
||||
import org.thingsboard.server.common.data.edge.EdgeEvent;
|
||||
@ -37,9 +37,8 @@ import org.thingsboard.server.common.data.page.PageLink;
|
||||
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
||||
import org.thingsboard.server.service.edge.rpc.EdgeEventUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -53,6 +52,23 @@ public class AdminSettingsEdgeEventFetcher implements EdgeEventFetcher {
|
||||
private static final ObjectMapper mapper = new ObjectMapper();
|
||||
|
||||
private final AdminSettingsService adminSettingsService;
|
||||
private final Configuration freemarkerConfig;
|
||||
|
||||
private static Pattern startPattern = Pattern.compile("<div class=\"content\".*?>");
|
||||
private static Pattern endPattern = Pattern.compile("<div class=\"footer\".*?>");
|
||||
|
||||
private static List<String> templatesNames = Arrays.asList(
|
||||
"account.activated.ftl",
|
||||
"account.lockout.ftl",
|
||||
"activation.ftl",
|
||||
"password.was.reset.ftl",
|
||||
"reset.password.ftl",
|
||||
"test.ftl");
|
||||
|
||||
// TODO: fix format of next templates
|
||||
// "state.disabled.ftl",
|
||||
// "state.enabled.ftl",
|
||||
// "state.warning.ftl",
|
||||
|
||||
@Override
|
||||
public PageLink getPageLink(int pageSize) {
|
||||
@ -85,23 +101,16 @@ public class AdminSettingsEdgeEventFetcher implements EdgeEventFetcher {
|
||||
|
||||
private AdminSettings loadMailTemplates() throws Exception {
|
||||
Map<String, Object> mailTemplates = new HashMap<>();
|
||||
Pattern startPattern = Pattern.compile("<div class=\"content\".*?>");
|
||||
Pattern endPattern = Pattern.compile("<div class=\"footer\".*?>");
|
||||
File[] files = new DefaultResourceLoader().getResource("classpath:/templates/").getFile().listFiles();
|
||||
for (File file : files) {
|
||||
Map<String, String> mailTemplate = new HashMap<>();
|
||||
String name = validateName(file.getName());
|
||||
String stringTemplate = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
|
||||
Matcher start = startPattern.matcher(stringTemplate);
|
||||
Matcher end = endPattern.matcher(stringTemplate);
|
||||
if (start.find() && end.find()) {
|
||||
String body = StringUtils.substringBetween(stringTemplate, start.group(), end.group()).replaceAll("\t", "");
|
||||
String subject = StringUtils.substringBetween(body, "<h2>", "</h2>");
|
||||
mailTemplate.put("subject", subject);
|
||||
mailTemplate.put("body", body);
|
||||
mailTemplates.put(name, mailTemplate);
|
||||
} else {
|
||||
log.error("Can't load mail template from file {}", file.getName());
|
||||
for (String templatesName : templatesNames) {
|
||||
Template template = freemarkerConfig.getTemplate(templatesName);
|
||||
if (template != null) {
|
||||
String name = validateName(template.getName());
|
||||
Map<String, String> mailTemplate = getMailTemplateFromFile(template.getRootTreeNode().toString());
|
||||
if (mailTemplate != null) {
|
||||
mailTemplates.put(name, mailTemplate);
|
||||
} else {
|
||||
log.error("Can't load mail template from file {}", template.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
AdminSettings adminSettings = new AdminSettings();
|
||||
@ -111,9 +120,24 @@ public class AdminSettingsEdgeEventFetcher implements EdgeEventFetcher {
|
||||
return adminSettings;
|
||||
}
|
||||
|
||||
private Map<String, String> getMailTemplateFromFile(String stringTemplate) {
|
||||
Map<String, String> mailTemplate = new HashMap<>();
|
||||
Matcher start = startPattern.matcher(stringTemplate);
|
||||
Matcher end = endPattern.matcher(stringTemplate);
|
||||
if (start.find() && end.find()) {
|
||||
String body = StringUtils.substringBetween(stringTemplate, start.group(), end.group()).replaceAll("\t", "");
|
||||
String subject = StringUtils.substringBetween(body, "<h2>", "</h2>");
|
||||
mailTemplate.put("subject", subject);
|
||||
mailTemplate.put("body", body);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return mailTemplate;
|
||||
}
|
||||
|
||||
private String validateName(String name) throws Exception {
|
||||
StringBuilder nameBuilder = new StringBuilder();
|
||||
name = name.replace(".vm", "");
|
||||
name = name.replace(".ftl", "");
|
||||
String[] nameParts = name.split("\\.");
|
||||
if (nameParts.length >= 1) {
|
||||
nameBuilder.append(nameParts[0]);
|
||||
|
||||
@ -37,6 +37,7 @@ import org.thingsboard.server.common.data.page.PageLink;
|
||||
import org.thingsboard.server.common.data.security.Authority;
|
||||
import org.thingsboard.server.dao.model.ModelConstants;
|
||||
import org.thingsboard.server.edge.imitator.EdgeImitator;
|
||||
import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg;
|
||||
@ -672,26 +673,26 @@ public abstract class BaseEdgeControllerTest extends AbstractControllerTest {
|
||||
EdgeImitator edgeImitator = new EdgeImitator("localhost", 7070, edge.getRoutingKey(), edge.getSecret());
|
||||
edgeImitator.ignoreType(UserCredentialsUpdateMsg.class);
|
||||
|
||||
edgeImitator.expectMessageAmount(7);
|
||||
edgeImitator.expectMessageAmount(11);
|
||||
edgeImitator.connect();
|
||||
Assert.assertTrue(edgeImitator.waitForMessages());
|
||||
|
||||
Assert.assertEquals(7, edgeImitator.getDownlinkMsgs().size());
|
||||
Assert.assertEquals(2, edgeImitator.findAllMessagesByType(RuleChainUpdateMsg.class).size()); // one msg during sync process, another from edge creation
|
||||
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(DeviceProfileUpdateMsg.class).size()); // one msg during sync process for 'default' device profile
|
||||
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(DeviceUpdateMsg.class).size()); // one msg once device assigned to edge
|
||||
Assert.assertEquals(2, edgeImitator.findAllMessagesByType(AssetUpdateMsg.class).size()); // two msgs - one during sync process, and one more once asset assigned to edge
|
||||
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(UserUpdateMsg.class).size()); // one msg during sync process for tenant admin user
|
||||
Assert.assertEquals(4, edgeImitator.findAllMessagesByType(AdminSettingsUpdateMsg.class).size());
|
||||
|
||||
edgeImitator.expectMessageAmount(4);
|
||||
edgeImitator.expectMessageAmount(8);
|
||||
doPost("/api/edge/sync/" + edge.getId());
|
||||
Assert.assertTrue(edgeImitator.waitForMessages());
|
||||
|
||||
Assert.assertEquals(4, edgeImitator.getDownlinkMsgs().size());
|
||||
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(RuleChainUpdateMsg.class).size());
|
||||
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(DeviceProfileUpdateMsg.class).size());
|
||||
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(AssetUpdateMsg.class).size());
|
||||
Assert.assertEquals(1, edgeImitator.findAllMessagesByType(UserUpdateMsg.class).size());
|
||||
Assert.assertEquals(4, edgeImitator.findAllMessagesByType(AdminSettingsUpdateMsg.class).size());
|
||||
|
||||
edgeImitator.allowIgnoredTypes();
|
||||
try {
|
||||
|
||||
@ -86,6 +86,7 @@ import org.thingsboard.server.common.transport.adaptor.JsonConverter;
|
||||
import org.thingsboard.server.controller.AbstractControllerTest;
|
||||
import org.thingsboard.server.dao.edge.EdgeEventService;
|
||||
import org.thingsboard.server.edge.imitator.EdgeImitator;
|
||||
import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AlarmUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AttributeDeleteMsg;
|
||||
@ -172,7 +173,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
|
||||
installation();
|
||||
|
||||
edgeImitator = new EdgeImitator("localhost", 7070, edge.getRoutingKey(), edge.getSecret());
|
||||
edgeImitator.expectMessageAmount(9);
|
||||
edgeImitator.expectMessageAmount(13);
|
||||
edgeImitator.connect();
|
||||
|
||||
testReceivedInitialData();
|
||||
@ -328,9 +329,44 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
|
||||
|
||||
testAutoGeneratedCodeByProtobuf(ruleChainUpdateMsg);
|
||||
|
||||
validateAdminSettings();
|
||||
|
||||
log.info("Received data checked");
|
||||
}
|
||||
|
||||
private void validateAdminSettings() throws JsonProcessingException {
|
||||
List<AdminSettingsUpdateMsg> adminSettingsUpdateMsgs = edgeImitator.findAllMessagesByType(AdminSettingsUpdateMsg.class);
|
||||
Assert.assertEquals(4, adminSettingsUpdateMsgs.size());
|
||||
|
||||
for (AdminSettingsUpdateMsg adminSettingsUpdateMsg : adminSettingsUpdateMsgs) {
|
||||
if (adminSettingsUpdateMsg.getKey().equals("mail")) {
|
||||
validateMailAdminSettings(adminSettingsUpdateMsg);
|
||||
}
|
||||
if (adminSettingsUpdateMsg.getKey().equals("mailTemplates")) {
|
||||
validateMailTemplatesAdminSettings(adminSettingsUpdateMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void validateMailAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) throws JsonProcessingException {
|
||||
JsonNode jsonNode = mapper.readTree(adminSettingsUpdateMsg.getJsonValue());
|
||||
Assert.assertNotNull(jsonNode.get("mailFrom"));
|
||||
Assert.assertNotNull(jsonNode.get("smtpProtocol"));
|
||||
Assert.assertNotNull(jsonNode.get("smtpHost"));
|
||||
Assert.assertNotNull(jsonNode.get("smtpPort"));
|
||||
Assert.assertNotNull(jsonNode.get("timeout"));
|
||||
}
|
||||
|
||||
private void validateMailTemplatesAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) throws JsonProcessingException {
|
||||
JsonNode jsonNode = mapper.readTree(adminSettingsUpdateMsg.getJsonValue());
|
||||
Assert.assertNotNull(jsonNode.get("accountActivated"));
|
||||
Assert.assertNotNull(jsonNode.get("accountLockout"));
|
||||
Assert.assertNotNull(jsonNode.get("activation"));
|
||||
Assert.assertNotNull(jsonNode.get("passwordWasReset"));
|
||||
Assert.assertNotNull(jsonNode.get("resetPassword"));
|
||||
Assert.assertNotNull(jsonNode.get("test"));
|
||||
}
|
||||
|
||||
private void testDevices() throws Exception {
|
||||
log.info("Testing devices");
|
||||
|
||||
|
||||
@ -26,6 +26,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.thingsboard.edge.rpc.EdgeGrpcClient;
|
||||
import org.thingsboard.edge.rpc.EdgeRpcClient;
|
||||
import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AlarmUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
|
||||
import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg;
|
||||
@ -167,6 +168,11 @@ public class EdgeImitator {
|
||||
|
||||
private ListenableFuture<List<Void>> processDownlinkMsg(DownlinkMsg downlinkMsg) {
|
||||
List<ListenableFuture<Void>> result = new ArrayList<>();
|
||||
if (downlinkMsg.getAdminSettingsUpdateMsgCount() > 0) {
|
||||
for (AdminSettingsUpdateMsg adminSettingsUpdateMsg : downlinkMsg.getAdminSettingsUpdateMsgList()) {
|
||||
result.add(saveDownlinkMsg(adminSettingsUpdateMsg));
|
||||
}
|
||||
}
|
||||
if (downlinkMsg.getDeviceUpdateMsgCount() > 0) {
|
||||
for (DeviceUpdateMsg deviceUpdateMsg : downlinkMsg.getDeviceUpdateMsgList()) {
|
||||
result.add(saveDownlinkMsg(deviceUpdateMsg));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user