X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=modules%2Fyangman-resources%2Fsrc%2Fmain%2Fresources%2Fyangman%2Fservices%2Fyangman.services.js;h=86d47a93ed9c44fd12fc109de721d0455765255c;hb=14d64905f19cdf6ee8a038465f726966ad323045;hp=7efe5b5be7f38d0d0557f8193bd6c1c23a911b97;hpb=1ab2c1d6deb7b9112c89c13ba008bd5e331497e1;p=dlux.git diff --git a/modules/yangman-resources/src/main/resources/yangman/services/yangman.services.js b/modules/yangman-resources/src/main/resources/yangman/services/yangman.services.js index 7efe5b5b..86d47a93 100644 --- a/modules/yangman-resources/src/main/resources/yangman/services/yangman.services.js +++ b/modules/yangman-resources/src/main/resources/yangman/services/yangman.services.js @@ -8,22 +8,158 @@ define([], function () { 'YangUtilsService', 'YangUtilsRestangularService', 'ENV', + 'ParsingJsonService', + 'RequestsService', + 'PathUtilsService', + 'constants', ]; function YangmanService( RequestBuilderService, YangUtilsService, YangUtilsRestangularService, - ENV + ENV, + ParsingJsonService, + RequestsService, + PathUtilsService, + constants ){ var service = { + cutUrl: cutUrl, + checkRpcReceivedData: checkRpcReceivedData, 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 + * @param node + * @returns {*} + */ + function checkRpcReceivedData(data, node){ + return node.type === constants.NODE_RPC ? cutData(data) : data; + + function cutData(data){ + return { + output: data[node.label].output, + }; + } + } + + /** + * Put source object into destination object by source properties + * @param sourceObj + * @param destinationObj + */ + function putIntoObj(sourceObj, destinationObj, containter){ + if ( sourceObj ) { + Object.keys(sourceObj).forEach(function(prop){ + destinationObj[containter] = destinationObj[containter] ? destinationObj[containter] : {}; + destinationObj[containter][prop] = sourceObj[prop]; + }); + } + } + + /** + * Prepare request date before filling into node depends on method and node type + * @param node + * @param method + * @param rData + * @param sData + * @param outputType + * @returns {*} + */ + function prepareReceivedData(node, method, rData, sData, outputType){ + var prepareType = { + rpc: function (){ + + if ( outputType === constants.DISPLAY_TYPE_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; + } else { + return rData; + } + }, + default: function (){ + var methodType = { + GET: function () { + if ( node ){ + node.clear(); + } + return rData; + }, + DELETE: function () { + if ( node ) { + node.clear(); + } + return {}; + }, + DEFAULT: function () { + return rData; + }, + }; + + return (methodType[method] || methodType.DEFAULT)(); + }, + }; + + return (prepareType[node ? node.type : 'default'] || prepareType.default)(); + } + + /** + * Validating collection import file + * @param data + * @param checkArray + * @returns {*} + */ + function validateFile(data, checkArray){ + try { + var obj = ParsingJsonService.parseJson(data); + + return obj && obj.every(function (el){ + return checkArray.every(function (arr){ + return el.hasOwnProperty(arr); + }); + }); + } catch (e) { + return e; + } + } + /** * Return index of selected datastore in list * @param list @@ -40,124 +176,180 @@ define([], function () { return result ? rIndex : null; } - function executeRequestOperation( - selectedApi, - selectedSubApi, - operation, - node, - dataType, - requestUrl, - requestData, - successCbk, - errorCbk - ){ - var reqString = selectedSubApi ? selectedSubApi.buildApiRequestString() : '', - preparedRequestData = {}, - headers, - time = { - started: 0, - finished: 0, - }, - customRestangular = 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); - // set full response detail - YangUtilsRestangularService.setFullResponse(true); + // apply parametrized value into request data in string form + allPreparedData.reqString = + selSubApiCopy ? RequestsService.applyParamsToStr(params, selSubApiCopy.buildApiRequestString()) : ''; - // set correct host into restangular based on shown data type - if ( dataType === 'req-data' ){ - var parser = locationHelper(requestUrl, ['pathname', 'origin']), - raParam = ''; + if ( !angular.equals(allPreparedData.reqFullUrl, requestUrl) && selSubApiCopy ){ + // fill parametrized data into path array + PathUtilsService.fillPath(selSubApiCopy.pathArray, allPreparedData.reqFullUrl); + } - YangUtilsRestangularService.setBaseUrl(parser.origin); - reqString = parser.pathname.slice(1).split('/'); - raParam = reqString.shift(); - reqString = reqString.join('/'); + allPreparedData.reqData = RequestsService.applyParamsToObj(params, allPreparedData.srcData); + } - customRestangular = YangUtilsRestangularService.one(raParam); - preparedRequestData = requestData; - } else { + /** + * 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 === constants.DISPLAY_TYPE_FORM && node){ + node.buildRequest(RequestBuilderService, requestData, node.module); + allPreparedData.srcData = angular.copy(requestData); + } + else { + allPreparedData.srcData = requestData; + } + } - YangUtilsRestangularService.setBaseUrl(ENV.getBaseURL('MD_SAL')); - customRestangular = YangUtilsRestangularService.one('restconf'); + /** + * Prepare all necessary data for executing or saving request + * @param selectedApi + * @param selectedSubApi + * @param operation + * @param node + * @param dataType + * @param requestUrl + * @param requestData + * @param params + * @returns {{customRestangular: null, headers: {}, operation: string, reqString: string, reqHeaders: {}, + * reqData: {}}} + */ + function prepareAllRequestData(selectedApi, selectedSubApi, operation, node, dataType, requestUrl, requestData, + params) { + var allPreparedData = { + customRestangular: null, + headers: {}, + operation: '', + reqString: '', + reqHeaders: {}, + reqData: '', + srcData: '', + reqFullUrl: '', + }, + selSubApiCopy = angular.copy(selectedSubApi); - // if node build sent request - if ( node ) { + setSrcDataByDataType(allPreparedData, node, requestData, dataType); + setParametrizedData(allPreparedData, params, selSubApiCopy, requestUrl); - node.buildRequest(RequestBuilderService, requestData, node.module); - angular.copy(requestData, preparedRequestData); + // prepare req data + if (operation === constants.OPERATION_GET || operation === constants.OPERATION_DELETE){ + allPreparedData.srcData = null; + allPreparedData.reqData = null; + } + else if ( operation === constants.OPERATION_POST ){ - preparedRequestData = YangUtilsService.prepareRequestData( - preparedRequestData, - operation, - reqString, - selectedSubApi + if ( selSubApiCopy ) { + allPreparedData.reqData = YangUtilsService.postRequestData( + allPreparedData.reqData, + allPreparedData.reqString, + selSubApiCopy ); - - headers = YangUtilsService.prepareHeaders(preparedRequestData); } } - //reqString = reqPath ? reqPath.slice(selectedApi.basePath.length, reqPath.length) : reqString; - //var requestPath = selectedApi.basePath + reqString; - + // set correct host into restangular based on shown data type and prepare data + if ( dataType === constants.DISPLAY_TYPE_REQ_DATA ){ + var parser = locationHelper(allPreparedData.reqFullUrl, ['pathname', 'origin']), + raParam = ''; + YangUtilsRestangularService.setBaseUrl(parser.origin); + allPreparedData.reqString = parser.pathname.slice(1).split('/'); + raParam = allPreparedData.reqString.shift(); + allPreparedData.reqString = allPreparedData.reqString.join('/'); - operation = YangUtilsService.prepareOperation(operation); + allPreparedData.customRestangular = YangUtilsRestangularService.one(raParam); - // start track time response - time.started = new Date().getMilliseconds(); + } else { - // executing operation - customRestangular - .customOperation(operation.toLowerCase(), reqString, null, headers, preparedRequestData) - .then(function (response) { - // finish track time response - time.finished = new Date().getMilliseconds(); - - var reqObj = { - status: response.status, - statusText: response.statusText, - time: (time.finished - time.started), - }; + YangUtilsRestangularService.setBaseUrl(ENV.getBaseURL('MD_SAL')); + allPreparedData.customRestangular = YangUtilsRestangularService.one('restconf'); - (successCbk || angular.noop)(reqObj, response); + if ( node ) { + allPreparedData.headers = YangUtilsService.prepareHeaders(allPreparedData.reqData); + } + } - }, function (response) { - // finish track time response - time.finished = new Date().getMilliseconds(); + allPreparedData.operation = YangUtilsService.prepareOperation(operation); + return allPreparedData; + } - var reqObj = { - status: response.status, - statusText: response.statusText, - time: (time.finished - time.started), - }; + function cutUrl(url){ + return url.indexOf('restconf') > -1 ? url.split('restconf')[1].substring(1) : url; + } - (errorCbk || angular.noop)(reqObj, response); + /** + * Execute request built from this data + * @param selectedApi + * @param selectedSubApi + * @param operation + * @param node + * @param dataType + * @param requestUrl + * @param requestData + * @param successCbk + * @param errorCbk + * @param params + */ + function executeRequestOperation(selectedApi, selectedSubApi, operation, node, dataType, requestUrl, + requestData, params, successCbk, errorCbk) { + var time = { + started: 0, + finished: 0, + }; - /*var errorMsg = ''; + YangUtilsRestangularService.setFullResponse(true); - if (resp.data && resp.data.errors && resp.data.errors.error && resp.data.errors.error.length) { - errorMsg = ': ' + resp.data.errors.error.map(function (e) { - return e['error-message']; - }).join(', '); - } + // prepare all necessary data + var allPreparedData = prepareAllRequestData(selectedApi, selectedSubApi, operation, node, dataType, + requestUrl, requestData, params); - /!** - * TODO after first GET we have set $scope.node with data - * so build from the top of this function return requestData - *!/ - if (operation === 'GET'){ - requestData = {}; - } + // start track time response + time.started = new Date().getMilliseconds(); - console.info( - 'error sending request to', selectedSubApi ? selectedSubApi.buildApiRequestString() : '', - 'reqString', reqString, - 'got', resp.status, - 'data', resp.data - );*/ + // executing operation + allPreparedData.customRestangular.customOperation( + allPreparedData.operation.toLowerCase(), + allPreparedData.reqString, + null, + allPreparedData.headers, + allPreparedData.reqData + ) + .then( + function (response) { + (successCbk || angular.noop)(finishExecuting(response), response); + }, + function (response) { + (errorCbk || angular.noop)(finishExecuting(response), response); } ); + + function finishExecuting(response){ + // finish track time response + time.finished = new Date().getMilliseconds(); + var spentRequestTime = time.finished - time.started; + + return { + status: response.status, + statusText: response.statusText, + time: spentRequestTime < 0 ? -(spentRequestTime) : spentRequestTime, + requestData: allPreparedData.reqData, + requestSrcData: allPreparedData.srcData, + }; + } } /** @@ -185,7 +377,7 @@ define([], function () { * @param data */ function fillNodeFromResponse(node, data){ - var props = Object.getOwnPropertyNames(data); + var props = data ? Object.getOwnPropertyNames(data) : []; // fill each property - needed for root mountpoint node, // in other cases there should be only one property anyway