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