ed3db42862b9a5045137438a130a90a5c532efc2
[ccsdk/cds.git] /
1 /*
2 ============LICENSE_START==========================================
3 ===================================================================
4 Copyright (C) 2019 Orange. All rights reserved.
5 ===================================================================
6
7 Unless otherwise specified, all software contained herein is licensed
8 under the Apache License, Version 2.0 (the License);
9 you may not use this software except in compliance with the License.
10 You may obtain a copy of the License at
11
12     http://www.apache.org/licenses/LICENSE-2.0
13
14 Unless required by applicable law or agreed to in writing, software
15 distributed under the License is distributed on an "AS IS" BASIS,
16 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 See the License for the specific language governing permissions and
18 limitations under the License.
19 ============LICENSE_END============================================
20 */
21
22 import {Injectable} from '@angular/core';
23
24 import {Observable, Subject} from 'rxjs';
25 import {ApiService} from '../../../../common/core/services/api.service';
26 import {BlueprintURLs, ResourceDictionaryURLs} from '../../../../common/constants/app-constants';
27 import {PackagesApiService} from '../packages-api.service';
28 import {PackagesStore} from '../packages.store';
29 import {ResourceDictionary} from './mapping-models/ResourceDictionary.model';
30 import {FilesContent, FolderNodeElement} from './mapping-models/metadata/MetaDataTab.model';
31 import {PackageCreationModes} from './creationModes/PackageCreationModes';
32 import {PackageCreationBuilder} from './creationModes/PackageCreationBuilder';
33 import {PackageCreationStore} from './package-creation.store';
34 import {CBAPackage} from './mapping-models/CBAPacakge.model';
35 import {PackageCreationUtils} from './package-creation.utils';
36 import * as JSZip from 'jszip';
37 import {DesignerStore} from '../designer/designer.store';
38
39 @Injectable({
40     providedIn: 'root'
41 })
42 export class PackageCreationService {
43     private cbaPackage: CBAPackage;
44     folder: FolderNodeElement = new FolderNodeElement();
45     filesData: any = [];
46     zipFile: JSZip = new JSZip();
47
48     constructor(private api: ApiService, private packagesListService: PackagesApiService,
49                 private packagesStore: PackagesStore, private designerStore: DesignerStore,
50                 private packageCreationStore: PackageCreationStore, private packageCreationUtils: PackageCreationUtils
51     ) {
52         this.packageCreationStore.state$.subscribe(
53             cbaPackage => {
54                 this.cbaPackage = cbaPackage;
55             });
56     }
57
58     private saveBlueprint(body: any | null, options?: any): Observable<string> {
59         return this.api.post(BlueprintURLs.save, body, {responseType: 'text'});
60     }
61
62     private enrichBlueprint(body: any | null, options?: any): Observable<any> {
63         return this.api.post(BlueprintURLs.enrich, body, {responseType: 'blob'});
64     }
65
66     private deployBluePrint(body: any | null, options?: any): Observable<any> {
67         return this.api.post(BlueprintURLs.deploy, body, {responseType: 'text'});
68     }
69
70     async checkBluePrintNameAndVersion(name: string, version: string): Promise<boolean> {
71         return await this.packagesListService.checkBluePrintIfItExists(name, version)
72             .then(bluePrintModelsResult => bluePrintModelsResult != null && bluePrintModelsResult.length > 0);
73     }
74
75     refreshPackages() {
76         this.packagesStore.getAll();
77     }
78
79     public savePackage(blob): Observable<string> {
80         const formData = this.getFormData(blob);
81         return this.saveBlueprint(formData);
82     }
83
84     enrichPackage(blob) {
85         const formData = this.getFormData(blob);
86         return this.enrichBlueprint(formData);
87     }
88
89     deploy(blob) {
90         const formData = this.getFormData(blob);
91         return this.deployBluePrint(formData);
92     }
93
94     private getFormData(blob) {
95         const formData = new FormData();
96         formData.append('file', blob);
97         return formData;
98     }
99
100     getTemplateAndMapping(variables: string[]): Observable<ResourceDictionary[]> {
101         return this.api.post(ResourceDictionaryURLs.searchResourceDictionaryByNames, variables);
102     }
103
104     downloadPackage(id) {
105         return this.api.getCustomized(BlueprintURLs.download + id, {responseType: 'blob'});
106     }
107
108     public saveBluePrintToDataBase(): Observable<string> {
109         this.formTreeData();
110         this.create();
111         const subject = new Subject<any>();
112         this.zipFile.generateAsync({type: 'blob'})
113             .then(blob => {
114                 this.savePackage(blob).subscribe(bluePrintModel => {
115                     subject.next(bluePrintModel);
116                 });
117             });
118         return subject.asObservable();
119     }
120
121     public deployCurrentPackage() {
122         this.formTreeData();
123         this.create();
124         const subject = new Subject<any>();
125         this.zipFile.generateAsync({type: 'blob'})
126             .then(blob => {
127                 this.deploy(blob).subscribe(bluePrintModel => {
128                     subject.next(bluePrintModel);
129                 });
130             });
131         return subject.asObservable();
132     }
133
134     public enrichCurrentPackage() {
135         this.formTreeData();
136         this.create();
137         const subject = new Subject<any>();
138         return this.zipFile.generateAsync({type: 'blob'})
139             .then(blob => {
140                 return this.enrichPackage(blob).pipe();
141             });
142         //  return subject.asObservable();
143
144     }
145
146     private create() {
147         this.zipFile = new JSZip();
148         FilesContent.getMapOfFilesNamesAndContent().forEach((value, key) => {
149             this.zipFile.folder(key.split('/')[0]);
150             this.zipFile.file(key, value);
151         });
152
153     }
154
155     private formTreeData() {
156
157         FilesContent.clear();
158         let packageCreationModes: PackageCreationModes;
159         this.cbaPackage = PackageCreationModes.mapModeType(this.cbaPackage);
160         this.cbaPackage.metaData = PackageCreationModes.setEntryPoint(this.cbaPackage.metaData);
161         packageCreationModes = PackageCreationBuilder.getCreationMode(this.cbaPackage);
162         this.designerStore.state$.subscribe(state => {
163             this.cbaPackage.templateTopology.content = this.packageCreationUtils.transformToJson(state.template);
164         });
165         packageCreationModes.execute(this.cbaPackage, this.packageCreationUtils);
166         this.filesData.push(this.folder.TREE_DATA);
167     }
168
169 }