Passed
Pull Request — master (#6)
by Pawel
02:32
created

MappingHelpers.ts ➔ createNetworkFromServices   A

Complexity

Conditions 1

Size

Total Lines 11
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 10
dl 0
loc 11
rs 9.9
c 0
b 0
f 0
cc 1
1
import { DependencyLink, DependencyNode, Network, Service } from '../../components/types';
2
import { ServiceDto } from '../../api/api.types';
3
4
export function mapServiceDtoToService(serviceDto: ServiceDto): Service {
5
    const service: Service = {
6
        name: serviceDto.name,
7
        version: serviceDto.version,
8
        capabilities: {},
9
        expectations: {},
10
    };
11
12
    const { expectations, capabilities } = serviceDto;
13
14
    const providerServices = Object.keys(expectations);
15
16
    providerServices.forEach((serviceName: string) => {
17
        service.expectations[serviceName] = {};
18
        const types = Object.keys(expectations[serviceName]);
19
20
        types.forEach((type: string) => {
21
            service.expectations[serviceName][type] = {
22
                ...expectations[serviceName][type],
23
                value: JSON.parse(expectations[serviceName][type].value),
24
            };
25
        });
26
    });
27
28
    const capabilityTypes = Object.keys(capabilities);
29
30
    capabilityTypes.forEach((type: string) => {
31
        service.capabilities[type] = {
32
            ...capabilities[type],
33
            value: JSON.parse(capabilities[type].value),
34
        };
35
    });
36
37
    return service;
38
}
39
40
export function createLinks(nodes: DependencyNode[], services: Service[]): DependencyLink[] {
41
    return services.reduce((links: DependencyLink[], service: Service) => {
42
        const linksWithTypes: DependencyLink[] = [];
43
        const providerNames = Object.keys(service.expectations);
44
        const sourceNode = nodes.find((node: DependencyNode) => node.name === service.name && node.version === service.version);
45
        providerNames.forEach((name: string) => {
46
            const targetNode = nodes.find((node: DependencyNode) => node.name === name);
47
48
            Object.keys(service.expectations[name]).forEach((connectionType: string) => {
49
                if (sourceNode && targetNode) {
50
                    linksWithTypes.push({
51
                        source: sourceNode,
52
                        target: targetNode,
53
                        type: connectionType,
54
                    });
55
                }
56
            });
57
        });
58
59
        return [...links, ...linksWithTypes];
60
    }, []);
61
}
62
63
export function createNetworkFromServices(services: Service[]): Network {
64
    const nodes = services.map((service: Service) => ({
65
        name: service.name,
66
        version: service.version,
67
        isProvider: Object.keys(service.capabilities).length > 0,
68
        isConsumer: Object.keys(service.expectations).length > 0,
69
    }));
70
    return {
71
        nodes,
72
        links: createLinks(nodes, services),
73
    };
74
}
75
76
export function filterConnectedNodes(network: Network) {
77
    return network.nodes.filter(
78
        (node: DependencyNode) =>
79
            network.links.findIndex(
80
                (link: DependencyLink) =>
81
                    (link.source.name === node.name && link.source.version === node.version) ||
82
                    (link.target.name === node.name && link.target.version === node.version)
83
            ) >= 0
84
    );
85
}
86