1 define([], function () {
4 angular.module('app.yangman').service('YangmanService', YangmanService);
6 YangmanService.$inject = [
7 'RequestBuilderService',
9 'YangUtilsRestangularService',
16 function YangmanService(
17 RequestBuilderService,
19 YangUtilsRestangularService,
25 checkRpcReceivedData: checkRpcReceivedData,
26 executeRequestOperation: executeRequestOperation,
27 fillNodeFromResponse: fillNodeFromResponse,
28 getDataStoreIndex: getDataStoreIndex,
29 prepareAllRequestData: prepareAllRequestData,
30 prepareReceivedData: prepareReceivedData,
31 putIntoObj: putIntoObj,
32 validateFile: validateFile,
38 * Put data to output container if root node is rpc
43 function checkRpcReceivedData(data, node){
44 return node.type === 'rpc' ? cutData(data) : data;
46 function cutData(data){
48 output: data[node.label].output,
54 * Put source object into destination object by source properties
56 * @param destinationObj
58 function putIntoObj(sourceObj, destinationObj, containter){
59 Object.keys(sourceObj).forEach(function(prop){
60 destinationObj[containter] = destinationObj[containter] ? destinationObj[containter] : {};
61 destinationObj[containter][prop] = sourceObj[prop];
66 * Prepare request date before filling into node depends on method and node type
74 function prepareReceivedData(node, method, rData, sData, outputType){
78 if ( outputType === 'form' ){
80 putIntoObj(rData, dObj, node.label);
81 putIntoObj(sData[node.label] ? sData[node.label] : sData, dObj, node.label);
101 DEFAULT: function () {
106 return (methodType[method] || methodType.DEFAULT)();
110 return (prepareType[node ? node.type : 'default'] || prepareType.default)();
114 * Validating collection import file
119 function validateFile(data, checkArray){
121 var obj = ParsingJsonService.parseJson(data);
123 return obj && obj.every(function (el){
124 return checkArray.every(function (arr){
125 return el.hasOwnProperty(arr);
134 * Return index of selected datastore in list
139 function getDataStoreIndex(list, dataStore){
141 result = list.some(function (item, index) {
143 return item.label === dataStore;
146 return result ? rIndex : null;
150 * Prepare all necessary data for executing or saving request
152 * @param selectedSubApi
159 * @returns {{customRestangular: null, headers: {}, operation: string, reqString: string, reqHeaders: {},
162 function prepareAllRequestData(selectedApi, selectedSubApi, operation, node, dataType, requestUrl, requestData,
164 var allPreparedData = {
165 customRestangular: null,
170 RequestsService.applyParamsToStr(params, selectedSubApi.buildApiRequestString()) :
177 if ( dataType === 'form' && node){
178 node.buildRequest(RequestBuilderService, requestData, node.module);
179 allPreparedData.srcData = angular.copy(requestData);
182 allPreparedData.srcData = requestData;
185 allPreparedData.reqData = RequestsService.applyParamsToObj(params, allPreparedData.srcData);
189 if (operation === 'GET' || operation === 'DELETE'){
190 allPreparedData.srcData = null;
191 allPreparedData.reqData = null;
193 else if (operation === 'POST'){
194 allPreparedData.reqData = YangUtilsService.postRequestData(
195 allPreparedData.reqData,
196 allPreparedData.reqString,
201 // set correct host into restangular based on shown data type and prepare data
202 if ( dataType === 'req-data' ){
203 requestUrl = RequestsService.applyParamsToStr(params, requestUrl);
204 var parser = locationHelper(requestUrl, ['pathname', 'origin']),
207 YangUtilsRestangularService.setBaseUrl(parser.origin);
208 allPreparedData.reqString = parser.pathname.slice(1).split('/');
209 raParam = allPreparedData.reqString.shift();
210 allPreparedData.reqString = allPreparedData.reqString.join('/');
212 allPreparedData.customRestangular = YangUtilsRestangularService.one(raParam);
216 YangUtilsRestangularService.setBaseUrl(ENV.getBaseURL('MD_SAL'));
217 allPreparedData.customRestangular = YangUtilsRestangularService.one('restconf');
220 allPreparedData.headers = YangUtilsService.prepareHeaders(allPreparedData.reqData);
224 allPreparedData.operation = YangUtilsService.prepareOperation(operation);
225 return allPreparedData;
229 * Execute request built from this data
231 * @param selectedSubApi
241 function executeRequestOperation(selectedApi, selectedSubApi, operation, node, dataType, requestUrl,
242 requestData, params, successCbk, errorCbk) {
248 YangUtilsRestangularService.setFullResponse(true);
250 // prepare all necessary data
251 var allPreparedData = prepareAllRequestData(selectedApi, selectedSubApi, operation, node, dataType,
252 requestUrl, requestData, params);
254 // start track time response
255 time.started = new Date().getMilliseconds();
257 // executing operation
258 allPreparedData.customRestangular.customOperation(
259 allPreparedData.operation.toLowerCase(),
260 allPreparedData.reqString,
262 allPreparedData.headers,
263 allPreparedData.reqData
266 function (response) {
267 (successCbk || angular.noop)(finishExecuting(response), response);
269 function (response) {
270 (errorCbk || angular.noop)(finishExecuting(response), response);
274 function finishExecuting(response){
275 // finish track time response
276 time.finished = new Date().getMilliseconds();
277 var spentRequestTime = time.finished - time.started;
280 status: response.status,
281 statusText: response.statusText,
282 time: spentRequestTime < 0 ? -(spentRequestTime) : spentRequestTime,
283 requestData: allPreparedData.reqData,
284 requestSrcData: allPreparedData.srcData,
290 * Method for parsing path to additional properties based on JS LOCATION
295 function locationHelper(path, properties){
296 var parser = document.createElement('a'),
301 properties.forEach(function (prop) {
302 obj[prop] = parser[prop];
309 * Fill node values from response
313 function fillNodeFromResponse(node, data){
314 var props = data ? Object.getOwnPropertyNames(data) : [];
316 // fill each property - needed for root mountpoint node,
317 // in other cases there should be only one property anyway
318 props.forEach(function (p) {
319 node.fill(p, data[p]);