Yangman - update collection saving
[dlux.git] / modules / yangman-resources / src / main / resources / yangman / services / yangman.services.js
index 65f106a01ab03b1a01422b74d4a0d4dc43ffa7a3..c26ac05b718ef8f96a8ba9882d9c230fdc99806e 100644 (file)
@@ -10,6 +10,7 @@ define([], function () {
         'ENV',
         'ParsingJsonService',
         'RequestsService',
+        'PathUtilsService',
 
     ];
 
@@ -19,7 +20,8 @@ define([], function () {
         YangUtilsRestangularService,
         ENV,
         ParsingJsonService,
-        RequestsService
+        RequestsService,
+        PathUtilsService
     ){
         var service = {
             cutUrl: cutUrl,
@@ -27,14 +29,32 @@ define([], function () {
             executeRequestOperation: executeRequestOperation,
             fillNodeFromResponse: fillNodeFromResponse,
             getDataStoreIndex: getDataStoreIndex,
+            handleNodeIdentifier: handleNodeIdentifier,
             prepareAllRequestData: prepareAllRequestData,
             prepareReceivedData: prepareReceivedData,
             putIntoObj: putIntoObj,
+            setSrcDataByDataType: setSrcDataByDataType,
             validateFile: validateFile,
         };
 
         return service;
 
+        /**
+         * Handle param continuum between header path array and node data
+         * @param parametersList
+         * @param selectedSubApi
+         * @param node
+         */
+        function handleNodeIdentifier(parametersList, selectedSubApi, node){
+            var identifier = RequestsService.findIdentifierByParam(
+                parametersList, selectedSubApi.pathArray[selectedSubApi.pathArray.length - 1]
+            );
+
+            if ( identifier ){
+                PathUtilsService.fillListNode(node, identifier.label, identifier.value);
+            }
+        }
+
         /**
          * Put data to output container if root node is rpc
          * @param data
@@ -57,10 +77,12 @@ define([], function () {
          * @param destinationObj
          */
         function putIntoObj(sourceObj, destinationObj, containter){
-            Object.keys(sourceObj).forEach(function(prop){
-                destinationObj[containter] = destinationObj[containter] ? destinationObj[containter] : {};
-                destinationObj[containter][prop] = sourceObj[prop];
-            });
+            if ( sourceObj ) {
+                Object.keys(sourceObj).forEach(function(prop){
+                    destinationObj[containter] = destinationObj[containter] ? destinationObj[containter] : {};
+                    destinationObj[containter][prop] = sourceObj[prop];
+                });
+            }
         }
 
         /**
@@ -78,6 +100,12 @@ define([], function () {
 
                     if ( outputType === 'form' ){
                         var dObj = {};
+
+                        if ( !sData ) {
+                            sData = {};
+                            sData[node.label] = {};
+                        }
+
                         putIntoObj(rData, dObj, node.label);
                         putIntoObj(sData[node.label] ? sData[node.label] : sData, dObj, node.label);
                         return dObj;
@@ -147,6 +175,45 @@ define([], function () {
             return result ? rIndex : null;
         }
 
+        /**
+         * Apply all parametrized values into request (data, url, pathArray)
+         * @param allPreparedData
+         * @param params
+         * @param selSubApiCopy
+         * @param requestUrl
+         */
+        function setParametrizedData(allPreparedData, params, selSubApiCopy, requestUrl){
+            allPreparedData.reqFullUrl = RequestsService.applyParamsToStr(params, requestUrl);
+
+            // apply parametrized value into request data in string form
+            allPreparedData.reqString =
+                selSubApiCopy ? RequestsService.applyParamsToStr(params, selSubApiCopy.buildApiRequestString()) : '';
+
+            if ( !angular.equals(allPreparedData.reqFullUrl, requestUrl) && selSubApiCopy ){
+                // fill parametrized data into path array
+                PathUtilsService.fillPath(selSubApiCopy.pathArray, allPreparedData.reqFullUrl);
+            }
+
+            allPreparedData.reqData = RequestsService.applyParamsToObj(params, allPreparedData.srcData);
+        }
+
+        /**
+         * Set source data into request object based on shown data type
+         * @param allPreparedData
+         * @param node
+         * @param requestData
+         * @param dataType
+         */
+        function setSrcDataByDataType(allPreparedData, node, requestData, dataType){
+            if ( dataType === 'form' && node){
+                node.buildRequest(RequestBuilderService, requestData, node.module);
+                allPreparedData.srcData = angular.copy(requestData);
+            }
+            else {
+                allPreparedData.srcData = requestData;
+            }
+        }
+
         /**
          * Prepare all necessary data for executing or saving request
          * @param selectedApi
@@ -163,27 +230,19 @@ define([], function () {
         function prepareAllRequestData(selectedApi, selectedSubApi, operation, node, dataType, requestUrl, requestData,
                                        params) {
             var allPreparedData = {
-                customRestangular: null,
-                headers: {},
-                operation: '',
-                reqString:
-                    selectedSubApi ?
-                        RequestsService.applyParamsToStr(params, selectedSubApi.buildApiRequestString()) : '',
-                reqHeaders: {},
-                reqData: '',
-                srcData: '',
-            };
-
-            if ( dataType === 'form' && node){
-                node.buildRequest(RequestBuilderService, requestData, node.module);
-                allPreparedData.srcData = angular.copy(requestData);
-            }
-            else {
-                allPreparedData.srcData = requestData;
-            }
-
-            allPreparedData.reqData = RequestsService.applyParamsToObj(params, allPreparedData.srcData);
+                    customRestangular: null,
+                    headers: {},
+                    operation: '',
+                    reqString: '',
+                    reqHeaders: {},
+                    reqData: '',
+                    srcData: '',
+                    reqFullUrl: '',
+                },
+                selSubApiCopy = angular.copy(selectedSubApi);
 
+            setSrcDataByDataType(allPreparedData, node, requestData, dataType);
+            setParametrizedData(allPreparedData, params, selSubApiCopy, requestUrl);
 
             // prepare req data
             if (operation === 'GET' || operation === 'DELETE'){
@@ -192,19 +251,18 @@ define([], function () {
             }
             else if ( operation === 'POST' ){
 
-                if ( selectedSubApi ) {
+                if ( selSubApiCopy ) {
                     allPreparedData.reqData = YangUtilsService.postRequestData(
                         allPreparedData.reqData,
                         allPreparedData.reqString,
-                        selectedSubApi
+                        selSubApiCopy
                     );
                 }
             }
 
             // set correct host into restangular based on shown data type and prepare data
             if ( dataType === 'req-data' ){
-                requestUrl = RequestsService.applyParamsToStr(params, requestUrl);
-                var parser = locationHelper(requestUrl, ['pathname', 'origin']),
+                var parser = locationHelper(allPreparedData.reqFullUrl, ['pathname', 'origin']),
                     raParam = '';
 
                 YangUtilsRestangularService.setBaseUrl(parser.origin);