10 changed files with 972 additions and 141 deletions
@ -0,0 +1,103 @@ |
|||
///
|
|||
/// Copyright © 2016-2019 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.
|
|||
///
|
|||
|
|||
import { Injectable } from '@angular/core'; |
|||
import { HttpClient } from '@angular/common/http'; |
|||
import { ComponentDescriptor, ComponentType } from '@shared/models/component-descriptor.models'; |
|||
import { defaultHttpOptionsFromConfig, RequestConfig } from '@core/http/http-utils'; |
|||
import { Observable, of } from 'rxjs'; |
|||
import { RuleChainMetaData } from '@shared/models/rule-chain.models'; |
|||
import { tap, map } from 'rxjs/operators'; |
|||
import { RuleNodeType } from '@shared/models/rule-node.models'; |
|||
|
|||
@Injectable({ |
|||
providedIn: 'root' |
|||
}) |
|||
export class ComponentDescriptorService { |
|||
|
|||
private componentsByType: Map<ComponentType | RuleNodeType, Array<ComponentDescriptor>> = |
|||
new Map<ComponentType, Array<ComponentDescriptor>>(); |
|||
private componentsByClazz: Map<string, ComponentDescriptor> = new Map<string, ComponentDescriptor>(); |
|||
|
|||
constructor( |
|||
private http: HttpClient |
|||
) { |
|||
} |
|||
|
|||
public getComponentDescriptorsByType(componentType: ComponentType, config?: RequestConfig): Observable<Array<ComponentDescriptor>> { |
|||
const existing = this.componentsByType.get(componentType); |
|||
if (existing) { |
|||
return of(existing); |
|||
} else { |
|||
return this.http.get<Array<ComponentDescriptor>>(`/api/components/${componentType}`, defaultHttpOptionsFromConfig(config)).pipe( |
|||
map((componentDescriptors) => { |
|||
this.componentsByType.set(componentType, componentDescriptors); |
|||
componentDescriptors.forEach((componentDescriptor) => { |
|||
this.componentsByClazz.set(componentDescriptor.clazz, componentDescriptor); |
|||
}); |
|||
return componentDescriptors; |
|||
}) |
|||
); |
|||
} |
|||
} |
|||
|
|||
public getComponentDescriptorsByTypes(componentTypes: Array<ComponentType>, |
|||
config?: RequestConfig): Observable<Array<ComponentDescriptor>> { |
|||
let result: ComponentDescriptor[] = []; |
|||
for (let i = componentTypes.length - 1; i >= 0; i--) { |
|||
const componentType = componentTypes[i]; |
|||
const componentDescriptors = this.componentsByType.get(componentType); |
|||
if (componentDescriptors) { |
|||
result = result.concat(componentDescriptors); |
|||
componentTypes.splice(i, 1); |
|||
} |
|||
} |
|||
if (!componentTypes.length) { |
|||
return of(result); |
|||
} else { |
|||
return this.http.get<Array<ComponentDescriptor>>(`/api/components?componentTypes=${componentTypes.join(',')}`, |
|||
defaultHttpOptionsFromConfig(config)).pipe( |
|||
map((componentDescriptors) => { |
|||
componentDescriptors.forEach((componentDescriptor) => { |
|||
let componentsList = this.componentsByType.get(componentDescriptor.type); |
|||
if (!componentsList) { |
|||
componentsList = new Array<ComponentDescriptor>(); |
|||
this.componentsByType.set(componentDescriptor.type, componentsList); |
|||
} |
|||
componentsList.push(componentDescriptor); |
|||
this.componentsByClazz.set(componentDescriptor.clazz, componentDescriptor); |
|||
}); |
|||
result = result.concat(componentDescriptors); |
|||
return result; |
|||
}) |
|||
); |
|||
} |
|||
} |
|||
|
|||
public getComponentDescriptorByClazz(componentDescriptorClazz: string, config?: RequestConfig): Observable<ComponentDescriptor> { |
|||
const existing = this.componentsByClazz.get(componentDescriptorClazz); |
|||
if (existing) { |
|||
return of(existing); |
|||
} else { |
|||
return this.http.get<ComponentDescriptor>(`/api/component/${componentDescriptorClazz}`, defaultHttpOptionsFromConfig(config)).pipe( |
|||
map((componentDescriptor) => { |
|||
this.componentsByClazz.set(componentDescriptorClazz, componentDescriptor); |
|||
return componentDescriptor; |
|||
}) |
|||
); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,49 @@ |
|||
///
|
|||
/// Copyright © 2016-2019 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.
|
|||
///
|
|||
|
|||
import { FcNode, FcEdge, FcModel } from 'ngx-flowchart/dist/ngx-flowchart'; |
|||
import { RuleNodeComponentDescriptor, RuleNodeConfiguration } from '@shared/models/rule-node.models'; |
|||
import { RuleNodeId } from '@app/shared/models/id/rule-node-id'; |
|||
import { RuleChainId } from '@shared/models/id/rule-chain-id'; |
|||
|
|||
export interface FcRuleNodeType extends FcNode { |
|||
component: RuleNodeComponentDescriptor; |
|||
nodeClass: string; |
|||
icon: string; |
|||
iconUrl?: string; |
|||
} |
|||
|
|||
export interface FcRuleNodeTypeModel extends FcModel { |
|||
nodes: Array<FcRuleNodeType>; |
|||
} |
|||
|
|||
export interface FcRuleNode extends FcRuleNodeType { |
|||
ruleNodeId?: RuleNodeId; |
|||
additionalInfo?: any; |
|||
configuration?: RuleNodeConfiguration; |
|||
debugMode?: boolean; |
|||
targetRuleChainId?: string; |
|||
error?: string; |
|||
} |
|||
|
|||
export interface FcRuleEdge extends FcEdge { |
|||
labels?: string[]; |
|||
} |
|||
|
|||
export interface FcRuleNodeModel extends FcModel { |
|||
nodes: Array<FcRuleNode>; |
|||
edges: Array<FcRuleEdge>; |
|||
} |
|||
@ -0,0 +1,39 @@ |
|||
///
|
|||
/// Copyright © 2016-2019 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.
|
|||
///
|
|||
|
|||
import { RuleNodeType } from '@shared/models/rule-node.models'; |
|||
|
|||
export enum ComponentType { |
|||
ENRICHMENT = 'ENRICHMENT', |
|||
FILTER = 'FILTER', |
|||
TRANSFORMATION = 'TRANSFORMATION', |
|||
ACTION = 'ACTION', |
|||
EXTERNAL = 'EXTERNAL' |
|||
} |
|||
|
|||
export enum ComponentScope { |
|||
SYSTEM = 'SYSTEM', |
|||
TENANT = 'TENANT' |
|||
} |
|||
|
|||
export interface ComponentDescriptor { |
|||
type: ComponentType | RuleNodeType; |
|||
scope?: ComponentScope; |
|||
name: string; |
|||
clazz: string; |
|||
configurationDescriptor?: any; |
|||
actions?: string; |
|||
} |
|||
Loading…
Reference in new issue