|
|
|
@ -18,7 +18,6 @@ package org.thingsboard.server.service.entitiy.user; |
|
|
|
import com.fasterxml.jackson.databind.JsonNode; |
|
|
|
import lombok.AllArgsConstructor; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.jetbrains.annotations.NotNull; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.thingsboard.common.util.JacksonUtil; |
|
|
|
import org.thingsboard.server.common.data.HasTitle; |
|
|
|
@ -32,12 +31,14 @@ import org.thingsboard.server.common.data.settings.StarredDashboardInfo; |
|
|
|
import org.thingsboard.server.common.data.settings.UserDashboardAction; |
|
|
|
import org.thingsboard.server.common.data.settings.UserDashboardsInfo; |
|
|
|
import org.thingsboard.server.common.data.settings.UserSettings; |
|
|
|
import org.thingsboard.server.common.data.settings.UserSettingsType; |
|
|
|
import org.thingsboard.server.dao.dashboard.DashboardService; |
|
|
|
import org.thingsboard.server.dao.user.UserSettingsService; |
|
|
|
import org.thingsboard.server.queue.util.TbCoreComponent; |
|
|
|
|
|
|
|
import java.util.Collections; |
|
|
|
import java.util.Comparator; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.HashSet; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Set; |
|
|
|
@ -64,48 +65,33 @@ public class DefaultTbUserSettingsService implements TbUserSettingsService { |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void updateUserSettings(TenantId tenantId, UserId userId, JsonNode settings) { |
|
|
|
updateUserSettings(tenantId, userId, UserSettings.GENERAL, settings); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void updateUserSettings(TenantId tenantId, UserId userId, String type, JsonNode settings) { |
|
|
|
public void updateUserSettings(TenantId tenantId, UserId userId, UserSettingsType type, JsonNode settings) { |
|
|
|
settingsService.updateUserSettings(tenantId, userId, type, settings); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public UserSettings findUserSettings(TenantId tenantId, UserId userId) { |
|
|
|
return findUserSettings(tenantId, userId, UserSettings.GENERAL); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public UserSettings findUserSettings(TenantId tenantId, UserId userId, String type) { |
|
|
|
public UserSettings findUserSettings(TenantId tenantId, UserId userId, UserSettingsType type) { |
|
|
|
return settingsService.findUserSettings(tenantId, userId, type); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void deleteUserSettings(TenantId tenantId, UserId userId, List<String> jsonPaths) { |
|
|
|
deleteUserSettings(tenantId, userId, UserSettings.GENERAL, jsonPaths); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void deleteUserSettings(TenantId tenantId, UserId userId, String type, List<String> jsonPaths) { |
|
|
|
public void deleteUserSettings(TenantId tenantId, UserId userId, UserSettingsType type, List<String> jsonPaths) { |
|
|
|
settingsService.deleteUserSettings(tenantId, userId, type, jsonPaths); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public UserDashboardsInfo findUserDashboardsInfo(TenantId tenantId, UserId id) { |
|
|
|
UserSettings us = findUserSettings(tenantId, id, UserSettings.STARRED_DASHBOARDS); |
|
|
|
UserSettings us = findUserSettings(tenantId, id, UserSettingsType.VISITED_DASHBOARDS); |
|
|
|
if (us == null) { |
|
|
|
return UserDashboardsInfo.EMPTY; |
|
|
|
} |
|
|
|
UserDashboardsInfo stored = JacksonUtil.convertValue(us.getSettings(), UserDashboardsInfo.class); |
|
|
|
return getUserDashboardsInfo(tenantId, stored); |
|
|
|
return refreshDashboardTitles(tenantId, stored); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public UserDashboardsInfo reportUserDashboardAction(TenantId tenantId, UserId id, DashboardId dashboardId, UserDashboardAction action) { |
|
|
|
UserSettings us = findUserSettings(tenantId, id, UserSettings.STARRED_DASHBOARDS); |
|
|
|
UserSettings us = findUserSettings(tenantId, id, UserSettingsType.VISITED_DASHBOARDS); |
|
|
|
UserDashboardsInfo stored = null; |
|
|
|
if (us != null) { |
|
|
|
stored = JacksonUtil.convertValue(us.getSettings(), UserDashboardsInfo.class); |
|
|
|
@ -126,24 +112,26 @@ public class DefaultTbUserSettingsService implements TbUserSettingsService { |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
stored = refreshDashboardTitles(tenantId, stored); |
|
|
|
|
|
|
|
us = new UserSettings(); |
|
|
|
us.setUserId(id); |
|
|
|
us.setType(UserSettings.STARRED_DASHBOARDS); |
|
|
|
us.setType(UserSettingsType.VISITED_DASHBOARDS); |
|
|
|
us.setSettings(JacksonUtil.valueToTree(stored)); |
|
|
|
saveUserSettings(tenantId, us); |
|
|
|
return getUserDashboardsInfo(tenantId, stored); |
|
|
|
return stored; |
|
|
|
} |
|
|
|
|
|
|
|
private void addToVisited(UserDashboardsInfo stored, DashboardId dashboardId) { |
|
|
|
UUID id = dashboardId.getId(); |
|
|
|
long ts = System.currentTimeMillis(); |
|
|
|
var opt = stored.getLast().stream().filter(d -> id.equals(d.getId())).findFirst(); |
|
|
|
var opt = stored.getLast().stream().filter(filterById(id)).findFirst(); |
|
|
|
if (opt.isPresent()) { |
|
|
|
opt.get().setLastVisited(ts); |
|
|
|
} else { |
|
|
|
var newInfo = new LastVisitedDashboardInfo(); |
|
|
|
newInfo.setId(id); |
|
|
|
newInfo.setStarred(stored.getStarred().stream().anyMatch(d -> id.equals(d.getId()))); |
|
|
|
newInfo.setStarred(stored.getStarred().stream().anyMatch(filterById(id))); |
|
|
|
newInfo.setLastVisited(System.currentTimeMillis()); |
|
|
|
stored.getLast().add(newInfo); |
|
|
|
} |
|
|
|
@ -155,14 +143,14 @@ public class DefaultTbUserSettingsService implements TbUserSettingsService { |
|
|
|
|
|
|
|
private void removeFromStarred(UserDashboardsInfo stored, DashboardId dashboardId) { |
|
|
|
UUID id = dashboardId.getId(); |
|
|
|
stored.getStarred().removeIf(d -> id.equals(d.getId())); |
|
|
|
stored.getStarred().removeIf(filterById(id)); |
|
|
|
stored.getLast().stream().filter(d -> id.equals(d.getId())).findFirst().ifPresent(d -> d.setStarred(false)); |
|
|
|
} |
|
|
|
|
|
|
|
private void addToStarred(UserDashboardsInfo stored, DashboardId dashboardId) { |
|
|
|
UUID id = dashboardId.getId(); |
|
|
|
long ts = System.currentTimeMillis(); |
|
|
|
var opt = stored.getStarred().stream().filter(d -> id.equals(d.getId())).findFirst(); |
|
|
|
var opt = stored.getStarred().stream().filter(filterById(id)).findFirst(); |
|
|
|
if (opt.isPresent()) { |
|
|
|
opt.get().setStarredAt(ts); |
|
|
|
} else { |
|
|
|
@ -180,31 +168,34 @@ public class DefaultTbUserSettingsService implements TbUserSettingsService { |
|
|
|
stored.getLast().forEach(d -> d.setStarred(starredMap.contains(d.getId()))); |
|
|
|
} |
|
|
|
|
|
|
|
private void setTitleIfEmpty(TenantId tenantId, AbstractUserDashboardInfo i) { |
|
|
|
if (StringUtils.isEmpty(i.getTitle())) { |
|
|
|
var dashboardInfo = dashboardService.findDashboardInfoById(tenantId, new DashboardId(i.getId())); |
|
|
|
i.setTitle(dashboardInfo != null ? dashboardInfo.getTitle() : null); |
|
|
|
} |
|
|
|
private Predicate<AbstractUserDashboardInfo> filterById(UUID id) { |
|
|
|
return d -> id.equals(d.getId()); |
|
|
|
} |
|
|
|
|
|
|
|
private UserDashboardsInfo getUserDashboardsInfo(TenantId tenantId, UserDashboardsInfo stored) { |
|
|
|
private UserDashboardsInfo refreshDashboardTitles(TenantId tenantId, UserDashboardsInfo stored) { |
|
|
|
if (stored == null) { |
|
|
|
return UserDashboardsInfo.EMPTY; |
|
|
|
} |
|
|
|
|
|
|
|
if (!stored.getLast().isEmpty()) { |
|
|
|
stored.getLast().forEach(i -> setTitleIfEmpty(tenantId, i)); |
|
|
|
stored.getLast().removeIf(EMPTY_TITLE); |
|
|
|
} |
|
|
|
if (!stored.getStarred().isEmpty()) { |
|
|
|
Map<UUID, LastVisitedDashboardInfo> lastMap = stored.getLast().stream().collect(Collectors.toMap(LastVisitedDashboardInfo::getId, Function.identity())); |
|
|
|
stored.getStarred().forEach(i -> { |
|
|
|
var last = lastMap.get(i.getId()); |
|
|
|
i.setTitle(last != null ? last.getTitle() : null); |
|
|
|
}); |
|
|
|
stored.getStarred().forEach(i -> setTitleIfEmpty(tenantId, i)); |
|
|
|
stored.getStarred().removeIf(EMPTY_TITLE); |
|
|
|
} |
|
|
|
stored.getLast().forEach(i -> i.setTitle(null)); |
|
|
|
stored.getStarred().forEach(i -> i.setTitle(null)); |
|
|
|
|
|
|
|
Set<UUID> uniqueIds = new HashSet<>(); |
|
|
|
stored.getLast().stream().map(AbstractUserDashboardInfo::getId).forEach(uniqueIds::add); |
|
|
|
stored.getStarred().stream().map(AbstractUserDashboardInfo::getId).forEach(uniqueIds::add); |
|
|
|
|
|
|
|
Map<UUID, String> dashboardTitles = new HashMap<>(); |
|
|
|
uniqueIds.forEach(id -> { |
|
|
|
var dashboardInfo = dashboardService.findDashboardInfoById(tenantId, new DashboardId(id)); |
|
|
|
if (dashboardInfo != null && StringUtils.isNotEmpty(dashboardInfo.getTitle())) { |
|
|
|
dashboardTitles.put(id, dashboardInfo.getTitle()); |
|
|
|
} |
|
|
|
} |
|
|
|
); |
|
|
|
|
|
|
|
stored.getLast().forEach(i -> i.setTitle(dashboardTitles.get(i.getId()))); |
|
|
|
stored.getLast().removeIf(EMPTY_TITLE); |
|
|
|
stored.getStarred().forEach(i -> i.setTitle(dashboardTitles.get(i.getId()))); |
|
|
|
stored.getStarred().removeIf(EMPTY_TITLE); |
|
|
|
return stored; |
|
|
|
} |
|
|
|
|
|
|
|
|