RPC v2 to switch from 409 to 504 error code
This commit is contained in:
parent
940c81b095
commit
65ad86bedb
@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@ -16,7 +16,6 @@
|
|||||||
package org.thingsboard.server.controller;
|
package org.thingsboard.server.controller;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import com.google.common.util.concurrent.FutureCallback;
|
import com.google.common.util.concurrent.FutureCallback;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -26,13 +25,12 @@ import org.springframework.http.ResponseEntity;
|
|||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
import org.springframework.web.context.request.async.DeferredResult;
|
import org.springframework.web.context.request.async.DeferredResult;
|
||||||
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.rule.engine.api.RpcError;
|
import org.thingsboard.rule.engine.api.RpcError;
|
||||||
import org.thingsboard.server.common.data.DataConstants;
|
import org.thingsboard.server.common.data.DataConstants;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
@ -59,20 +57,15 @@ import org.thingsboard.server.service.security.permission.Operation;
|
|||||||
import org.thingsboard.server.service.telemetry.exception.ToErrorResponseEntity;
|
import org.thingsboard.server.service.telemetry.exception.ToErrorResponseEntity;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by ashvayka on 22.03.18.
|
* Created by ashvayka on 22.03.18.
|
||||||
*/
|
*/
|
||||||
@RestController
|
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
@RequestMapping(TbUrlConstants.RPC_URL_PREFIX)
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class RpcController extends BaseController {
|
public abstract class AbstractRpcController extends BaseController {
|
||||||
|
|
||||||
protected final ObjectMapper jsonMapper = new ObjectMapper();
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private TbCoreDeviceRpcService deviceRpcService;
|
private TbCoreDeviceRpcService deviceRpcService;
|
||||||
@ -81,75 +74,15 @@ public class RpcController extends BaseController {
|
|||||||
private AccessValidator accessValidator;
|
private AccessValidator accessValidator;
|
||||||
|
|
||||||
@Value("${server.rest.server_side_rpc.min_timeout:5000}")
|
@Value("${server.rest.server_side_rpc.min_timeout:5000}")
|
||||||
private long minTimeout;
|
protected long minTimeout;
|
||||||
|
|
||||||
@Value("${server.rest.server_side_rpc.default_timeout:10000}")
|
@Value("${server.rest.server_side_rpc.default_timeout:10000}")
|
||||||
private long defaultTimeout;
|
protected long defaultTimeout;
|
||||||
|
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
protected DeferredResult<ResponseEntity> handleDeviceRPCRequest(boolean oneWay, DeviceId deviceId, String requestBody, HttpStatus timeoutStatus) throws ThingsboardException {
|
||||||
@RequestMapping(value = "/oneway/{deviceId}", method = RequestMethod.POST)
|
|
||||||
@ResponseBody
|
|
||||||
public DeferredResult<ResponseEntity> handleOneWayDeviceRPCRequest(@PathVariable("deviceId") String deviceIdStr, @RequestBody String requestBody) throws ThingsboardException {
|
|
||||||
return handleDeviceRPCRequest(true, new DeviceId(UUID.fromString(deviceIdStr)), requestBody);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
|
||||||
@RequestMapping(value = "/twoway/{deviceId}", method = RequestMethod.POST)
|
|
||||||
@ResponseBody
|
|
||||||
public DeferredResult<ResponseEntity> handleTwoWayDeviceRPCRequest(@PathVariable("deviceId") String deviceIdStr, @RequestBody String requestBody) throws ThingsboardException {
|
|
||||||
return handleDeviceRPCRequest(false, new DeviceId(UUID.fromString(deviceIdStr)), requestBody);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
|
||||||
@RequestMapping(value = "/persistent/{rpcId}", method = RequestMethod.GET)
|
|
||||||
@ResponseBody
|
|
||||||
public Rpc getPersistedRpc(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
|
||||||
checkParameter("RpcId", strRpc);
|
|
||||||
try {
|
try {
|
||||||
RpcId rpcId = new RpcId(UUID.fromString(strRpc));
|
JsonNode rpcRequestBody = JacksonUtil.toJsonNode(requestBody);
|
||||||
return checkRpcId(rpcId, Operation.READ);
|
ToDeviceRpcRequestBody body = new ToDeviceRpcRequestBody(rpcRequestBody.get("method").asText(), JacksonUtil.toString(rpcRequestBody.get("params")));
|
||||||
} catch (Exception e) {
|
|
||||||
throw handleException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
|
||||||
@RequestMapping(value = "/persistent/device/{deviceId}", method = RequestMethod.GET)
|
|
||||||
@ResponseBody
|
|
||||||
public PageData<Rpc> getPersistedRpcByDevice(@PathVariable("deviceId") String strDeviceId,
|
|
||||||
@RequestParam int pageSize,
|
|
||||||
@RequestParam int page,
|
|
||||||
@RequestParam RpcStatus rpcStatus,
|
|
||||||
@RequestParam(required = false) String textSearch,
|
|
||||||
@RequestParam(required = false) String sortProperty,
|
|
||||||
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
|
||||||
checkParameter("DeviceId", strDeviceId);
|
|
||||||
try {
|
|
||||||
TenantId tenantId = getCurrentUser().getTenantId();
|
|
||||||
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
|
|
||||||
DeviceId deviceId = new DeviceId(UUID.fromString(strDeviceId));
|
|
||||||
return checkNotNull(rpcService.findAllByDeviceIdAndStatus(tenantId, deviceId, rpcStatus, pageLink));
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw handleException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
|
|
||||||
@RequestMapping(value = "/persistent/{rpcId}", method = RequestMethod.DELETE)
|
|
||||||
@ResponseBody
|
|
||||||
public void deleteResource(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
|
||||||
checkParameter("RpcId", strRpc);
|
|
||||||
try {
|
|
||||||
rpcService.deleteRpc(getTenantId(), new RpcId(UUID.fromString(strRpc)));
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw handleException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private DeferredResult<ResponseEntity> handleDeviceRPCRequest(boolean oneWay, DeviceId deviceId, String requestBody) throws ThingsboardException {
|
|
||||||
try {
|
|
||||||
JsonNode rpcRequestBody = jsonMapper.readTree(requestBody);
|
|
||||||
ToDeviceRpcRequestBody body = new ToDeviceRpcRequestBody(rpcRequestBody.get("method").asText(), jsonMapper.writeValueAsString(rpcRequestBody.get("params")));
|
|
||||||
SecurityUser currentUser = getCurrentUser();
|
SecurityUser currentUser = getCurrentUser();
|
||||||
TenantId tenantId = currentUser.getTenantId();
|
TenantId tenantId = currentUser.getTenantId();
|
||||||
final DeferredResult<ResponseEntity> response = new DeferredResult<>();
|
final DeferredResult<ResponseEntity> response = new DeferredResult<>();
|
||||||
@ -157,7 +90,7 @@ public class RpcController extends BaseController {
|
|||||||
long expTime = System.currentTimeMillis() + Math.max(minTimeout, timeout);
|
long expTime = System.currentTimeMillis() + Math.max(minTimeout, timeout);
|
||||||
UUID rpcRequestUUID = rpcRequestBody.has("requestUUID") ? UUID.fromString(rpcRequestBody.get("requestUUID").asText()) : UUID.randomUUID();
|
UUID rpcRequestUUID = rpcRequestBody.has("requestUUID") ? UUID.fromString(rpcRequestBody.get("requestUUID").asText()) : UUID.randomUUID();
|
||||||
boolean persisted = rpcRequestBody.has(DataConstants.PERSISTENT) && rpcRequestBody.get(DataConstants.PERSISTENT).asBoolean();
|
boolean persisted = rpcRequestBody.has(DataConstants.PERSISTENT) && rpcRequestBody.get(DataConstants.PERSISTENT).asBoolean();
|
||||||
accessValidator.validate(currentUser, Operation.RPC_CALL, deviceId, new HttpValidationCallback(response, new FutureCallback<DeferredResult<ResponseEntity>>() {
|
accessValidator.validate(currentUser, Operation.RPC_CALL, deviceId, new HttpValidationCallback(response, new FutureCallback<>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(@Nullable DeferredResult<ResponseEntity> result) {
|
public void onSuccess(@Nullable DeferredResult<ResponseEntity> result) {
|
||||||
ToDeviceRpcRequest rpcRequest = new ToDeviceRpcRequest(rpcRequestUUID,
|
ToDeviceRpcRequest rpcRequest = new ToDeviceRpcRequest(rpcRequestUUID,
|
||||||
@ -168,7 +101,7 @@ public class RpcController extends BaseController {
|
|||||||
body,
|
body,
|
||||||
persisted
|
persisted
|
||||||
);
|
);
|
||||||
deviceRpcService.processRestApiRpcRequest(rpcRequest, fromDeviceRpcResponse -> reply(new LocalRequestMetaData(rpcRequest, currentUser, result), fromDeviceRpcResponse), currentUser);
|
deviceRpcService.processRestApiRpcRequest(rpcRequest, fromDeviceRpcResponse -> reply(new LocalRequestMetaData(rpcRequest, currentUser, result), fromDeviceRpcResponse, timeoutStatus), currentUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -184,12 +117,12 @@ public class RpcController extends BaseController {
|
|||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
return response;
|
return response;
|
||||||
} catch (IOException ioe) {
|
} catch (IllegalArgumentException ioe) {
|
||||||
throw new ThingsboardException("Invalid request body", ioe, ThingsboardErrorCode.BAD_REQUEST_PARAMS);
|
throw new ThingsboardException("Invalid request body", ioe, ThingsboardErrorCode.BAD_REQUEST_PARAMS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reply(LocalRequestMetaData rpcRequest, FromDeviceRpcResponse response) {
|
public void reply(LocalRequestMetaData rpcRequest, FromDeviceRpcResponse response, HttpStatus timeoutStatus) {
|
||||||
Optional<RpcError> rpcError = response.getError();
|
Optional<RpcError> rpcError = response.getError();
|
||||||
DeferredResult<ResponseEntity> responseWriter = rpcRequest.getResponseWriter();
|
DeferredResult<ResponseEntity> responseWriter = rpcRequest.getResponseWriter();
|
||||||
if (rpcError.isPresent()) {
|
if (rpcError.isPresent()) {
|
||||||
@ -197,13 +130,13 @@ public class RpcController extends BaseController {
|
|||||||
RpcError error = rpcError.get();
|
RpcError error = rpcError.get();
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case TIMEOUT:
|
case TIMEOUT:
|
||||||
responseWriter.setResult(new ResponseEntity<>(HttpStatus.REQUEST_TIMEOUT));
|
responseWriter.setResult(new ResponseEntity<>(timeoutStatus));
|
||||||
break;
|
break;
|
||||||
case NO_ACTIVE_CONNECTION:
|
case NO_ACTIVE_CONNECTION:
|
||||||
responseWriter.setResult(new ResponseEntity<>(HttpStatus.CONFLICT));
|
responseWriter.setResult(new ResponseEntity<>(HttpStatus.CONFLICT));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
responseWriter.setResult(new ResponseEntity<>(HttpStatus.REQUEST_TIMEOUT));
|
responseWriter.setResult(new ResponseEntity<>(timeoutStatus));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -212,8 +145,8 @@ public class RpcController extends BaseController {
|
|||||||
String data = responseData.get();
|
String data = responseData.get();
|
||||||
try {
|
try {
|
||||||
logRpcCall(rpcRequest, rpcError, null);
|
logRpcCall(rpcRequest, rpcError, null);
|
||||||
responseWriter.setResult(new ResponseEntity<>(jsonMapper.readTree(data), HttpStatus.OK));
|
responseWriter.setResult(new ResponseEntity<>(JacksonUtil.toJsonNode(data), HttpStatus.OK));
|
||||||
} catch (IOException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
log.debug("Failed to decode device response: {}", data, e);
|
log.debug("Failed to decode device response: {}", data, e);
|
||||||
logRpcCall(rpcRequest, rpcError, e);
|
logRpcCall(rpcRequest, rpcError, e);
|
||||||
responseWriter.setResult(new ResponseEntity<>(HttpStatus.NOT_ACCEPTABLE));
|
responseWriter.setResult(new ResponseEntity<>(HttpStatus.NOT_ACCEPTABLE));
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
package org.thingsboard.server.controller;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.springframework.web.context.request.async.DeferredResult;
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@TbCoreComponent
|
||||||
|
@RequestMapping(TbUrlConstants.RPC_V1_URL_PREFIX)
|
||||||
|
@Slf4j
|
||||||
|
public class RpcV1Controller extends AbstractRpcController {
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
|
@RequestMapping(value = "/oneway/{deviceId}", method = RequestMethod.POST)
|
||||||
|
@ResponseBody
|
||||||
|
public DeferredResult<ResponseEntity> handleOneWayDeviceRPCRequest(@PathVariable("deviceId") String deviceIdStr, @RequestBody String requestBody) throws ThingsboardException {
|
||||||
|
return handleDeviceRPCRequest(true, new DeviceId(UUID.fromString(deviceIdStr)), requestBody, HttpStatus.REQUEST_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
|
@RequestMapping(value = "/twoway/{deviceId}", method = RequestMethod.POST)
|
||||||
|
@ResponseBody
|
||||||
|
public DeferredResult<ResponseEntity> handleTwoWayDeviceRPCRequest(@PathVariable("deviceId") String deviceIdStr, @RequestBody String requestBody) throws ThingsboardException {
|
||||||
|
return handleDeviceRPCRequest(false, new DeviceId(UUID.fromString(deviceIdStr)), requestBody, HttpStatus.REQUEST_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,93 @@
|
|||||||
|
package org.thingsboard.server.controller;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.springframework.web.context.request.async.DeferredResult;
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
|
import org.thingsboard.server.common.data.id.RpcId;
|
||||||
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
import org.thingsboard.server.common.data.page.PageData;
|
||||||
|
import org.thingsboard.server.common.data.page.PageLink;
|
||||||
|
import org.thingsboard.server.common.data.rpc.Rpc;
|
||||||
|
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||||
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
import org.thingsboard.server.service.security.permission.Operation;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@TbCoreComponent
|
||||||
|
@RequestMapping(TbUrlConstants.RPC_V2_URL_PREFIX)
|
||||||
|
@Slf4j
|
||||||
|
public class RpcV2Controller extends AbstractRpcController {
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
|
@RequestMapping(value = "/oneway/{deviceId}", method = RequestMethod.POST)
|
||||||
|
@ResponseBody
|
||||||
|
public DeferredResult<ResponseEntity> handleOneWayDeviceRPCRequest(@PathVariable("deviceId") String deviceIdStr, @RequestBody String requestBody) throws ThingsboardException {
|
||||||
|
return handleDeviceRPCRequest(true, new DeviceId(UUID.fromString(deviceIdStr)), requestBody, HttpStatus.GATEWAY_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
|
@RequestMapping(value = "/twoway/{deviceId}", method = RequestMethod.POST)
|
||||||
|
@ResponseBody
|
||||||
|
public DeferredResult<ResponseEntity> handleTwoWayDeviceRPCRequest(@PathVariable("deviceId") String deviceIdStr, @RequestBody String requestBody) throws ThingsboardException {
|
||||||
|
return handleDeviceRPCRequest(false, new DeviceId(UUID.fromString(deviceIdStr)), requestBody, HttpStatus.GATEWAY_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
|
@RequestMapping(value = "/persistent/{rpcId}", method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public Rpc getPersistedRpc(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
||||||
|
checkParameter("RpcId", strRpc);
|
||||||
|
try {
|
||||||
|
RpcId rpcId = new RpcId(UUID.fromString(strRpc));
|
||||||
|
return checkRpcId(rpcId, Operation.READ);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw handleException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
|
@RequestMapping(value = "/persistent/device/{deviceId}", method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public PageData<Rpc> getPersistedRpcByDevice(@PathVariable("deviceId") String strDeviceId,
|
||||||
|
@RequestParam int pageSize,
|
||||||
|
@RequestParam int page,
|
||||||
|
@RequestParam RpcStatus rpcStatus,
|
||||||
|
@RequestParam(required = false) String textSearch,
|
||||||
|
@RequestParam(required = false) String sortProperty,
|
||||||
|
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
||||||
|
checkParameter("DeviceId", strDeviceId);
|
||||||
|
try {
|
||||||
|
TenantId tenantId = getCurrentUser().getTenantId();
|
||||||
|
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
|
||||||
|
DeviceId deviceId = new DeviceId(UUID.fromString(strDeviceId));
|
||||||
|
return checkNotNull(rpcService.findAllByDeviceIdAndStatus(tenantId, deviceId, rpcStatus, pageLink));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw handleException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
|
||||||
|
@RequestMapping(value = "/persistent/{rpcId}", method = RequestMethod.DELETE)
|
||||||
|
@ResponseBody
|
||||||
|
public void deleteResource(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
||||||
|
checkParameter("RpcId", strRpc);
|
||||||
|
try {
|
||||||
|
rpcService.deleteRpc(getTenantId(), new RpcId(UUID.fromString(strRpc)));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw handleException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -20,5 +20,6 @@ package org.thingsboard.server.controller;
|
|||||||
*/
|
*/
|
||||||
public class TbUrlConstants {
|
public class TbUrlConstants {
|
||||||
public static final String TELEMETRY_URL_PREFIX = "/api/plugins/telemetry";
|
public static final String TELEMETRY_URL_PREFIX = "/api/plugins/telemetry";
|
||||||
public static final String RPC_URL_PREFIX = "/api/plugins/rpc";
|
public static final String RPC_V1_URL_PREFIX = "/api/plugins/rpc";
|
||||||
|
public static final String RPC_V2_URL_PREFIX = "/api/rpc";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,7 +43,7 @@ public abstract class AbstractCoapServerSideRpcDefaultIntegrationTest extends Ab
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"24\",\"value\": 1},\"timeout\": 6000}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"24\",\"value\": 1},\"timeout\": 6000}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
|
|
||||||
doPostAsync("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().is(409),
|
doPostAsync("/api/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().is(504),
|
||||||
asyncContextTimeoutToUseRpcPlugin);
|
asyncContextTimeoutToUseRpcPlugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ public abstract class AbstractCoapServerSideRpcDefaultIntegrationTest extends Ab
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"25\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"25\",\"value\": 1}}";
|
||||||
String nonExistentDeviceId = Uuids.timeBased().toString();
|
String nonExistentDeviceId = Uuids.timeBased().toString();
|
||||||
|
|
||||||
String result = doPostAsync("/api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class,
|
String result = doPostAsync("/api/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class,
|
||||||
status().isNotFound());
|
status().isNotFound());
|
||||||
Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
|
Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ public abstract class AbstractCoapServerSideRpcDefaultIntegrationTest extends Ab
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"27\",\"value\": 1},\"timeout\": 6000}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"27\",\"value\": 1},\"timeout\": 6000}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
|
|
||||||
doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().is(409),
|
doPostAsync("/api/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().is(504),
|
||||||
asyncContextTimeoutToUseRpcPlugin);
|
asyncContextTimeoutToUseRpcPlugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ public abstract class AbstractCoapServerSideRpcDefaultIntegrationTest extends Ab
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"28\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"28\",\"value\": 1}}";
|
||||||
String nonExistentDeviceId = Uuids.timeBased().toString();
|
String nonExistentDeviceId = Uuids.timeBased().toString();
|
||||||
|
|
||||||
String result = doPostAsync("/api/plugins/rpc/twoway/" + nonExistentDeviceId, setGpioRequest, String.class,
|
String result = doPostAsync("/api/rpc/twoway/" + nonExistentDeviceId, setGpioRequest, String.class,
|
||||||
status().isNotFound());
|
status().isNotFound());
|
||||||
Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
|
Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,7 +71,7 @@ public abstract class AbstractCoapServerSideRpcIntegrationTest extends AbstractC
|
|||||||
|
|
||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
String result = doPostAsync("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
String result = doPostAsync("/api/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
||||||
|
|
||||||
latch.await(3, TimeUnit.SECONDS);
|
latch.await(3, TimeUnit.SECONDS);
|
||||||
|
|
||||||
@ -99,14 +99,14 @@ public abstract class AbstractCoapServerSideRpcIntegrationTest extends AbstractC
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
|
|
||||||
String actualResult = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
String actualResult = doPostAsync("/api/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
||||||
latch.await(3, TimeUnit.SECONDS);
|
latch.await(3, TimeUnit.SECONDS);
|
||||||
|
|
||||||
validateTwoWayStateChangedNotification(callback, 1, expectedResponseResult, actualResult);
|
validateTwoWayStateChangedNotification(callback, 1, expectedResponseResult, actualResult);
|
||||||
|
|
||||||
latch = new CountDownLatch(1);
|
latch = new CountDownLatch(1);
|
||||||
|
|
||||||
actualResult = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
actualResult = doPostAsync("/api/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
||||||
latch.await(3, TimeUnit.SECONDS);
|
latch.await(3, TimeUnit.SECONDS);
|
||||||
|
|
||||||
validateTwoWayStateChangedNotification(callback, 2, expectedResponseResult, actualResult);
|
validateTwoWayStateChangedNotification(callback, 2, expectedResponseResult, actualResult);
|
||||||
|
|||||||
@ -46,7 +46,7 @@ public abstract class AbstractMqttServerSideRpcDefaultIntegrationTest extends Ab
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"24\",\"value\": 1},\"timeout\": 6000}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"24\",\"value\": 1},\"timeout\": 6000}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
|
|
||||||
doPostAsync("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().is(409),
|
doPostAsync("/api/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().is(504),
|
||||||
asyncContextTimeoutToUseRpcPlugin);
|
asyncContextTimeoutToUseRpcPlugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ public abstract class AbstractMqttServerSideRpcDefaultIntegrationTest extends Ab
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"25\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"25\",\"value\": 1}}";
|
||||||
String nonExistentDeviceId = Uuids.timeBased().toString();
|
String nonExistentDeviceId = Uuids.timeBased().toString();
|
||||||
|
|
||||||
String result = doPostAsync("/api/plugins/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class,
|
String result = doPostAsync("/api/rpc/oneway/" + nonExistentDeviceId, setGpioRequest, String.class,
|
||||||
status().isNotFound());
|
status().isNotFound());
|
||||||
Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
|
Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
|
||||||
}
|
}
|
||||||
@ -65,7 +65,7 @@ public abstract class AbstractMqttServerSideRpcDefaultIntegrationTest extends Ab
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"27\",\"value\": 1},\"timeout\": 6000}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"27\",\"value\": 1},\"timeout\": 6000}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
|
|
||||||
doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().is(409),
|
doPostAsync("/api/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().is(504),
|
||||||
asyncContextTimeoutToUseRpcPlugin);
|
asyncContextTimeoutToUseRpcPlugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ public abstract class AbstractMqttServerSideRpcDefaultIntegrationTest extends Ab
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"28\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"28\",\"value\": 1}}";
|
||||||
String nonExistentDeviceId = Uuids.timeBased().toString();
|
String nonExistentDeviceId = Uuids.timeBased().toString();
|
||||||
|
|
||||||
String result = doPostAsync("/api/plugins/rpc/twoway/" + nonExistentDeviceId, setGpioRequest, String.class,
|
String result = doPostAsync("/api/rpc/twoway/" + nonExistentDeviceId, setGpioRequest, String.class,
|
||||||
status().isNotFound());
|
status().isNotFound());
|
||||||
Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
|
Assert.assertEquals(AccessValidator.DEVICE_WITH_REQUESTED_ID_NOT_FOUND, result);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -69,7 +69,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractM
|
|||||||
|
|
||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"23\",\"value\": 1}}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
String result = doPostAsync("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
String result = doPostAsync("/api/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
||||||
Assert.assertTrue(StringUtils.isEmpty(result));
|
Assert.assertTrue(StringUtils.isEmpty(result));
|
||||||
latch.await(3, TimeUnit.SECONDS);
|
latch.await(3, TimeUnit.SECONDS);
|
||||||
assertEquals(MqttQoS.AT_MOST_ONCE.value(), callback.getQoS());
|
assertEquals(MqttQoS.AT_MOST_ONCE.value(), callback.getQoS());
|
||||||
@ -95,7 +95,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractM
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
|
|
||||||
String result = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
String result = doPostAsync("/api/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
||||||
String expected = "{\"value1\":\"A\",\"value2\":\"B\"}";
|
String expected = "{\"value1\":\"A\",\"value2\":\"B\"}";
|
||||||
latch.await(3, TimeUnit.SECONDS);
|
latch.await(3, TimeUnit.SECONDS);
|
||||||
Assert.assertEquals(expected, result);
|
Assert.assertEquals(expected, result);
|
||||||
@ -130,7 +130,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractM
|
|||||||
|
|
||||||
String setGpioRequest = "{\"method\": \"toggle_gpio\", \"params\": {\"pin\":1}}";
|
String setGpioRequest = "{\"method\": \"toggle_gpio\", \"params\": {\"pin\":1}}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
String result = doPostAsync("/api/plugins/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
String result = doPostAsync("/api/rpc/oneway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
||||||
Assert.assertTrue(StringUtils.isEmpty(result));
|
Assert.assertTrue(StringUtils.isEmpty(result));
|
||||||
latch.await(3, TimeUnit.SECONDS);
|
latch.await(3, TimeUnit.SECONDS);
|
||||||
assertEquals(MqttQoS.AT_MOST_ONCE.value(), callback.getQoS());
|
assertEquals(MqttQoS.AT_MOST_ONCE.value(), callback.getQoS());
|
||||||
@ -156,7 +156,7 @@ public abstract class AbstractMqttServerSideRpcIntegrationTest extends AbstractM
|
|||||||
|
|
||||||
String setGpioRequest = "{\"method\": \"toggle_gpio\", \"params\": {\"pin\":1}}";
|
String setGpioRequest = "{\"method\": \"toggle_gpio\", \"params\": {\"pin\":1}}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
String result = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
String result = doPostAsync("/api/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
||||||
latch.await(3, TimeUnit.SECONDS);
|
latch.await(3, TimeUnit.SECONDS);
|
||||||
String expected = "{\"success\":true}";
|
String expected = "{\"success\":true}";
|
||||||
assertEquals(expected, result);
|
assertEquals(expected, result);
|
||||||
|
|||||||
@ -131,7 +131,7 @@ public abstract class AbstractMqttServerSideRpcProtoIntegrationTest extends Abst
|
|||||||
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}";
|
String setGpioRequest = "{\"method\":\"setGpio\",\"params\":{\"pin\": \"26\",\"value\": 1}}";
|
||||||
String deviceId = savedDevice.getId().getId().toString();
|
String deviceId = savedDevice.getId().getId().toString();
|
||||||
|
|
||||||
String result = doPostAsync("/api/plugins/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
String result = doPostAsync("/api/rpc/twoway/" + deviceId, setGpioRequest, String.class, status().isOk());
|
||||||
String expected = "{\"payload\":\"{\\\"value1\\\":\\\"A\\\",\\\"value2\\\":\\\"B\\\"}\"}";
|
String expected = "{\"payload\":\"{\\\"value1\\\":\\\"A\\\",\\\"value2\\\":\\\"B\\\"}\"}";
|
||||||
latch.await(3, TimeUnit.SECONDS);
|
latch.await(3, TimeUnit.SECONDS);
|
||||||
Assert.assertEquals(expected, result);
|
Assert.assertEquals(expected, result);
|
||||||
|
|||||||
@ -267,7 +267,7 @@ public class MqttClientTest extends AbstractContainerTest {
|
|||||||
ListenableFuture<ResponseEntity> future = service.submit(() -> {
|
ListenableFuture<ResponseEntity> future = service.submit(() -> {
|
||||||
try {
|
try {
|
||||||
return restClient.getRestTemplate()
|
return restClient.getRestTemplate()
|
||||||
.postForEntity(HTTPS_URL + "/api/plugins/rpc/twoway/{deviceId}",
|
.postForEntity(HTTPS_URL + "/api/rpc/twoway/{deviceId}",
|
||||||
mapper.readTree(serverRpcPayload.toString()), String.class,
|
mapper.readTree(serverRpcPayload.toString()), String.class,
|
||||||
device.getId());
|
device.getId());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|||||||
@ -263,7 +263,7 @@ public class MqttGatewayClientTest extends AbstractContainerTest {
|
|||||||
ListenableFuture<ResponseEntity> future = service.submit(() -> {
|
ListenableFuture<ResponseEntity> future = service.submit(() -> {
|
||||||
try {
|
try {
|
||||||
return restClient.getRestTemplate()
|
return restClient.getRestTemplate()
|
||||||
.postForEntity(HTTPS_URL + "/api/plugins/rpc/twoway/{deviceId}",
|
.postForEntity(HTTPS_URL + "/api/rpc/twoway/{deviceId}",
|
||||||
mapper.readTree(serverRpcPayload.toString()), String.class,
|
mapper.readTree(serverRpcPayload.toString()), String.class,
|
||||||
createdDevice.getId());
|
createdDevice.getId());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|||||||
@ -1811,12 +1811,12 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void handleOneWayDeviceRPCRequest(DeviceId deviceId, JsonNode requestBody) {
|
public void handleOneWayDeviceRPCRequest(DeviceId deviceId, JsonNode requestBody) {
|
||||||
restTemplate.postForLocation(baseURL + "/api/plugins/rpc/oneway/{deviceId}", requestBody, deviceId.getId());
|
restTemplate.postForLocation(baseURL + "/api/rpc/oneway/{deviceId}", requestBody, deviceId.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonNode handleTwoWayDeviceRPCRequest(DeviceId deviceId, JsonNode requestBody) {
|
public JsonNode handleTwoWayDeviceRPCRequest(DeviceId deviceId, JsonNode requestBody) {
|
||||||
return restTemplate.exchange(
|
return restTemplate.exchange(
|
||||||
baseURL + "/api/plugins/rpc/twoway/{deviceId}",
|
baseURL + "/api/rpc/twoway/{deviceId}",
|
||||||
HttpMethod.POST,
|
HttpMethod.POST,
|
||||||
new HttpEntity<>(requestBody),
|
new HttpEntity<>(requestBody),
|
||||||
new ParameterizedTypeReference<JsonNode>() {
|
new ParameterizedTypeReference<JsonNode>() {
|
||||||
|
|||||||
@ -130,11 +130,11 @@ export class DeviceService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public sendOneWayRpcCommand(deviceId: string, requestBody: any, config?: RequestConfig): Observable<any> {
|
public sendOneWayRpcCommand(deviceId: string, requestBody: any, config?: RequestConfig): Observable<any> {
|
||||||
return this.http.post<Device>(`/api/plugins/rpc/oneway/${deviceId}`, requestBody, defaultHttpOptionsFromConfig(config));
|
return this.http.post<Device>(`/api/rpc/oneway/${deviceId}`, requestBody, defaultHttpOptionsFromConfig(config));
|
||||||
}
|
}
|
||||||
|
|
||||||
public sendTwoWayRpcCommand(deviceId: string, requestBody: any, config?: RequestConfig): Observable<any> {
|
public sendTwoWayRpcCommand(deviceId: string, requestBody: any, config?: RequestConfig): Observable<any> {
|
||||||
return this.http.post<Device>(`/api/plugins/rpc/twoway/${deviceId}`, requestBody, defaultHttpOptionsFromConfig(config));
|
return this.http.post<Device>(`/api/rpc/twoway/${deviceId}`, requestBody, defaultHttpOptionsFromConfig(config));
|
||||||
}
|
}
|
||||||
|
|
||||||
public findByQuery(query: DeviceSearchQuery,
|
public findByQuery(query: DeviceSearchQuery,
|
||||||
|
|||||||
@ -47,7 +47,7 @@ export class GlobalHttpInterceptor implements HttpInterceptor {
|
|||||||
|
|
||||||
private internalUrlPrefixes = [
|
private internalUrlPrefixes = [
|
||||||
'/api/auth/token',
|
'/api/auth/token',
|
||||||
'/api/plugins/rpc'
|
'/api/rpc'
|
||||||
];
|
];
|
||||||
|
|
||||||
private activeRequests = 0;
|
private activeRequests = 0;
|
||||||
@ -142,7 +142,7 @@ export class GlobalHttpInterceptor implements HttpInterceptor {
|
|||||||
}
|
}
|
||||||
} else if (errorResponse.status === 0 || errorResponse.status === -1) {
|
} else if (errorResponse.status === 0 || errorResponse.status === -1) {
|
||||||
this.showError('Unable to connect');
|
this.showError('Unable to connect');
|
||||||
} else if (!req.url.startsWith('/api/plugins/rpc')) {
|
} else if (!req.url.startsWith('/api/plugins/rpc') && !req.url.startsWith('/api/rpc')) {
|
||||||
if (errorResponse.status === 404) {
|
if (errorResponse.status === 404) {
|
||||||
if (!ignoreErrors) {
|
if (!ignoreErrors) {
|
||||||
this.showError(req.method + ': ' + req.url + '<br/>' +
|
this.showError(req.method + ': ' + req.url + '<br/>' +
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user