Browse Source

Minor code review improvements

feature/user-settings
Andrii Shvaika 4 years ago
parent
commit
b92fa8ce5d
  1. 17
      application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java
  2. 9
      common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserSettingsService.java
  3. 49
      dao/src/main/java/org/thingsboard/server/dao/user/UserSettingsServiceImpl.java

17
application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java

@ -765,9 +765,24 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
JsonNode newSettings = mapper.readTree("{\"A\":10, \"B\":10, \"C\":{\"D\": 16}}");
JsonNode updatedSettings = doPut("/api/user/settings", newSettings, JsonNode.class);
JsonNode expectedSettings = mapper.readTree("{\"A\":10, \"B\":10, \"C\":{\"D\": 16}, \"E\":18}");
Assert.assertEquals(expectedSettings, updatedSettings);
JsonNode patchedSettings = mapper.readTree("\"C\":{\"E\": 22}}");
updatedSettings = doPut("/api/user/settings", patchedSettings, JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":10, \"B\":10, \"C\":{\"E\": 22}, \"E\":18}");
Assert.assertEquals(expectedSettings, updatedSettings);
patchedSettings = mapper.readTree("\"C.D\": 16}}");
updatedSettings = doPut("/api/user/settings", patchedSettings, JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":10, \"B\":10, \"C\":{\"D\": 16, \"E\": 22}, \"E\":18}");
Assert.assertEquals(expectedSettings, updatedSettings);
patchedSettings = mapper.readTree("\"C.D\": {\"A\":5}}}");
updatedSettings = doPut("/api/user/settings", patchedSettings, JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":10, \"B\":10, \"C\":{\"D\": {\"A\":5}, \"E\": 22}, \"E\":18}");
Assert.assertEquals(expectedSettings, updatedSettings);
}
@Test

9
common/dao-api/src/main/java/org/thingsboard/server/dao/user/UserSettingsService.java

@ -15,18 +15,9 @@
*/
package org.thingsboard.server.dao.user;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserCredentialsId;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.common.data.security.UserSettings;
import org.thingsboard.server.dao.entity.EntityDaoService;
import java.util.List;

49
dao/src/main/java/org/thingsboard/server/dao/user/UserSettingsServiceImpl.java

@ -24,6 +24,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.event.TransactionalEventListener;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.security.UserSettings;
@ -46,14 +47,7 @@ public class UserSettingsServiceImpl extends AbstractCachedService<UserId, UserS
public UserSettings saveUserSettings(TenantId tenantId, UserSettings userSettings) {
log.trace("Executing saveUserSettings for user [{}], [{}]", userSettings.getUserId(), userSettings);
validateId(userSettings.getUserId(), INCORRECT_USER_ID + userSettings.getUserId());
try {
UserSettings saved = userSettingsDao.save(tenantId, userSettings);
publishEvictEvent(new UserSettingsEvictEvent(userSettings.getUserId()));
return saved;
} catch (Exception t) {
handleEvictEvent(new UserSettingsEvictEvent(userSettings.getUserId()));
throw t;
}
return doSaveUserSettings(tenantId, userSettings);
}
@Override
@ -61,16 +55,9 @@ public class UserSettingsServiceImpl extends AbstractCachedService<UserId, UserS
log.trace("Executing updateUserSettings for user [{}], [{}]", userSettings.getUserId(), userSettings);
validateId(userSettings.getUserId(), INCORRECT_USER_ID + userSettings.getUserId());
UserSettings oldSettings = userSettingsDao.findById(tenantId, userSettings.getUserId());
userSettings.setSettings(merge(oldSettings.getSettings(), userSettings.getSettings()));
try {
UserSettings saved = userSettingsDao.save(tenantId, userSettings);
publishEvictEvent(new UserSettingsEvictEvent(userSettings.getUserId()));
return saved;
} catch (Exception t) {
handleEvictEvent(new UserSettingsEvictEvent(userSettings.getUserId()));
throw t;
}
JsonNode oldSettingsJson = oldSettings != null ? oldSettings.getSettings() : JacksonUtil.newObjectNode();
userSettings.setSettings(merge(oldSettingsJson, userSettings.getSettings()));
return doSaveUserSettings(tenantId, userSettings);
}
@Override
@ -83,22 +70,36 @@ public class UserSettingsServiceImpl extends AbstractCachedService<UserId, UserS
}
@Override
public void deleteUserSettings(TenantId tenantId, UserId userId, List<String> jsonPaths) {
public void deleteUserSettings(TenantId tenantId, UserId userId, List<String> jsonPaths) {
log.trace("Executing deleteUserSettings for user [{}]", userId);
validateId(userId, INCORRECT_USER_ID + userId);
UserSettings userSettings = userSettingsDao.findById(tenantId, userId);
DocumentContext docSettings = JsonPath.parse(userSettings.getSettings().toString());
if (userSettings == null) {
return;
}
try {
DocumentContext docSettings = JsonPath.parse(userSettings.getSettings().toString());
for (String s : jsonPaths) {
docSettings = docSettings.delete("$." + s);
}
userSettings.setSettings(new ObjectMapper().readValue(docSettings.jsonString(), ObjectNode.class));
userSettingsDao.save(tenantId, userSettings);
publishEvictEvent(new UserSettingsEvictEvent(userSettings.getUserId()));
} catch (Exception t) {
handleEvictEvent(new UserSettingsEvictEvent(userSettings.getUserId()));
throw new RuntimeException(t);
}
doSaveUserSettings(tenantId, userSettings);
}
private UserSettings doSaveUserSettings(TenantId tenantId, UserSettings userSettings) {
try {
//TODO: add validation for "." and ",";
UserSettings saved = userSettingsDao.save(tenantId, userSettings);
publishEvictEvent(new UserSettingsEvictEvent(userSettings.getUserId()));
return saved;
} catch (Exception t) {
handleEvictEvent(new UserSettingsEvictEvent(userSettings.getUserId()));
throw t;
}
}
@TransactionalEventListener(classes = UserSettingsEvictEvent.class)
@ -110,15 +111,13 @@ public class UserSettingsServiceImpl extends AbstractCachedService<UserId, UserS
}
public JsonNode merge(JsonNode mainNode, JsonNode updateNode) {
Iterator<String> fieldNames = updateNode.fieldNames();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
JsonNode jsonNode = mainNode.get(fieldName);
if (jsonNode != null && jsonNode.isObject()) {
merge(jsonNode, updateNode.get(fieldName));
}
else {
} else {
if (mainNode instanceof ObjectNode) {
JsonNode value = updateNode.get(fieldName);
((ObjectNode) mainNode).set(fieldName, value);

Loading…
Cancel
Save