Merge branch 'develop/3.4' into bug/cache-issues
This commit is contained in:
commit
d1c1b70578
@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import io.swagger.annotations.ApiParam;
|
import io.swagger.annotations.ApiParam;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
@ -33,7 +34,6 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
import org.thingsboard.server.common.data.Customer;
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
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.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
@ -42,6 +42,7 @@ import org.thingsboard.server.common.data.page.PageData;
|
|||||||
import org.thingsboard.server.common.data.page.PageLink;
|
import org.thingsboard.server.common.data.page.PageLink;
|
||||||
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
|
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
import org.thingsboard.server.service.entitiy.customer.TbCustomerService;
|
||||||
import org.thingsboard.server.service.security.permission.Operation;
|
import org.thingsboard.server.service.security.permission.Operation;
|
||||||
import org.thingsboard.server.service.security.permission.Resource;
|
import org.thingsboard.server.service.security.permission.Resource;
|
||||||
|
|
||||||
@ -64,9 +65,12 @@ import static org.thingsboard.server.controller.ControllerConstants.UUID_WIKI_LI
|
|||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
|
@RequiredArgsConstructor
|
||||||
@RequestMapping("/api")
|
@RequestMapping("/api")
|
||||||
public class CustomerController extends BaseController {
|
public class CustomerController extends BaseController {
|
||||||
|
|
||||||
|
private final TbCustomerService tbCustomerService;
|
||||||
|
|
||||||
public static final String IS_PUBLIC = "isPublic";
|
public static final String IS_PUBLIC = "isPublic";
|
||||||
public static final String CUSTOMER_SECURITY_CHECK = "If the user has the authority of 'Tenant Administrator', the server checks that the customer is owned by the same tenant. " +
|
public static final String CUSTOMER_SECURITY_CHECK = "If the user has the authority of 'Tenant Administrator', the server checks that the customer is owned by the same tenant. " +
|
||||||
"If the user has the authority of 'Customer User', the server checks that the user belongs to the customer.";
|
"If the user has the authority of 'Customer User', the server checks that the user belongs to the customer.";
|
||||||
@ -145,29 +149,9 @@ public class CustomerController extends BaseController {
|
|||||||
@RequestMapping(value = "/customer", method = RequestMethod.POST)
|
@RequestMapping(value = "/customer", method = RequestMethod.POST)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Customer saveCustomer(@ApiParam(value = "A JSON value representing the customer.") @RequestBody Customer customer) throws ThingsboardException {
|
public Customer saveCustomer(@ApiParam(value = "A JSON value representing the customer.") @RequestBody Customer customer) throws ThingsboardException {
|
||||||
try {
|
|
||||||
customer.setTenantId(getCurrentUser().getTenantId());
|
customer.setTenantId(getCurrentUser().getTenantId());
|
||||||
|
|
||||||
checkEntity(customer.getId(), customer, Resource.CUSTOMER);
|
checkEntity(customer.getId(), customer, Resource.CUSTOMER);
|
||||||
|
return tbCustomerService.save(customer, getCurrentUser());
|
||||||
Customer savedCustomer = checkNotNull(customerService.saveCustomer(customer));
|
|
||||||
|
|
||||||
logEntityAction(savedCustomer.getId(), savedCustomer,
|
|
||||||
savedCustomer.getId(),
|
|
||||||
customer.getId() == null ? ActionType.ADDED : ActionType.UPDATED, null);
|
|
||||||
|
|
||||||
if (customer.getId() != null) {
|
|
||||||
sendEntityNotificationMsg(savedCustomer.getTenantId(), savedCustomer.getId(), EdgeEventActionType.UPDATED);
|
|
||||||
}
|
|
||||||
|
|
||||||
return savedCustomer;
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
logEntityAction(emptyId(EntityType.CUSTOMER), customer,
|
|
||||||
null, customer.getId() == null ? ActionType.ADDED : ActionType.UPDATED, e);
|
|
||||||
|
|
||||||
throw handleException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "Delete Customer (deleteCustomer)",
|
@ApiOperation(value = "Delete Customer (deleteCustomer)",
|
||||||
@ -180,27 +164,11 @@ public class CustomerController extends BaseController {
|
|||||||
public void deleteCustomer(@ApiParam(value = CUSTOMER_ID_PARAM_DESCRIPTION)
|
public void deleteCustomer(@ApiParam(value = CUSTOMER_ID_PARAM_DESCRIPTION)
|
||||||
@PathVariable(CUSTOMER_ID) String strCustomerId) throws ThingsboardException {
|
@PathVariable(CUSTOMER_ID) String strCustomerId) throws ThingsboardException {
|
||||||
checkParameter(CUSTOMER_ID, strCustomerId);
|
checkParameter(CUSTOMER_ID, strCustomerId);
|
||||||
try {
|
|
||||||
CustomerId customerId = new CustomerId(toUUID(strCustomerId));
|
CustomerId customerId = new CustomerId(toUUID(strCustomerId));
|
||||||
Customer customer = checkCustomerId(customerId, Operation.DELETE);
|
Customer customer = checkCustomerId(customerId, Operation.DELETE);
|
||||||
|
try {
|
||||||
List<EdgeId> relatedEdgeIds = findRelatedEdgeIds(getTenantId(), customerId);
|
tbCustomerService.delete(customer, getCurrentUser());
|
||||||
|
|
||||||
customerService.deleteCustomer(getTenantId(), customerId);
|
|
||||||
|
|
||||||
logEntityAction(customerId, customer,
|
|
||||||
customer.getId(),
|
|
||||||
ActionType.DELETED, null, strCustomerId);
|
|
||||||
|
|
||||||
sendDeleteNotificationMsg(getTenantId(), customerId, relatedEdgeIds);
|
|
||||||
tbClusterService.broadcastEntityStateChangeEvent(getTenantId(), customerId, ComponentLifecycleEvent.DELETED);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
||||||
logEntityAction(emptyId(EntityType.CUSTOMER),
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
ActionType.DELETED, e, strCustomerId);
|
|
||||||
|
|
||||||
throw handleException(e);
|
throw handleException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,17 +22,16 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.rule.engine.api.msg.DeviceCredentialsUpdateNotificationMsg;
|
import org.thingsboard.rule.engine.api.msg.DeviceCredentialsUpdateNotificationMsg;
|
||||||
import org.thingsboard.server.cluster.TbClusterService;
|
import org.thingsboard.server.cluster.TbClusterService;
|
||||||
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.DataConstants;
|
import org.thingsboard.server.common.data.DataConstants;
|
||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.HasName;
|
import org.thingsboard.server.common.data.HasName;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventType;
|
import org.thingsboard.server.common.data.edge.EdgeEventType;
|
||||||
import org.thingsboard.server.common.data.id.AssetId;
|
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
@ -70,10 +69,11 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <E extends HasName, I extends EntityId> void notifyDeleteEntity(TenantId tenantId, I entityId, E entity,
|
public <E extends HasName, I extends EntityId> void notifyDeleteEntity(TenantId tenantId, I entityId, E entity,
|
||||||
CustomerId customerId, List<EdgeId> relatedEdgeIds,
|
CustomerId customerId, ActionType actionType,
|
||||||
|
List<EdgeId> relatedEdgeIds,
|
||||||
SecurityUser user, Object... additionalInfo) {
|
SecurityUser user, Object... additionalInfo) {
|
||||||
logEntityAction(tenantId, entityId, entity, customerId, ActionType.DELETED, user, additionalInfo);
|
logEntityAction(tenantId, entityId, entity, customerId, actionType, user, additionalInfo);
|
||||||
sendDeleteNotificationMsg(tenantId, entityId, relatedEdgeIds);
|
sendDeleteNotificationMsg(tenantId, entityId, entity, relatedEdgeIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -126,7 +126,7 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
|
|||||||
gatewayNotificationsService.onDeviceDeleted(device);
|
gatewayNotificationsService.onDeviceDeleted(device);
|
||||||
tbClusterService.onDeviceDeleted(device, null);
|
tbClusterService.onDeviceDeleted(device, null);
|
||||||
|
|
||||||
notifyDeleteEntity(tenantId, deviceId, device, customerId, relatedEdgeIds, user, additionalInfo);
|
notifyDeleteEntity(tenantId, deviceId, device, customerId, ActionType.DELETED, relatedEdgeIds, user, false, additionalInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -145,12 +145,10 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyCreateOrUpdateAsset(TenantId tenantId, AssetId assetId, CustomerId customerId, Asset asset,
|
public <E extends HasName, I extends EntityId> void notifyCreateOrUpdateEntity(TenantId tenantId, I entityId, E entity, CustomerId customerId, ActionType actionType, SecurityUser user, Object... additionalInfo) {
|
||||||
ActionType actionType, SecurityUser user, Object... additionalInfo) {
|
logEntityAction(tenantId, entityId, entity, customerId, actionType, user, additionalInfo);
|
||||||
logEntityAction(tenantId, assetId, asset, customerId, actionType, user, additionalInfo);
|
|
||||||
|
|
||||||
if (actionType == ActionType.UPDATED) {
|
if (actionType == ActionType.UPDATED) {
|
||||||
sendEntityNotificationMsg(asset.getTenantId(), asset.getId(), EdgeEventActionType.UPDATED);
|
sendEntityNotificationMsg(tenantId, entityId, EdgeEventActionType.UPDATED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,6 +200,13 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
|
|||||||
sendAlarmDeleteNotificationMsg(alarm, relatedEdgeIds);
|
sendAlarmDeleteNotificationMsg(alarm, relatedEdgeIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notifyDeleteCustomer(Customer customer, SecurityUser user, List<EdgeId> edgeIds) {
|
||||||
|
logEntityAction(customer.getTenantId(), customer.getId(), customer, customer.getId(), ActionType.DELETED, user, null);
|
||||||
|
sendDeleteNotificationMsg(customer.getTenantId(), customer.getId(), customer, edgeIds);
|
||||||
|
tbClusterService.broadcastEntityStateChangeEvent(customer.getTenantId(), customer.getId(), ComponentLifecycleEvent.DELETED);
|
||||||
|
}
|
||||||
|
|
||||||
private <E extends HasName, I extends EntityId> void logEntityAction(TenantId tenantId, I entityId, E entity, CustomerId customerId,
|
private <E extends HasName, I extends EntityId> void logEntityAction(TenantId tenantId, I entityId, E entity, CustomerId customerId,
|
||||||
ActionType actionType, SecurityUser user, Object... additionalInfo) {
|
ActionType actionType, SecurityUser user, Object... additionalInfo) {
|
||||||
logEntityAction(tenantId, entityId, entity, customerId, actionType, user, null, additionalInfo);
|
logEntityAction(tenantId, entityId, entity, customerId, actionType, user, null, additionalInfo);
|
||||||
@ -228,8 +233,12 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds) {
|
protected <E extends HasName, I extends EntityId> void sendDeleteNotificationMsg(TenantId tenantId, I entityId, E entity, List<EdgeId> edgeIds) {
|
||||||
|
try {
|
||||||
sendDeleteNotificationMsg(tenantId, entityId, edgeIds, null);
|
sendDeleteNotificationMsg(tenantId, entityId, edgeIds, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("Failed to push delete " + entity.getClass().getName() + " msg to core: {}", entity, e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void sendAlarmDeleteNotificationMsg(Alarm alarm, List<EdgeId> relatedEdgeIds) {
|
protected void sendAlarmDeleteNotificationMsg(Alarm alarm, List<EdgeId> relatedEdgeIds) {
|
||||||
@ -239,6 +248,7 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
|
|||||||
log.warn("Failed to push delete alarm msg to core: {}", alarm, e);
|
log.warn("Failed to push delete alarm msg to core: {}", alarm, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds, String body) {
|
private void sendDeleteNotificationMsg(TenantId tenantId, EntityId entityId, List<EdgeId> edgeIds, String body) {
|
||||||
if (edgeIds != null && !edgeIds.isEmpty()) {
|
if (edgeIds != null && !edgeIds.isEmpty()) {
|
||||||
for (EdgeId edgeId : edgeIds) {
|
for (EdgeId edgeId : edgeIds) {
|
||||||
|
|||||||
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* 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.service.entitiy;
|
||||||
|
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
|
|
||||||
|
public interface SimpleTbEntityService<T> {
|
||||||
|
|
||||||
|
T save(T entity, SecurityUser user) throws ThingsboardException;
|
||||||
|
|
||||||
|
}
|
||||||
@ -15,15 +15,14 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.entitiy;
|
package org.thingsboard.server.service.entitiy;
|
||||||
|
|
||||||
|
import org.thingsboard.server.common.data.Customer;
|
||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.HasName;
|
import org.thingsboard.server.common.data.HasName;
|
||||||
import org.thingsboard.server.common.data.Tenant;
|
import org.thingsboard.server.common.data.Tenant;
|
||||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||||
import org.thingsboard.server.common.data.id.AssetId;
|
|
||||||
import org.thingsboard.server.common.data.id.CustomerId;
|
import org.thingsboard.server.common.data.id.CustomerId;
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
@ -41,8 +40,12 @@ public interface TbNotificationEntityService {
|
|||||||
ActionType actionType, SecurityUser user, Exception e,
|
ActionType actionType, SecurityUser user, Exception e,
|
||||||
Object... additionalInfo);
|
Object... additionalInfo);
|
||||||
|
|
||||||
|
<E extends HasName, I extends EntityId> void notifyCreateOrUpdateEntity(TenantId tenantId, I entityId, E entity,
|
||||||
|
CustomerId customerId, ActionType actionType,
|
||||||
|
SecurityUser user, Object... additionalInfo);
|
||||||
|
|
||||||
<E extends HasName, I extends EntityId> void notifyDeleteEntity(TenantId tenantId, I entityId, E entity, CustomerId customerId,
|
<E extends HasName, I extends EntityId> void notifyDeleteEntity(TenantId tenantId, I entityId, E entity, CustomerId customerId,
|
||||||
List<EdgeId> relatedEdgeIds, SecurityUser user,
|
ActionType actionType, List<EdgeId> relatedEdgeIds, SecurityUser user,
|
||||||
Object... additionalInfo);
|
Object... additionalInfo);
|
||||||
|
|
||||||
<E extends HasName, I extends EntityId> void notifyAssignOrUnassignEntityToCustomer(TenantId tenantId, I entityId,
|
<E extends HasName, I extends EntityId> void notifyAssignOrUnassignEntityToCustomer(TenantId tenantId, I entityId,
|
||||||
@ -74,13 +77,11 @@ public interface TbNotificationEntityService {
|
|||||||
void notifyAssignDeviceToTenant(TenantId tenantId, TenantId newTenantId, DeviceId deviceId, CustomerId customerId,
|
void notifyAssignDeviceToTenant(TenantId tenantId, TenantId newTenantId, DeviceId deviceId, CustomerId customerId,
|
||||||
Device device, Tenant tenant, SecurityUser user, Object... additionalInfo);
|
Device device, Tenant tenant, SecurityUser user, Object... additionalInfo);
|
||||||
|
|
||||||
void notifyCreateOrUpdateAsset(TenantId tenantId, AssetId assetId, CustomerId customerId, Asset asset,
|
|
||||||
ActionType actionType, SecurityUser user, Object... additionalInfo);
|
|
||||||
|
|
||||||
void notifyEdge(TenantId tenantId, EdgeId edgeId, CustomerId customerId, Edge edge, ActionType actionType, SecurityUser user, Object... additionalInfo);
|
void notifyEdge(TenantId tenantId, EdgeId edgeId, CustomerId customerId, Edge edge, ActionType actionType, SecurityUser user, Object... additionalInfo);
|
||||||
|
|
||||||
void notifyCreateOrUpdateAlarm(Alarm alarm,
|
void notifyCreateOrUpdateAlarm(Alarm alarm, ActionType actionType, SecurityUser user, Object... additionalInfo);
|
||||||
ActionType actionType, SecurityUser user, Object... additionalInfo);
|
|
||||||
|
|
||||||
void notifyDeleteAlarm(Alarm alarm, SecurityUser user, List<EdgeId> relatedEdgeIds);
|
void notifyDeleteAlarm(Alarm alarm, SecurityUser user, List<EdgeId> relatedEdgeIds);
|
||||||
|
|
||||||
|
void notifyDeleteCustomer(Customer customer, SecurityUser user, List<EdgeId> relatedEdgeIds);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.entitiy.alarm;
|
package org.thingsboard.server.service.entitiy.alarm;
|
||||||
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
|||||||
@ -16,16 +16,16 @@
|
|||||||
package org.thingsboard.server.service.entitiy.alarm;
|
package org.thingsboard.server.service.entitiy.alarm;
|
||||||
|
|
||||||
import org.thingsboard.server.common.data.alarm.Alarm;
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
||||||
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
|
import org.thingsboard.server.service.entitiy.SimpleTbEntityService;
|
||||||
import org.thingsboard.server.service.security.model.SecurityUser;
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
|
|
||||||
public interface TbAlarmService {
|
public interface TbAlarmService extends SimpleTbEntityService<Alarm> {
|
||||||
|
|
||||||
Alarm save (Alarm alarm, SecurityUser user) throws ThingsboardException;
|
void ack(Alarm alarm, SecurityUser user) throws ThingsboardException;
|
||||||
|
|
||||||
void ack (Alarm alarm, SecurityUser user) throws ThingsboardException;
|
void clear(Alarm alarm, SecurityUser user) throws ThingsboardException;
|
||||||
|
|
||||||
void clear (Alarm alarm, SecurityUser user) throws ThingsboardException;
|
Boolean delete(Alarm alarm, SecurityUser user) throws ThingsboardException;
|
||||||
|
|
||||||
Boolean delete (Alarm alarm, SecurityUser user) throws ThingsboardException;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,7 +45,7 @@ public class DefaultTbAssetService extends AbstractTbEntityService implements Tb
|
|||||||
TenantId tenantId = asset.getTenantId();
|
TenantId tenantId = asset.getTenantId();
|
||||||
try {
|
try {
|
||||||
Asset savedAsset = checkNotNull(assetService.saveAsset(asset));
|
Asset savedAsset = checkNotNull(assetService.saveAsset(asset));
|
||||||
notificationEntityService.notifyCreateOrUpdateAsset(tenantId, savedAsset.getId(), savedAsset.getCustomerId(), asset, actionType, user);
|
notificationEntityService.notifyCreateOrUpdateEntity(tenantId, savedAsset.getId(), asset, savedAsset.getCustomerId(), actionType, user);
|
||||||
return savedAsset;
|
return savedAsset;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
notificationEntityService.notifyEntity(tenantId, emptyId(EntityType.ASSET), asset, null, actionType, user, e);
|
notificationEntityService.notifyEntity(tenantId, emptyId(EntityType.ASSET), asset, null, actionType, user, e);
|
||||||
@ -60,7 +60,7 @@ public class DefaultTbAssetService extends AbstractTbEntityService implements Tb
|
|||||||
try {
|
try {
|
||||||
List<EdgeId> relatedEdgeIds = findRelatedEdgeIds(tenantId, assetId);
|
List<EdgeId> relatedEdgeIds = findRelatedEdgeIds(tenantId, assetId);
|
||||||
assetService.deleteAsset(tenantId, assetId);
|
assetService.deleteAsset(tenantId, assetId);
|
||||||
notificationEntityService.notifyDeleteEntity(tenantId, assetId, asset, asset.getCustomerId(), relatedEdgeIds, user, asset.toString());
|
notificationEntityService.notifyDeleteEntity(tenantId, assetId, asset, asset.getCustomerId(), ActionType.DELETED, relatedEdgeIds, user, false, asset.toString());
|
||||||
|
|
||||||
return removeAlarmsByEntityId(tenantId, assetId);
|
return removeAlarmsByEntityId(tenantId, assetId);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@ -22,10 +22,10 @@ import org.thingsboard.server.common.data.edge.Edge;
|
|||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.id.AssetId;
|
import org.thingsboard.server.common.data.id.AssetId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
import org.thingsboard.server.service.entitiy.SimpleTbEntityService;
|
||||||
import org.thingsboard.server.service.security.model.SecurityUser;
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
|
|
||||||
public interface TbAssetService {
|
public interface TbAssetService extends SimpleTbEntityService<Asset> {
|
||||||
Asset save(Asset asset, SecurityUser user) throws ThingsboardException;
|
|
||||||
|
|
||||||
ListenableFuture<Void> delete(Asset asset, SecurityUser user) throws ThingsboardException;
|
ListenableFuture<Void> delete(Asset asset, SecurityUser user) throws ThingsboardException;
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* 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.service.entitiy.customer;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.thingsboard.server.common.data.Customer;
|
||||||
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
import org.thingsboard.server.service.entitiy.AbstractTbEntityService;
|
||||||
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@TbCoreComponent
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class DefaultTbCustomerService extends AbstractTbEntityService implements TbCustomerService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Customer save(Customer customer, SecurityUser user) throws ThingsboardException {
|
||||||
|
ActionType actionType = customer.getId() == null ? ActionType.ADDED : ActionType.UPDATED;
|
||||||
|
TenantId tenantId = customer.getTenantId();
|
||||||
|
try {
|
||||||
|
Customer savedCustomer = checkNotNull(customerService.saveCustomer(customer));
|
||||||
|
notificationEntityService.notifyCreateOrUpdateEntity(tenantId, savedCustomer.getId(), savedCustomer, savedCustomer.getId(), actionType, user);
|
||||||
|
return savedCustomer;
|
||||||
|
} catch (Exception e) {
|
||||||
|
notificationEntityService.notifyEntity(tenantId, emptyId(EntityType.CUSTOMER), customer, null, actionType, user, e);
|
||||||
|
throw handleException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete(Customer customer, SecurityUser user) throws ThingsboardException {
|
||||||
|
TenantId tenantId = customer.getTenantId();
|
||||||
|
try {
|
||||||
|
List<EdgeId> relatedEdgeIds = findRelatedEdgeIds(tenantId, customer.getId());
|
||||||
|
customerService.deleteCustomer(tenantId, customer.getId());
|
||||||
|
notificationEntityService.notifyDeleteCustomer(customer, user, relatedEdgeIds);
|
||||||
|
} catch (Exception e) {
|
||||||
|
notificationEntityService.notifyEntity(tenantId, emptyId(EntityType.CUSTOMER), null, null, ActionType.DELETED, user, e);
|
||||||
|
throw handleException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* 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.service.entitiy.customer;
|
||||||
|
|
||||||
|
import org.thingsboard.server.common.data.Customer;
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
|
import org.thingsboard.server.service.entitiy.SimpleTbEntityService;
|
||||||
|
import org.thingsboard.server.service.security.model.SecurityUser;
|
||||||
|
|
||||||
|
public interface TbCustomerService extends SimpleTbEntityService<Customer> {
|
||||||
|
|
||||||
|
void delete(Customer customer, SecurityUser user) throws ThingsboardException;
|
||||||
|
|
||||||
|
}
|
||||||
@ -19,7 +19,9 @@ import org.thingsboard.server.common.data.Tenant;
|
|||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
|
|
||||||
public interface TbTenantService {
|
public interface TbTenantService {
|
||||||
|
|
||||||
Tenant save(Tenant tenant) throws ThingsboardException;
|
Tenant save(Tenant tenant) throws ThingsboardException;
|
||||||
|
|
||||||
void delete(Tenant tenant) throws ThingsboardException;
|
void delete(Tenant tenant) throws ThingsboardException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,257 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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.actors;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
||||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
|
||||||
import org.springframework.test.context.TestPropertySource;
|
|
||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
|
||||||
import org.thingsboard.rule.engine.api.MailService;
|
|
||||||
import org.thingsboard.rule.engine.api.SmsService;
|
|
||||||
import org.thingsboard.rule.engine.api.sms.SmsSenderFactory;
|
|
||||||
import org.thingsboard.server.actors.service.ActorService;
|
|
||||||
import org.thingsboard.server.cluster.TbClusterService;
|
|
||||||
import org.thingsboard.server.common.transport.util.DataDecodingEncodingService;
|
|
||||||
import org.thingsboard.server.dao.asset.AssetService;
|
|
||||||
import org.thingsboard.server.dao.attributes.AttributesService;
|
|
||||||
import org.thingsboard.server.dao.audit.AuditLogService;
|
|
||||||
import org.thingsboard.server.dao.cassandra.CassandraCluster;
|
|
||||||
import org.thingsboard.server.dao.customer.CustomerService;
|
|
||||||
import org.thingsboard.server.dao.dashboard.DashboardService;
|
|
||||||
import org.thingsboard.server.dao.device.ClaimDevicesService;
|
|
||||||
import org.thingsboard.server.dao.device.DeviceService;
|
|
||||||
import org.thingsboard.server.dao.edge.EdgeEventService;
|
|
||||||
import org.thingsboard.server.dao.edge.EdgeService;
|
|
||||||
import org.thingsboard.server.dao.entityview.EntityViewService;
|
|
||||||
import org.thingsboard.server.dao.event.EventService;
|
|
||||||
import org.thingsboard.server.dao.nosql.CassandraBufferedRateReadExecutor;
|
|
||||||
import org.thingsboard.server.dao.nosql.CassandraBufferedRateWriteExecutor;
|
|
||||||
import org.thingsboard.server.dao.ota.OtaPackageService;
|
|
||||||
import org.thingsboard.server.dao.relation.RelationService;
|
|
||||||
import org.thingsboard.server.dao.resource.ResourceService;
|
|
||||||
import org.thingsboard.server.dao.rule.RuleChainService;
|
|
||||||
import org.thingsboard.server.dao.rule.RuleNodeStateService;
|
|
||||||
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
|
|
||||||
import org.thingsboard.server.dao.tenant.TenantProfileService;
|
|
||||||
import org.thingsboard.server.dao.tenant.TenantService;
|
|
||||||
import org.thingsboard.server.dao.timeseries.TimeseriesService;
|
|
||||||
import org.thingsboard.server.dao.user.UserService;
|
|
||||||
import org.thingsboard.server.queue.discovery.PartitionService;
|
|
||||||
import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
|
|
||||||
import org.thingsboard.server.queue.usagestats.TbApiUsageClient;
|
|
||||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
|
||||||
import org.thingsboard.server.service.component.ComponentDiscoveryService;
|
|
||||||
import org.thingsboard.server.service.edge.rpc.EdgeRpcService;
|
|
||||||
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
|
|
||||||
import org.thingsboard.server.service.executors.ExternalCallExecutorService;
|
|
||||||
import org.thingsboard.server.service.executors.SharedEventLoopGroupService;
|
|
||||||
import org.thingsboard.server.service.mail.MailExecutorService;
|
|
||||||
import org.thingsboard.server.service.profile.TbDeviceProfileCache;
|
|
||||||
import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService;
|
|
||||||
import org.thingsboard.server.service.rpc.TbRpcService;
|
|
||||||
import org.thingsboard.server.service.rpc.TbRuleEngineDeviceRpcService;
|
|
||||||
import org.thingsboard.server.service.script.JsInvokeService;
|
|
||||||
import org.thingsboard.server.service.session.DeviceSessionCacheService;
|
|
||||||
import org.thingsboard.server.service.sms.SmsExecutorService;
|
|
||||||
import org.thingsboard.server.service.state.DeviceStateService;
|
|
||||||
import org.thingsboard.server.service.telemetry.AlarmSubscriptionService;
|
|
||||||
import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
|
|
||||||
import org.thingsboard.server.service.transport.TbCoreToTransportService;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
|
|
||||||
@ExtendWith(SpringExtension.class)
|
|
||||||
@ContextConfiguration(classes = ActorSystemContext.class)
|
|
||||||
@EnableConfigurationProperties
|
|
||||||
@TestPropertySource(properties = {
|
|
||||||
"cache.type=caffeine",
|
|
||||||
})
|
|
||||||
public class ActorSystemContextTest {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
ActorSystemContext ctx;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbApiUsageStateService apiUsageStateService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbApiUsageClient apiUsageClient;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbServiceInfoProvider serviceInfoProvider;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private ActorService actorService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private ComponentDiscoveryService componentService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private DataDecodingEncodingService encodingService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private DeviceService deviceService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbTenantProfileCache tenantProfileCache;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbDeviceProfileCache deviceProfileCache;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private AssetService assetService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private DashboardService dashboardService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TenantService tenantService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TenantProfileService tenantProfileService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private CustomerService customerService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private UserService userService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private RuleChainService ruleChainService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private RuleNodeStateService ruleNodeStateService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private PartitionService partitionService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbClusterService clusterService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TimeseriesService tsService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private AttributesService attributesService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private EventService eventService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private RelationService relationService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private AuditLogService auditLogService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private EntityViewService entityViewService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TelemetrySubscriptionService tsSubService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private AlarmSubscriptionService alarmService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private JsInvokeService jsSandbox;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private MailExecutorService mailExecutor;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private SmsExecutorService smsExecutor;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private DbCallbackExecutorService dbCallbackExecutor;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private ExternalCallExecutorService externalCallExecutorService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private SharedEventLoopGroupService sharedEventLoopGroupService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private MailService mailService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private SmsService smsService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private SmsSenderFactory smsSenderFactory;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private ClaimDevicesService claimDevicesService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private JsInvokeStats jsInvokeStats;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private DeviceStateService deviceStateService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private DeviceSessionCacheService deviceSessionCacheService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbCoreToTransportService tbCoreToTransportService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbRuleEngineDeviceRpcService tbRuleEngineDeviceRpcService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbCoreDeviceRpcService tbCoreDeviceRpcService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private EdgeService edgeService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private EdgeEventService edgeEventService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private EdgeRpcService edgeRpcService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private ResourceService resourceService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private OtaPackageService otaPackageService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private TbRpcService tbRpcService;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private CassandraCluster cassandraCluster;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private CassandraBufferedRateReadExecutor cassandraBufferedRateReadExecutor;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private CassandraBufferedRateWriteExecutor cassandraBufferedRateWriteExecutor;
|
|
||||||
|
|
||||||
@MockBean
|
|
||||||
private RedisTemplate<String, Object> redisTemplate;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void givenCaffeineCache_whenInit_thenIsLocalCacheTrue() {
|
|
||||||
assertThat(ctx.getCacheType()).isEqualTo("caffeine");
|
|
||||||
assertThat(ctx.isLocalCacheType()).as("caffeine is the local cache type").isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user