Add data type view/workspace
[sdc.git] / catalog-ui / src / app / services / data-types-service.ts
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 'use strict';
22 import {DataTypePropertyModel} from "../models/data-type-properties";
23 import {
24     ComponentInstance,
25     DataTypeModel,
26     DataTypesMap,
27     IAppConfigurtaion,
28     InputModel,
29     InputPropertyBase,
30     PropertyModel,
31     SchemaProperty
32 } from "../models";
33 import {PROPERTY_DATA} from "../utils/constants";
34
35 export interface IDataTypesService {
36
37     dataTypes:DataTypesMap; //Data type map
38     selectedPropertiesName:string;
39     selectedInput:PropertyModel;
40     alreadySelectedProperties:Array<InputPropertyBase>;
41     selectedInstance:ComponentInstance;
42     selectedComponentInputs:Array<InputModel>;
43     //declare methods
44     loadDataTypesCache(modelName:string):void;
45     findAllDataTypesByModel(modelName: string): void;
46     getAllDataTypes():DataTypesMap;
47     getFirsLevelOfDataTypeProperties(dataTypeName:string):Array<DataTypePropertyModel>;
48     isDataTypeForSchemaType(property:SchemaProperty):boolean;
49     isDataTypeForPropertyType(property:PropertyModel):boolean;
50     isDataTypeForDataTypePropertyType(property:DataTypePropertyModel):boolean;
51 }
52
53 export class DataTypesService implements IDataTypesService {
54
55     static '$inject' = [
56         'sdcConfig',
57         '$q',
58         '$http'
59     ];
60
61     constructor(private sdcConfig:IAppConfigurtaion,
62                 private $q:ng.IQService,
63                 private $http:ng.IHttpService) {
64     }
65
66     private baseUrl = this.sdcConfig.api.root + this.sdcConfig.api.component_api_root;
67
68     dataTypes:DataTypesMap; //Data type map
69     selectedPropertiesName:string;
70     selectedInput:PropertyModel;
71     alreadySelectedProperties:Array<InputPropertyBase>;
72     selectedInstance:ComponentInstance;
73     selectedComponentInputs:Array<InputModel>;
74
75     public loadDataTypesCache = async (modelName: string): Promise<void> => {
76         let model;
77         if (modelName) {
78             model = {'model': modelName}
79         }
80         await this.$http.get(this.baseUrl + "dataTypes", {params: model})
81         .then((response: any) => {
82             this.dataTypes = response.data;
83             delete this.dataTypes['tosca.datatypes.Root'];
84         });
85     };
86
87     public fetchDataTypesByModel = (modelName: string): angular.IHttpPromise<any> => {
88         let model;
89         if (modelName) {
90             model = {'model': modelName}
91         }
92         return this.$http.get(this.baseUrl + "dataTypes", {params: model});
93     };
94
95     public getAllDataTypesFromModel = (modelName: string): DataTypesMap => {
96         this.loadDataTypesCache(modelName);
97         return this.dataTypes;
98     }
99
100     public findAllDataTypesByModel = (modelName: string): Promise<Map<string, DataTypeModel>> => {
101         return new Promise<Map<string, DataTypeModel>>((resolve, reject) => {
102             this.fetchDataTypesByModel(modelName).then(response => {
103                 const dataTypes = response.data;
104                 delete dataTypes[PROPERTY_DATA.ROOT_DATA_TYPE];
105                 const dataTypeMap = new Map<string, DataTypeModel>();
106                 for(const dataTypeKey of Object.keys(dataTypes)) {
107                     dataTypeMap.set(dataTypeKey, new DataTypeModel(dataTypes[dataTypeKey]))
108                 }
109                 resolve(dataTypeMap);
110             }).catch(reason => {
111                 reject(reason);
112             });
113         });
114     }
115
116     public getAllDataTypes = ():DataTypesMap => {
117         return this.dataTypes;
118     };
119
120     //if the dt derived from simple- return the first parent type, else- return null
121     private getTypeForDataTypeDerivedFromSimple = (dataTypeName:string):string => {
122         /////////temporary hack for tosca primitives///////////////////////
123         if (!this.dataTypes[dataTypeName]) {
124             return 'string';
125         }
126         ///////////////////////////////////////////////////////////////////
127         if (this.dataTypes[dataTypeName].derivedFromName == "tosca.datatypes.Root" || this.dataTypes[dataTypeName].properties) {
128             return null;
129         }
130         if (PROPERTY_DATA.SIMPLE_TYPES.indexOf(this.dataTypes[dataTypeName].derivedFromName) > -1) {
131             return this.dataTypes[dataTypeName].derivedFromName
132         }
133         return this.getTypeForDataTypeDerivedFromSimple(this.dataTypes[dataTypeName].derivedFromName);
134     };
135
136
137     //return list of data type properties and all its parents properties
138     //(not include the properties of its properties, in case this data type has not primitive properties)
139     public getFirsLevelOfDataTypeProperties = (dataTypeName:string):Array<DataTypePropertyModel> => {
140         let properties = this.dataTypes[dataTypeName].properties || [];
141         if (this.dataTypes[dataTypeName].derivedFromName != "tosca.datatypes.Root") {
142             properties = this.getFirsLevelOfDataTypeProperties(this.dataTypes[dataTypeName].derivedFromName).concat(properties);
143         }
144         return properties;
145     };
146
147     //return false when type= data type (=not simple type) that not derived from simple type
148     public isDataTypeForSchemaType = (property:SchemaProperty):boolean=> {
149         property.simpleType = "";
150         if (property.type && PROPERTY_DATA.TYPES.indexOf(property.type) > -1) {
151             return false;
152         }
153         let simpleType = this.getTypeForDataTypeDerivedFromSimple(property.type);
154         if (simpleType) {
155             property.simpleType = simpleType;
156             return false;
157         }
158         return true;
159     };
160
161     public isDataTypeForPropertyType = (property:PropertyModel):boolean=> {
162         property.simpleType = "";
163         if (property.type && PROPERTY_DATA.TYPES.indexOf(property.type) > -1) {
164             return false;
165         }
166         let simpleType = this.getTypeForDataTypeDerivedFromSimple(property.type);
167         if (simpleType) {
168             property.simpleType = simpleType;
169             return false;
170         }
171         return true;
172     };
173
174
175     public isDataTypeForDataTypePropertyType = (property:DataTypePropertyModel):boolean=> {
176         property.simpleType = "";
177         let isScalarForNFoD:boolean = property.type === 'scalar-unit.size';
178         if (property.type && PROPERTY_DATA.TYPES.indexOf(property.type) > -1 || isScalarForNFoD) {
179             return false;
180         }
181         let simpleType = this.getTypeForDataTypeDerivedFromSimple(property.type);
182         if (simpleType) {
183             property.simpleType = simpleType;
184             return false;
185         }
186         return true;
187     };
188 }