Catalog alignment
[sdc.git] / catalog-ui / src / app / ng2 / pages / composition / palette / services / palette.service.ts
1 import { HttpClient, HttpParams } from '@angular/common/http';
2 import { Inject, Injectable } from '@angular/core';
3 import { LeftPaletteComponent, LeftPaletteMetadataTypes } from 'app/models/components/displayComponent';
4 import { GroupMetadata } from 'app/models/group-metadata';
5 import { PolicyMetadata } from 'app/models/policy-metadata';
6 import { SdcConfigToken } from 'app/ng2/config/sdc-config.config';
7 import { ISdcConfig } from 'app/ng2/config/sdc-config.config.factory';
8 import { WorkspaceService } from 'app/ng2/pages/workspace/workspace.service';
9 import 'rxjs/add/observable/forkJoin';
10 import { Observable } from 'rxjs/Rx';
11 import Dictionary = _.Dictionary;
12
13
14
15 @Injectable()
16 export class CompositionPaletteService {
17
18     protected baseUrl = '';
19
20     private leftPaletteComponents: Dictionary<Dictionary<LeftPaletteComponent[]>>;
21     private facadeUrl: string;
22     constructor(protected http: HttpClient, @Inject(SdcConfigToken) sdcConfig: ISdcConfig, private workspaceService: WorkspaceService) {
23         this.baseUrl = sdcConfig.api.root + sdcConfig.api.component_api_root;
24         this.facadeUrl = sdcConfig.api.uicache_root + sdcConfig.api.GET_uicache_left_palette;
25
26     }
27
28     public subscribeToLeftPaletteElements(next, error) {
29
30         let params = new HttpParams();
31         params = params.append('internalComponentType', this.workspaceService.getMetadataType());
32
33         const loadInstances = this.http.get(this.facadeUrl, {params});
34         const loadGroups = this.http.get(this.baseUrl + 'groupTypes', {params});
35         const loadPolicies = this.http.get(this.baseUrl + 'policyTypes', {params});
36
37         Observable.forkJoin(
38             loadInstances, loadGroups, loadPolicies
39         ).subscribe( ([resInstances, resGrouops, resPolicies]) => {
40             const combinedDictionary = this.combineResoponses(resInstances, resGrouops, resPolicies);
41             this.leftPaletteComponents = combinedDictionary;
42             next(this.leftPaletteComponents);
43         });
44     }
45
46     public getLeftPaletteElements = (): Dictionary<Dictionary<LeftPaletteComponent[]>> => {
47         return this.leftPaletteComponents;
48     }
49
50
51     public convertPoliciesOrGroups = (paletteListResult, type: string ) => {
52         const components: LeftPaletteComponent[] = [];
53
54         if (type === 'Policies') {
55             _.forEach(paletteListResult, (policyMetadata: PolicyMetadata) => {
56                 components.push(new LeftPaletteComponent(LeftPaletteMetadataTypes.Policy, policyMetadata));
57             });
58             return {
59                 Policies: components
60             };
61         }
62
63         if (type === 'Groups') {
64             _.forEach(paletteListResult, (groupMetadata: GroupMetadata) => {
65                 const item = new LeftPaletteComponent(LeftPaletteMetadataTypes.Group, groupMetadata);
66                 components.push(item);
67             });
68             return {
69                 Groups: components
70             };
71         }
72
73         return {};
74     }
75
76     private combineResoponses(resInstances: object, resGrouops: object, resPolicies: object) {
77         const retValObject = {};
78         // Generic will be the 1st category in the left Pallete
79         if (resInstances['Generic']) {
80             retValObject['Generic'] = resInstances['Generic'];
81         }
82         // Add all other categories
83         for (const category in resInstances) {
84             if (category === 'Generic') {
85                 continue;
86             }
87             retValObject[category] = resInstances[category];
88         }
89
90         // Add Groups
91         retValObject["Groups"] = this.convertPoliciesOrGroups(resGrouops, 'Groups');
92
93         // Add policies
94         retValObject["Policies"] = this.convertPoliciesOrGroups(resPolicies, 'Policies');
95
96         return retValObject;
97     }
98 }