Merge branch 'develop/3.4' of github.com:thingsboard/thingsboard into bug/edge-push-to-rule-chain-node
This commit is contained in:
commit
9b104ba67e
@ -145,7 +145,7 @@ public class AlarmController extends BaseController {
|
|||||||
public Boolean deleteAlarm(@ApiParam(value = ALARM_ID_PARAM_DESCRIPTION) @PathVariable(ALARM_ID) String strAlarmId) throws ThingsboardException {
|
public Boolean deleteAlarm(@ApiParam(value = ALARM_ID_PARAM_DESCRIPTION) @PathVariable(ALARM_ID) String strAlarmId) throws ThingsboardException {
|
||||||
checkParameter(ALARM_ID, strAlarmId);
|
checkParameter(ALARM_ID, strAlarmId);
|
||||||
AlarmId alarmId = new AlarmId(toUUID(strAlarmId));
|
AlarmId alarmId = new AlarmId(toUUID(strAlarmId));
|
||||||
Alarm alarm = checkAlarmId(alarmId, Operation.WRITE);
|
Alarm alarm = checkAlarmId(alarmId, Operation.DELETE);
|
||||||
return tbAlarmService.delete(alarm, getCurrentUser());
|
return tbAlarmService.delete(alarm, getCurrentUser());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2022 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.controller;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.Futures;
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.thingsboard.server.common.data.User;
|
||||||
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
|
import org.thingsboard.server.service.sync.vc.EntitiesVersionControlService;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class AutoCommitController extends BaseController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private EntitiesVersionControlService vcService;
|
||||||
|
|
||||||
|
protected ListenableFuture<UUID> autoCommit(User user, EntityId entityId) throws Exception {
|
||||||
|
if (vcService != null) {
|
||||||
|
return vcService.autoCommit(user, entityId);
|
||||||
|
} else {
|
||||||
|
// We do not support auto-commit for rule engine
|
||||||
|
return Futures.immediateFailedFuture(new RuntimeException("Operation not supported!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -139,7 +139,7 @@ public class EntityViewController extends BaseController {
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public EntityView saveEntityView(
|
public EntityView saveEntityView(
|
||||||
@ApiParam(value = "A JSON object representing the entity view.")
|
@ApiParam(value = "A JSON object representing the entity view.")
|
||||||
@RequestBody EntityView entityView) throws ThingsboardException {
|
@RequestBody EntityView entityView) throws Exception {
|
||||||
entityView.setTenantId(getCurrentUser().getTenantId());
|
entityView.setTenantId(getCurrentUser().getTenantId());
|
||||||
EntityView existingEntityView = null;
|
EntityView existingEntityView = null;
|
||||||
if (entityView.getId() == null) {
|
if (entityView.getId() == null) {
|
||||||
|
|||||||
@ -36,6 +36,7 @@ import org.thingsboard.server.common.data.security.Authority;
|
|||||||
import org.thingsboard.server.common.data.widget.WidgetType;
|
import org.thingsboard.server.common.data.widget.WidgetType;
|
||||||
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
|
||||||
import org.thingsboard.server.common.data.widget.WidgetTypeInfo;
|
import org.thingsboard.server.common.data.widget.WidgetTypeInfo;
|
||||||
|
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
||||||
import org.thingsboard.server.dao.model.ModelConstants;
|
import org.thingsboard.server.dao.model.ModelConstants;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
import org.thingsboard.server.service.security.permission.Operation;
|
import org.thingsboard.server.service.security.permission.Operation;
|
||||||
@ -52,7 +53,7 @@ import static org.thingsboard.server.controller.ControllerConstants.WIDGET_TYPE_
|
|||||||
@RestController
|
@RestController
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
@RequestMapping("/api")
|
@RequestMapping("/api")
|
||||||
public class WidgetTypeController extends BaseController {
|
public class WidgetTypeController extends AutoCommitController {
|
||||||
|
|
||||||
private static final String WIDGET_TYPE_DESCRIPTION = "Widget Type represents the template for widget creation. Widget Type and Widget are similar to class and object in OOP theory.";
|
private static final String WIDGET_TYPE_DESCRIPTION = "Widget Type represents the template for widget creation. Widget Type and Widget are similar to class and object in OOP theory.";
|
||||||
private static final String WIDGET_TYPE_DETAILS_DESCRIPTION = "Widget Type Details extend Widget Type and add image and description properties. " +
|
private static final String WIDGET_TYPE_DETAILS_DESCRIPTION = "Widget Type Details extend Widget Type and add image and description properties. " +
|
||||||
@ -93,15 +94,23 @@ public class WidgetTypeController extends BaseController {
|
|||||||
@ApiParam(value = "A JSON value representing the Widget Type Details.", required = true)
|
@ApiParam(value = "A JSON value representing the Widget Type Details.", required = true)
|
||||||
@RequestBody WidgetTypeDetails widgetTypeDetails) throws ThingsboardException {
|
@RequestBody WidgetTypeDetails widgetTypeDetails) throws ThingsboardException {
|
||||||
try {
|
try {
|
||||||
if (Authority.SYS_ADMIN.equals(getCurrentUser().getAuthority())) {
|
var currentUser = getCurrentUser();
|
||||||
|
if (Authority.SYS_ADMIN.equals(currentUser.getAuthority())) {
|
||||||
widgetTypeDetails.setTenantId(TenantId.SYS_TENANT_ID);
|
widgetTypeDetails.setTenantId(TenantId.SYS_TENANT_ID);
|
||||||
} else {
|
} else {
|
||||||
widgetTypeDetails.setTenantId(getCurrentUser().getTenantId());
|
widgetTypeDetails.setTenantId(currentUser.getTenantId());
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEntity(widgetTypeDetails.getId(), widgetTypeDetails, Resource.WIDGET_TYPE);
|
checkEntity(widgetTypeDetails.getId(), widgetTypeDetails, Resource.WIDGET_TYPE);
|
||||||
WidgetTypeDetails savedWidgetTypeDetails = widgetTypeService.saveWidgetType(widgetTypeDetails);
|
WidgetTypeDetails savedWidgetTypeDetails = widgetTypeService.saveWidgetType(widgetTypeDetails);
|
||||||
|
|
||||||
|
if (!Authority.SYS_ADMIN.equals(currentUser.getAuthority())) {
|
||||||
|
WidgetsBundle widgetsBundle = widgetsBundleService.findWidgetsBundleByTenantIdAndAlias(widgetTypeDetails.getTenantId(), widgetTypeDetails.getBundleAlias());
|
||||||
|
if (widgetsBundle != null) {
|
||||||
|
autoCommit(currentUser, widgetsBundle.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sendEntityNotificationMsg(getTenantId(), savedWidgetTypeDetails.getId(),
|
sendEntityNotificationMsg(getTenantId(), savedWidgetTypeDetails.getId(),
|
||||||
widgetTypeDetails.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
|
widgetTypeDetails.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
|
||||||
|
|
||||||
@ -121,9 +130,17 @@ public class WidgetTypeController extends BaseController {
|
|||||||
@PathVariable("widgetTypeId") String strWidgetTypeId) throws ThingsboardException {
|
@PathVariable("widgetTypeId") String strWidgetTypeId) throws ThingsboardException {
|
||||||
checkParameter("widgetTypeId", strWidgetTypeId);
|
checkParameter("widgetTypeId", strWidgetTypeId);
|
||||||
try {
|
try {
|
||||||
|
var currentUser = getCurrentUser();
|
||||||
WidgetTypeId widgetTypeId = new WidgetTypeId(toUUID(strWidgetTypeId));
|
WidgetTypeId widgetTypeId = new WidgetTypeId(toUUID(strWidgetTypeId));
|
||||||
checkWidgetTypeId(widgetTypeId, Operation.DELETE);
|
WidgetTypeDetails wtd = checkWidgetTypeId(widgetTypeId, Operation.DELETE);
|
||||||
widgetTypeService.deleteWidgetType(getCurrentUser().getTenantId(), widgetTypeId);
|
widgetTypeService.deleteWidgetType(currentUser.getTenantId(), widgetTypeId);
|
||||||
|
|
||||||
|
if (wtd != null && !Authority.SYS_ADMIN.equals(currentUser.getAuthority())) {
|
||||||
|
WidgetsBundle widgetsBundle = widgetsBundleService.findWidgetsBundleByTenantIdAndAlias(wtd.getTenantId(), wtd.getBundleAlias());
|
||||||
|
if (widgetsBundle != null) {
|
||||||
|
autoCommit(currentUser, widgetsBundle.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sendEntityNotificationMsg(getTenantId(), widgetTypeId, EdgeEventActionType.DELETED);
|
sendEntityNotificationMsg(getTenantId(), widgetTypeId, EdgeEventActionType.DELETED);
|
||||||
|
|
||||||
|
|||||||
@ -96,16 +96,17 @@ public class WidgetsBundleController extends BaseController {
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public WidgetsBundle saveWidgetsBundle(
|
public WidgetsBundle saveWidgetsBundle(
|
||||||
@ApiParam(value = "A JSON value representing the Widget Bundle.", required = true)
|
@ApiParam(value = "A JSON value representing the Widget Bundle.", required = true)
|
||||||
@RequestBody WidgetsBundle widgetsBundle) throws ThingsboardException {
|
@RequestBody WidgetsBundle widgetsBundle) throws Exception {
|
||||||
if (Authority.SYS_ADMIN.equals(getCurrentUser().getAuthority())) {
|
var currentUser = getCurrentUser();
|
||||||
|
if (Authority.SYS_ADMIN.equals(currentUser.getAuthority())) {
|
||||||
widgetsBundle.setTenantId(TenantId.SYS_TENANT_ID);
|
widgetsBundle.setTenantId(TenantId.SYS_TENANT_ID);
|
||||||
} else {
|
} else {
|
||||||
widgetsBundle.setTenantId(getCurrentUser().getTenantId());
|
widgetsBundle.setTenantId(currentUser.getTenantId());
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEntity(widgetsBundle.getId(), widgetsBundle, Resource.WIDGETS_BUNDLE);
|
checkEntity(widgetsBundle.getId(), widgetsBundle, Resource.WIDGETS_BUNDLE);
|
||||||
|
|
||||||
return tbWidgetsBundleService.save(widgetsBundle);
|
return tbWidgetsBundleService.save(widgetsBundle, currentUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "Delete widgets bundle (deleteWidgetsBundle)",
|
@ApiOperation(value = "Delete widgets bundle (deleteWidgetsBundle)",
|
||||||
|
|||||||
@ -141,4 +141,13 @@ public abstract class AbstractTbEntityService {
|
|||||||
return Futures.immediateFailedFuture(new RuntimeException("Operation not supported!"));
|
return Futures.immediateFailedFuture(new RuntimeException("Operation not supported!"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected ListenableFuture<UUID> autoCommit(User user, EntityType entityType, List<UUID> entityIds) throws Exception {
|
||||||
|
if (vcService != null) {
|
||||||
|
return vcService.autoCommit(user, entityType, entityIds);
|
||||||
|
} else {
|
||||||
|
// We do not support auto-commit for rule engine
|
||||||
|
return Futures.immediateFailedFuture(new RuntimeException("Operation not supported!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,12 +74,13 @@ public class DefaultTbEntityViewService extends AbstractTbEntityService implemen
|
|||||||
final Map<TenantId, Map<EntityId, List<EntityView>>> localCache = new ConcurrentHashMap<>();
|
final Map<TenantId, Map<EntityId, List<EntityView>>> localCache = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EntityView save(EntityView entityView, EntityView existingEntityView, User user) throws ThingsboardException {
|
public EntityView save(EntityView entityView, EntityView existingEntityView, User user) throws Exception {
|
||||||
ActionType actionType = entityView.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
ActionType actionType = entityView.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
||||||
TenantId tenantId = entityView.getTenantId();
|
TenantId tenantId = entityView.getTenantId();
|
||||||
try {
|
try {
|
||||||
EntityView savedEntityView = checkNotNull(entityViewService.saveEntityView(entityView));
|
EntityView savedEntityView = checkNotNull(entityViewService.saveEntityView(entityView));
|
||||||
this.updateEntityViewAttributes(tenantId, savedEntityView, existingEntityView, user);
|
this.updateEntityViewAttributes(tenantId, savedEntityView, existingEntityView, user);
|
||||||
|
autoCommit(user, savedEntityView.getId());
|
||||||
notificationEntityService.notifyCreateOrUpdateEntity(savedEntityView.getTenantId(), savedEntityView.getId(), savedEntityView,
|
notificationEntityService.notifyCreateOrUpdateEntity(savedEntityView.getTenantId(), savedEntityView.getId(), savedEntityView,
|
||||||
null, actionType, user);
|
null, actionType, user);
|
||||||
localCache.computeIfAbsent(savedEntityView.getTenantId(), (k) -> new ConcurrentReferenceHashMap<>()).clear();
|
localCache.computeIfAbsent(savedEntityView.getTenantId(), (k) -> new ConcurrentReferenceHashMap<>()).clear();
|
||||||
|
|||||||
@ -31,7 +31,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public interface TbEntityViewService extends ComponentLifecycleListener {
|
public interface TbEntityViewService extends ComponentLifecycleListener {
|
||||||
|
|
||||||
EntityView save(EntityView entityView, EntityView existingEntityView, User user) throws ThingsboardException;
|
EntityView save(EntityView entityView, EntityView existingEntityView, User user) throws Exception;
|
||||||
|
|
||||||
void updateEntityViewAttributes(TenantId tenantId, EntityView savedEntityView, EntityView oldEntityView, User user) throws ThingsboardException;
|
void updateEntityViewAttributes(TenantId tenantId, EntityView savedEntityView, EntityView oldEntityView, User user) throws ThingsboardException;
|
||||||
|
|
||||||
|
|||||||
@ -17,6 +17,7 @@ package org.thingsboard.server.service.entitiy.widgets.bundle;
|
|||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
||||||
@ -32,8 +33,9 @@ public class DefaultWidgetsBundleService extends AbstractTbEntityService impleme
|
|||||||
private final WidgetsBundleService widgetsBundleService;
|
private final WidgetsBundleService widgetsBundleService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WidgetsBundle save(WidgetsBundle widgetsBundle) throws ThingsboardException {
|
public WidgetsBundle save(WidgetsBundle widgetsBundle, User user) throws Exception {
|
||||||
WidgetsBundle savedWidgetsBundle = checkNotNull(widgetsBundleService.saveWidgetsBundle(widgetsBundle));
|
WidgetsBundle savedWidgetsBundle = checkNotNull(widgetsBundleService.saveWidgetsBundle(widgetsBundle));
|
||||||
|
autoCommit(user, savedWidgetsBundle.getId());
|
||||||
notificationEntityService.notifySendMsgToEdgeService(widgetsBundle.getTenantId(), savedWidgetsBundle.getId(),
|
notificationEntityService.notifySendMsgToEdgeService(widgetsBundle.getTenantId(), savedWidgetsBundle.getId(),
|
||||||
widgetsBundle.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
|
widgetsBundle.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
|
||||||
return savedWidgetsBundle;
|
return savedWidgetsBundle;
|
||||||
|
|||||||
@ -15,11 +15,13 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.entitiy.widgets.bundle;
|
package org.thingsboard.server.service.entitiy.widgets.bundle;
|
||||||
|
|
||||||
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
import org.thingsboard.server.common.data.widget.WidgetsBundle;
|
||||||
|
|
||||||
public interface TbWidgetsBundleService {
|
public interface TbWidgetsBundleService {
|
||||||
WidgetsBundle save(WidgetsBundle entity) throws ThingsboardException;
|
|
||||||
|
WidgetsBundle save(WidgetsBundle entity, User currentUser) throws Exception;
|
||||||
|
|
||||||
void delete(WidgetsBundle entity) throws ThingsboardException;
|
void delete(WidgetsBundle entity) throws ThingsboardException;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -176,7 +176,7 @@ public class DefaultTbRuleChainService extends AbstractTbEntityService implement
|
|||||||
ActionType actionType = ruleChain.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
ActionType actionType = ruleChain.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
||||||
try {
|
try {
|
||||||
RuleChain savedRuleChain = checkNotNull(ruleChainService.saveRuleChain(ruleChain));
|
RuleChain savedRuleChain = checkNotNull(ruleChainService.saveRuleChain(ruleChain));
|
||||||
vcService.autoCommit(user, savedRuleChain.getId());
|
autoCommit(user, savedRuleChain.getId());
|
||||||
|
|
||||||
if (RuleChainType.CORE.equals(savedRuleChain.getType())) {
|
if (RuleChainType.CORE.equals(savedRuleChain.getType())) {
|
||||||
tbClusterService.broadcastEntityStateChangeEvent(tenantId, savedRuleChain.getId(),
|
tbClusterService.broadcastEntityStateChangeEvent(tenantId, savedRuleChain.getId(),
|
||||||
@ -229,7 +229,7 @@ public class DefaultTbRuleChainService extends AbstractTbEntityService implement
|
|||||||
public RuleChain saveDefaultByName(TenantId tenantId, DefaultRuleChainCreateRequest request, User user) throws Exception {
|
public RuleChain saveDefaultByName(TenantId tenantId, DefaultRuleChainCreateRequest request, User user) throws Exception {
|
||||||
try {
|
try {
|
||||||
RuleChain savedRuleChain = installScripts.createDefaultRuleChain(tenantId, request.getName());
|
RuleChain savedRuleChain = installScripts.createDefaultRuleChain(tenantId, request.getName());
|
||||||
vcService.autoCommit(user, savedRuleChain.getId());
|
autoCommit(user, savedRuleChain.getId());
|
||||||
tbClusterService.broadcastEntityStateChangeEvent(tenantId, savedRuleChain.getId(), ComponentLifecycleEvent.CREATED);
|
tbClusterService.broadcastEntityStateChangeEvent(tenantId, savedRuleChain.getId(), ComponentLifecycleEvent.CREATED);
|
||||||
notificationEntityService.logEntityAction(tenantId, savedRuleChain.getId(), savedRuleChain, ActionType.ADDED, user);
|
notificationEntityService.logEntityAction(tenantId, savedRuleChain.getId(), savedRuleChain, ActionType.ADDED, user);
|
||||||
return savedRuleChain;
|
return savedRuleChain;
|
||||||
@ -288,12 +288,12 @@ public class DefaultTbRuleChainService extends AbstractTbEntityService implement
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (updatedRuleChains.isEmpty()) {
|
if (updatedRuleChains.isEmpty()) {
|
||||||
vcService.autoCommit(user, ruleChainMetaData.getRuleChainId());
|
autoCommit(user, ruleChainMetaData.getRuleChainId());
|
||||||
} else {
|
} else {
|
||||||
List<UUID> uuids = new ArrayList<>(updatedRuleChains.size() + 1);
|
List<UUID> uuids = new ArrayList<>(updatedRuleChains.size() + 1);
|
||||||
uuids.add(ruleChainMetaData.getRuleChainId().getId());
|
uuids.add(ruleChainMetaData.getRuleChainId().getId());
|
||||||
updatedRuleChains.forEach(rc -> uuids.add(rc.getId().getId()));
|
updatedRuleChains.forEach(rc -> uuids.add(rc.getId().getId()));
|
||||||
vcService.autoCommit(user, EntityType.RULE_CHAIN, uuids);
|
autoCommit(user, EntityType.RULE_CHAIN, uuids);
|
||||||
}
|
}
|
||||||
|
|
||||||
RuleChainMetaData savedRuleChainMetaData = checkNotNull(ruleChainService.loadRuleChainMetaData(tenantId, ruleChainMetaDataId));
|
RuleChainMetaData savedRuleChainMetaData = checkNotNull(ruleChainService.loadRuleChainMetaData(tenantId, ruleChainMetaDataId));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user