Passed
Pull Request — master (#17)
by
unknown
03:15
created

src/utils/helpers/MappingHelpers.ts   A

Complexity

Total Complexity 8
Complexity/F 1.6

Size

Lines of Code 114
Function Count 5

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 8
eloc 91
mnd 3
bc 3
fnc 5
dl 0
loc 114
rs 10
bpm 0.6
cpm 1.6
noi 0
c 0
b 0
f 0

5 Functions

Rating   Name   Duplication   Size   Complexity  
A MappingHelpers.ts ➔ mapServiceDtoToService 0 35 1
A MappingHelpers.ts ➔ createLinks 0 26 3
A MappingHelpers.ts ➔ mapServicesToTreeNodes 0 23 2
A MappingHelpers.ts ➔ createNetworkFromServices 0 14 1
A MappingHelpers.ts ➔ filterConnectedNodes 0 5 1
1
import { DependencyLink, DependencyNode, Network, Service, TreeNode } from '../../components/types';
2
import { ServiceDto } from '../../api/api.types';
3
import { compareNodes } from './GraphHelpers';
4
5
export function mapServiceDtoToService(serviceDto: ServiceDto): Service {
6
    const service: Service = {
7
        name: serviceDto.name,
8
        version: serviceDto.version,
9
        capabilities: {},
10
        expectations: {},
11
    };
12
13
    const { expectations, capabilities } = serviceDto;
14
15
    const providerServices = Object.keys(expectations);
16
17
    providerServices.forEach((serviceName: string) => {
18
        service.expectations[serviceName] = {};
19
        const types = Object.keys(expectations[serviceName]);
20
21
        types.forEach((type: string) => {
22
            service.expectations[serviceName][type] = {
23
                ...expectations[serviceName][type],
24
                value: JSON.parse(expectations[serviceName][type].value),
25
            };
26
        });
27
    });
28
29
    const capabilityTypes = Object.keys(capabilities);
30
31
    capabilityTypes.forEach((type: string) => {
32
        service.capabilities[type] = {
33
            ...capabilities[type],
34
            value: JSON.parse(capabilities[type].value),
35
        };
36
    });
37
38
    return service;
39
}
40
41
export function createLinks(nodes: DependencyNode[], services: Service[]): DependencyLink[] {
42
    return services.reduce((links: DependencyLink[], service: Service) => {
43
        const linksWithTypes: DependencyLink[] = [];
44
        const providerNames = Object.keys(service.expectations);
45
        const serviceSourceNode = nodes.find((node: DependencyNode) => compareNodes(node, service));
46
47
        providerNames.forEach((name: string) => {
48
            const targetNode = nodes.find((node: DependencyNode) => node.name === name);
49
            if (serviceSourceNode && targetNode) {
50
                serviceSourceNode.links.push(targetNode);
51
                targetNode.links.push(serviceSourceNode);
52
            }
53
            Object.keys(service.expectations[name]).forEach((connectionType: string) => {
54
                if (serviceSourceNode && targetNode) {
55
                    linksWithTypes.push({
56
                        source: serviceSourceNode,
57
                        target: targetNode,
58
                        type: connectionType,
59
                    });
60
                }
61
            });
62
        });
63
64
        return [...links, ...linksWithTypes];
65
    }, []);
66
}
67
68
export function createNetworkFromServices(services: Service[]): Network {
69
    const nodes = services.map((service: Service) => ({
70
        name: service.name,
71
        version: service.version,
72
        isProvider: Object.keys(service.capabilities).length > 0,
73
        isConsumer: Object.keys(service.expectations).length > 0,
74
        links: [],
75
        level: 0,
76
    }));
77
    return {
78
        nodes,
79
        links: createLinks(nodes, services),
80
        detailsNodes: mapServicesToTreeNodes(services),
81
    };
82
}
83
84
export function filterConnectedNodes(network: Network) {
85
    return network.nodes.filter(
86
        (node: DependencyNode) =>
87
            network.links.findIndex((link: DependencyLink) => compareNodes(link.source, node) || compareNodes(link.target, node)) >= 0
88
    );
89
}
90
91
export function mapServicesToTreeNodes(services: Service[]): TreeNode[] {
92
    const allNodes: TreeNode[] = services.map(service => ({
93
        name: service.name,
94
        consumers: [],
95
        providers: [],
96
    }));
97
98
    return services.reduce((nodes: TreeNode[], service: Service) => {
99
        const node = allNodes.find(node => node.name === service.name)!;
100
        const providerNames = Object.keys(service.expectations);
101
102
        providerNames.forEach((name: string) => {
103
            const providerNode = allNodes.find(targetNode => targetNode.name === name);
104
105
            if (providerNode) {
106
                node.providers.push(providerNode);
107
                providerNode.consumers.push(node);
108
            }
109
        });
110
111
        return [...nodes, node];
112
    }, [] as TreeNode[]);
113
}
114