2018-03-14 20:43:56 +02:00
|
|
|
/*
|
2019-02-01 16:39:33 +02:00
|
|
|
* Copyright © 2016-2019 The Thingsboard Authors
|
2018-03-14 20:43:56 +02:00
|
|
|
*
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
|
|
|
|
export default angular.module('thingsboard.api.ruleChain', [])
|
|
|
|
|
.factory('ruleChainService', RuleChainService).name;
|
|
|
|
|
|
|
|
|
|
/*@ngInject*/
|
2018-03-28 11:03:11 +03:00
|
|
|
function RuleChainService($http, $q, $filter, $ocLazyLoad, $translate, types, componentDescriptorService) {
|
2018-03-21 14:56:16 +02:00
|
|
|
|
2018-03-21 17:34:07 +02:00
|
|
|
var ruleNodeComponents = null;
|
2018-03-14 20:43:56 +02:00
|
|
|
|
|
|
|
|
var service = {
|
|
|
|
|
getRuleChains: getRuleChains,
|
|
|
|
|
getRuleChain: getRuleChain,
|
|
|
|
|
saveRuleChain: saveRuleChain,
|
2018-05-15 17:47:00 +03:00
|
|
|
setRootRuleChain: setRootRuleChain,
|
2018-03-14 20:43:56 +02:00
|
|
|
deleteRuleChain: deleteRuleChain,
|
|
|
|
|
getRuleChainMetaData: getRuleChainMetaData,
|
2018-03-21 14:56:16 +02:00
|
|
|
saveRuleChainMetaData: saveRuleChainMetaData,
|
2018-03-21 17:34:07 +02:00
|
|
|
getRuleNodeComponents: getRuleNodeComponents,
|
|
|
|
|
getRuleNodeComponentByClazz: getRuleNodeComponentByClazz,
|
2018-03-21 14:56:16 +02:00
|
|
|
getRuleNodeSupportedLinks: getRuleNodeSupportedLinks,
|
2018-06-18 14:33:50 +03:00
|
|
|
ruleNodeAllowCustomLinks: ruleNodeAllowCustomLinks,
|
2018-04-05 20:57:09 +03:00
|
|
|
resolveTargetRuleChains: resolveTargetRuleChains,
|
2018-05-14 19:26:40 +03:00
|
|
|
testScript: testScript,
|
|
|
|
|
getLatestRuleNodeDebugInput: getLatestRuleNodeDebugInput
|
2018-03-14 20:43:56 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return service;
|
|
|
|
|
|
2018-05-15 17:47:00 +03:00
|
|
|
function getRuleChains (pageLink, config) {
|
2018-03-14 20:43:56 +02:00
|
|
|
var deferred = $q.defer();
|
2018-05-15 17:47:00 +03:00
|
|
|
var url = '/api/ruleChains?limit=' + pageLink.limit;
|
2018-03-14 20:43:56 +02:00
|
|
|
if (angular.isDefined(pageLink.textSearch)) {
|
|
|
|
|
url += '&textSearch=' + pageLink.textSearch;
|
|
|
|
|
}
|
|
|
|
|
if (angular.isDefined(pageLink.idOffset)) {
|
|
|
|
|
url += '&idOffset=' + pageLink.idOffset;
|
|
|
|
|
}
|
|
|
|
|
if (angular.isDefined(pageLink.textOffset)) {
|
|
|
|
|
url += '&textOffset=' + pageLink.textOffset;
|
|
|
|
|
}
|
|
|
|
|
$http.get(url, config).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-05-15 17:47:00 +03:00
|
|
|
function getRuleChain(ruleChainId, config) {
|
2018-03-14 20:43:56 +02:00
|
|
|
var deferred = $q.defer();
|
2018-05-15 17:47:00 +03:00
|
|
|
var url = '/api/ruleChain/' + ruleChainId;
|
2018-03-14 20:43:56 +02:00
|
|
|
$http.get(url, config).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-05-15 17:47:00 +03:00
|
|
|
function saveRuleChain(ruleChain) {
|
2018-03-14 20:43:56 +02:00
|
|
|
var deferred = $q.defer();
|
2018-05-15 17:47:00 +03:00
|
|
|
var url = '/api/ruleChain';
|
|
|
|
|
$http.post(url, ruleChain).then(function success(response) {
|
2018-03-14 20:43:56 +02:00
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-05-15 17:47:00 +03:00
|
|
|
function setRootRuleChain(ruleChainId) {
|
2018-03-14 20:43:56 +02:00
|
|
|
var deferred = $q.defer();
|
2018-05-15 17:47:00 +03:00
|
|
|
var url = '/api/ruleChain/' + ruleChainId + '/root';
|
|
|
|
|
$http.post(url).then(function success(response) {
|
2018-03-14 20:43:56 +02:00
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function deleteRuleChain(ruleChainId) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/ruleChain/' + ruleChainId;
|
|
|
|
|
$http.delete(url).then(function success() {
|
|
|
|
|
deferred.resolve();
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getRuleChainMetaData(ruleChainId, config) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/ruleChain/' + ruleChainId + '/metadata';
|
|
|
|
|
$http.get(url, config).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function saveRuleChainMetaData(ruleChainMetaData) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/ruleChain/metadata';
|
|
|
|
|
$http.post(url, ruleChainMetaData).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-23 10:41:29 +02:00
|
|
|
function getRuleNodeSupportedLinks(component) {
|
|
|
|
|
var relationTypes = component.configurationDescriptor.nodeDefinition.relationTypes;
|
2018-06-18 14:33:50 +03:00
|
|
|
var linkLabels = {};
|
2018-03-23 10:41:29 +02:00
|
|
|
for (var i=0;i<relationTypes.length;i++) {
|
2018-06-18 14:33:50 +03:00
|
|
|
var label = relationTypes[i];
|
|
|
|
|
linkLabels[label] = {
|
|
|
|
|
name: label,
|
|
|
|
|
value: label
|
|
|
|
|
};
|
2018-03-23 10:41:29 +02:00
|
|
|
}
|
|
|
|
|
return linkLabels;
|
2018-03-21 14:56:16 +02:00
|
|
|
}
|
|
|
|
|
|
2018-06-18 14:33:50 +03:00
|
|
|
function ruleNodeAllowCustomLinks(component) {
|
|
|
|
|
return component.configurationDescriptor.nodeDefinition.customRelations;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-21 17:34:07 +02:00
|
|
|
function getRuleNodeComponents() {
|
2018-03-21 14:56:16 +02:00
|
|
|
var deferred = $q.defer();
|
2018-03-21 17:34:07 +02:00
|
|
|
if (ruleNodeComponents) {
|
|
|
|
|
deferred.resolve(ruleNodeComponents);
|
2018-03-21 14:56:16 +02:00
|
|
|
} else {
|
2018-03-21 17:34:07 +02:00
|
|
|
loadRuleNodeComponents().then(
|
|
|
|
|
(components) => {
|
2018-03-28 11:03:11 +03:00
|
|
|
resolveRuleNodeComponentsUiResources(components).then(
|
|
|
|
|
(components) => {
|
|
|
|
|
ruleNodeComponents = components;
|
|
|
|
|
ruleNodeComponents.push(
|
|
|
|
|
types.ruleChainNodeComponent
|
|
|
|
|
);
|
2018-05-09 10:14:41 +03:00
|
|
|
ruleNodeComponents.sort(
|
|
|
|
|
(comp1, comp2) => {
|
|
|
|
|
var result = comp1.type.localeCompare(comp2.type);
|
|
|
|
|
if (result == 0) {
|
|
|
|
|
result = comp1.name.localeCompare(comp2.name);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
);
|
2018-03-28 11:03:11 +03:00
|
|
|
deferred.resolve(ruleNodeComponents);
|
|
|
|
|
},
|
|
|
|
|
() => {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
}
|
2018-03-21 14:56:16 +02:00
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
() => {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-28 11:03:11 +03:00
|
|
|
function resolveRuleNodeComponentsUiResources(components) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var tasks = [];
|
|
|
|
|
for (var i=0;i<components.length;i++) {
|
|
|
|
|
var component = components[i];
|
|
|
|
|
tasks.push(resolveRuleNodeComponentUiResources(component));
|
|
|
|
|
}
|
|
|
|
|
$q.all(tasks).then(
|
|
|
|
|
(components) => {
|
|
|
|
|
deferred.resolve(components);
|
|
|
|
|
},
|
|
|
|
|
() => {
|
|
|
|
|
deferred.resolve(components);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resolveRuleNodeComponentUiResources(component) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var uiResources = component.configurationDescriptor.nodeDefinition.uiResources;
|
|
|
|
|
if (uiResources && uiResources.length) {
|
|
|
|
|
var tasks = [];
|
|
|
|
|
for (var i=0;i<uiResources.length;i++) {
|
|
|
|
|
var uiResource = uiResources[i];
|
|
|
|
|
tasks.push($ocLazyLoad.load(uiResource));
|
|
|
|
|
}
|
|
|
|
|
$q.all(tasks).then(
|
|
|
|
|
() => {
|
|
|
|
|
deferred.resolve(component);
|
|
|
|
|
},
|
|
|
|
|
() => {
|
|
|
|
|
component.configurationDescriptor.nodeDefinition.uiResourceLoadError = $translate.instant('rulenode.ui-resources-load-error');
|
|
|
|
|
deferred.resolve(component);
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
deferred.resolve(component);
|
|
|
|
|
}
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-21 17:34:07 +02:00
|
|
|
function getRuleNodeComponentByClazz(clazz) {
|
|
|
|
|
var res = $filter('filter')(ruleNodeComponents, {clazz: clazz}, true);
|
2018-03-21 14:56:16 +02:00
|
|
|
if (res && res.length) {
|
2018-03-21 17:34:07 +02:00
|
|
|
return res[0];
|
2018-03-21 14:56:16 +02:00
|
|
|
}
|
2018-06-18 14:33:50 +03:00
|
|
|
var unknownComponent = angular.copy(types.unknownNodeComponent);
|
|
|
|
|
unknownComponent.clazz = clazz;
|
|
|
|
|
unknownComponent.configurationDescriptor.nodeDefinition.details = "Unknown Rule Node class: " + clazz;
|
|
|
|
|
return unknownComponent;
|
2018-03-21 14:56:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resolveTargetRuleChains(ruleChainConnections) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
if (ruleChainConnections && ruleChainConnections.length) {
|
|
|
|
|
var tasks = [];
|
|
|
|
|
for (var i = 0; i < ruleChainConnections.length; i++) {
|
2018-04-02 15:45:48 +03:00
|
|
|
tasks.push(resolveRuleChain(ruleChainConnections[i].targetRuleChainId.id));
|
2018-03-21 14:56:16 +02:00
|
|
|
}
|
|
|
|
|
$q.all(tasks).then(
|
|
|
|
|
(ruleChains) => {
|
|
|
|
|
var ruleChainsMap = {};
|
|
|
|
|
for (var i = 0; i < ruleChains.length; i++) {
|
|
|
|
|
ruleChainsMap[ruleChains[i].id.id] = ruleChains[i];
|
|
|
|
|
}
|
|
|
|
|
deferred.resolve(ruleChainsMap);
|
|
|
|
|
},
|
|
|
|
|
() => {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
deferred.resolve({});
|
|
|
|
|
}
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-04-02 15:45:48 +03:00
|
|
|
function resolveRuleChain(ruleChainId) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
getRuleChain(ruleChainId, {ignoreErrors: true}).then(
|
|
|
|
|
(ruleChain) => {
|
|
|
|
|
deferred.resolve(ruleChain);
|
|
|
|
|
},
|
|
|
|
|
() => {
|
|
|
|
|
deferred.resolve({
|
|
|
|
|
id: {id: ruleChainId, entityType: types.entityType.rulechain}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-21 17:34:07 +02:00
|
|
|
function loadRuleNodeComponents() {
|
|
|
|
|
return componentDescriptorService.getComponentDescriptorsByTypes(types.ruleNodeTypeComponentTypes);
|
2018-03-21 14:56:16 +02:00
|
|
|
}
|
|
|
|
|
|
2018-04-05 20:57:09 +03:00
|
|
|
function testScript(inputParams) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/ruleChain/testScript';
|
|
|
|
|
$http.post(url, inputParams).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
2018-03-21 14:56:16 +02:00
|
|
|
|
2018-05-14 19:26:40 +03:00
|
|
|
function getLatestRuleNodeDebugInput(ruleNodeId) {
|
|
|
|
|
var deferred = $q.defer();
|
|
|
|
|
var url = '/api/ruleNode/' + ruleNodeId + '/debugIn';
|
|
|
|
|
$http.get(url).then(function success(response) {
|
|
|
|
|
deferred.resolve(response.data);
|
|
|
|
|
}, function fail() {
|
|
|
|
|
deferred.reject();
|
|
|
|
|
});
|
|
|
|
|
return deferred.promise;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-14 20:43:56 +02:00
|
|
|
}
|