3e7e8c1e587782dfe686ea0902aa70c423a64bad
[vid.git] /
1 import {Injectable} from "@angular/core";
2 import {GenericPopupInterface} from "../generic-popup.interface";
3 import {ServiceModel} from "../../../../models/serviceModel";
4 import {ModelInformationItem} from "../../../model-information/model-information.component";
5 import {Subject} from "rxjs";
6 import {ITreeNode} from "angular-tree-component/dist/defs/api";
7 import {FormPopupDetails, PopupType} from "../../../../models/formControlModels/formPopupDetails.model";
8 import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
9 import {IframeService} from "../../../../utils/iframe.service";
10 import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
11 import {AaiService} from "../../../../services/aaiService/aai.service";
12 import {BasicPopupService} from "../basic.popup.service";
13 import {NgRedux} from "@angular-redux/store";
14 import {AppState} from "../../../../store/reducers";
15 import {ServiceControlGenerator} from "../../../genericForm/formControlsServices/service.control.generator";
16 import {FormGroup} from "@angular/forms";
17 import {Constants} from "../../../../utils/constants";
18 import {ServiceInstance} from "../../../../models/serviceInstance";
19 import {ModelInfo} from "../../../../models/modelInfo";
20 import {FormControlModel} from "../../../../models/formControlModels/formControl.model";
21 import {createServiceInstance, updateServiceInstance} from "../../../../storeUtil/utils/service/service.actions";
22 import * as _ from 'lodash';
23 import {Utils} from "../../../../utils/utils";
24
25 @Injectable()
26 export class ServicePopupService implements GenericPopupInterface {
27   dynamicInputs: any;
28   instance: any;
29   model: any;
30   serviceModel: ServiceModel;
31   modelInformations: ModelInformationItem[] = [];
32   uuidData: Object;
33   closeDialogEvent: Subject<any> = new Subject<any>();
34   isUpdateMode: boolean;
35
36
37
38   constructor(private _basicControlGenerator: BasicControlGenerator,
39               private _serviceControlGenerator: ServiceControlGenerator,
40               private _iframeService: IframeService,
41               private _defaultDataGeneratorService: DefaultDataGeneratorService,
42               private _aaiService: AaiService,
43               private _basicPopupService : BasicPopupService,
44               private _store: NgRedux<AppState>) {
45
46   }
47
48   getGenericFormPopupDetails(serviceId: string, modelName: string, storeKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
49     this.uuidData = uuidData;
50     this.instance = this.getInstance(serviceId);
51     this.getModelInformation(serviceId);
52     return new FormPopupDetails(this,
53       PopupType.SERVICE,
54       uuidData,
55       this.getTitle(isUpdateMode),
56       this.getSubLeftTitle(),
57       this.getSubRightTitle(),
58       this.getControls(serviceId),
59       this.getDynamicInputs(serviceId),
60       this.modelInformations,
61       (that, form: FormGroup) => {that.onSubmit(that, form);},
62       (that: any, form: FormGroup) => {
63         that.onCancel(that, form);
64       },
65       (that: any, form: FormGroup) => {
66         that.showPreviousInstantiations(that, form);
67       }
68     );
69   }
70
71   getDynamicInputs(serviceId) : FormControlModel[]{
72     let dynamic = this._defaultDataGeneratorService.getArbitraryInputs(this._store.getState().service.serviceHierarchy[serviceId].service.inputs);
73     return this._basicControlGenerator.getServiceDynamicInputs(dynamic, serviceId);
74   }
75
76
77   getControls(serviceId: string) {
78     if(this._store.getState().service.serviceHierarchy[serviceId].service.vidNotions.instantiationType === 'Macro') {
79       return this._serviceControlGenerator.getMacroFormControls(serviceId, this.dynamicInputs);
80     }else {
81       return this._serviceControlGenerator.getAlaCartControls(serviceId, this.dynamicInputs);
82     }
83   }
84
85   getInstance(serviceId): ServiceInstance {
86     let result: ServiceInstance = null;
87     if(!_.isNil(this._store.getState().service.serviceInstance[serviceId])){
88       result = this._store.getState().service.serviceInstance[serviceId];
89     }
90     return result;
91   }
92
93   getModelInformation(serviceId: string): void {
94     this._aaiService.getServiceModelById(serviceId).subscribe((result: any) => {
95       this.serviceModel = new ServiceModel(result);
96
97       this.model = this._store.getState().service.serviceHierarchy[serviceId];
98       this.modelInformations = [
99           new ModelInformationItem("Model version", "modelVersion", [this.serviceModel.version], "", true),
100           new ModelInformationItem("Description", "description", [this.serviceModel.description]),
101           new ModelInformationItem("Category", "category", [this.serviceModel.category]),
102           new ModelInformationItem("UUID", "uuid", [this.serviceModel.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
103           new ModelInformationItem("Invariant UUID", "invariantUuid", [this.serviceModel.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
104           new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
105           new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole])
106       ];
107     });
108   }
109
110   getSubLeftTitle(): string {
111     return this._store.getState().service.serviceHierarchy[this.uuidData['serviceId']].service.name;
112   }
113
114   getSubRightTitle(): string {
115     return "Service Instance Details";
116   }
117
118   getTitle(isUpdateMode: boolean): string {
119     return isUpdateMode ? "Edit service instance" :  "Set a new service instance";
120   }
121
122   onCancel(that, form): void {
123     form.reset();
124     that._iframeService.removeClassCloseModal('content');
125     this.closeDialogEvent.next(that);
126   }
127
128   onSubmit(that, form: FormGroup, ...args): void {
129     form = that.updateExtraValues(that, form);
130     that.storeServiceInstance(form.value, args[0], [], new ModelInfo(that.serviceModel), that.serviceModel);
131     const eventId = 'submitIframe';
132     this.postMessageToWindowParent(eventId, that.serviceModel.uuid);
133     this.onCancel(that, form);
134   }
135
136   showPreviousInstantiations(that, form: FormGroup,): void {
137     const eventId = 'showPreviousInstantiations';
138     this.postMessageToWindowParent(eventId, that.serviceModel.uuid);
139     this.onCancel(that, form);
140   }
141
142   private postMessageToWindowParent(eventId: string, serviceModelId:string) {
143     window.parent.postMessage({
144       eventId: eventId,
145       data: {
146         serviceModelId
147       }
148     }, "*");
149   }
150
151   updateExtraValues = (that, form) : any => {
152     const service = that._store.getState().service;
153     form.value['bulkSize'] = that.uuidData['bulkSize'];
154     form.value['instanceParams'] = form.value['instanceParams'] && [form.value['instanceParams']];
155     form.value['aicZoneName'] = !_.isNil(form.value['aicZoneId']) ?this.getNameFromListById(service.aicZones, form.value['aicZoneId']) : null;
156     form.value['owningEntityName'] = !_.isNil(form.value['owningEntityId']) ?this.getNameFromListById(service.categoryParameters.owningEntityList, form.value['owningEntityId']) : null;
157     form.value['testApi'] = sessionStorage.getItem("msoRequestParametersTestApiValue");
158     form.value['tenantName'] = this.getNameFromListById(service.lcpRegionsAndTenants.lcpRegionsTenantsMap[form.value['lcpCloudRegionId']], form.value['tenantId']);
159     return form;
160   };
161
162   getNameFromListById(list, id) {
163     if(list && id) {
164       return list.find(item => item.id === id).name;
165     }
166     return null;
167   }
168
169   storeServiceInstance = (formValues:any, servicesQty:number, dynamicInputs:any, serviceModel:ModelInfo, serviceDetails: any ) => {
170     formValues.bulkSize = this.uuidData['bulkSize'];
171     formValues.modelInfo = serviceModel;
172     let instantiationType = this._store.getState().service.serviceHierarchy[serviceModel.modelVersionId].service.vidNotions.instantiationType;
173     this.setIsALaCarte(formValues, instantiationType);
174     this.setTestApi(formValues);
175     Object.assign(formValues, serviceDetails);
176     let isCreateMode: boolean = this._store.getState().service.serviceInstance[serviceModel.modelVersionId] == null;
177     if(isCreateMode){
178       this._store.dispatch(createServiceInstance(formValues, serviceModel.modelVersionId));
179     }else {
180       this._store.dispatch(updateServiceInstance(formValues, serviceModel.modelVersionId));
181     }
182
183     if (isCreateMode) {
184       this._defaultDataGeneratorService.updateReduxOnFirstSet(serviceModel.modelVersionId, formValues);
185     }
186   };
187
188   setIsALaCarte = (formValues: any, instantiationType) => {
189     formValues.isALaCarte = Utils.isALaCarte(instantiationType);
190   };
191
192   setTestApi = (formValues: any) =>{
193     if (this._store.getState().global.flags['FLAG_ADD_MSO_TESTAPI_FIELD'] && formValues.isAlaCarte) {
194       formValues.testApi = sessionStorage.getItem("msoRequestParametersTestApiValue");
195     }
196   };
197 }