frontend/app/scripts/modules/serviceCenter/controllers/schemaCtrl.js (263 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; angular.module('serviceCenter.sc') .controller('schemaController', ['$scope', 'apiConstant', 'httpService', '$stateParams', 'servicesInfo', '$q', '$mdDialog', 'YAML', '$http', '$state', '$document', '$interval', function($scope, apiConstant, httpService, $stateParams, servicesInfo, $q, $mdDialog, YAML, $http, $state, $document, $interval) { var serviceId = $stateParams.serviceId; $scope.schemaName = []; $scope.selectedAddress = ''; $scope.disableNext = false; var addresses = []; var instances = []; var promises = []; if (servicesInfo && servicesInfo.data && servicesInfo.data.service) { var service = servicesInfo.data.service; $scope.schemaName = service.schemas || []; } $scope.downloadAllSchema = function() { $(".loader").show(); for (var s = 0; s < $scope.schemaName.length; s++) { var schemaApi = apiConstant.api.schema.url; var api = schemaApi.replace("{{serviceId}}", serviceId); var url = api.replace("{{schemaId}}", $scope.schemaName[s]); var method = apiConstant.api.schema.method; var headers = { "X-ConsumerId": serviceId }; promises.push(httpService.apiRequest(url, method, null, headers, "nopopup")); } $q.all(promises).then(function(response) { if (response) { promises = []; for (var i = 0; i < response.length; i++) { $scope.schemaJson = YAML.parse(response[i].data.schema); var schemaName = $scope.schemaName[i].split('.'); var id = schemaName[schemaName.length - 1]; const ui = SwaggerUIBundle({ spec: $scope.schemaJson, dom_id: '#' + id, presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset ], plugins: [ SwaggerUIBundle.plugins.DownloadUrl ], layout: "StandaloneLayout", docExpansion: 'full' }); if (i == 0) { var zip = new JSZip(); var folder = zip.folder('schemas'); } (function(i) { var interval = $interval(function() { if (angular.element('.swagger-ui').length) { $interval.cancel(interval); var schemaName = $scope.schemaName[i].split('.'); var fileName = schemaName[schemaName.length - 1]; var content = $document[0].getElementById('multipleTemplate').innerHTML; zip.file(fileName + ".html", content); var clearDom = angular.element(document.querySelector('#' + fileName)); clearDom.empty(); if (i == response.length - 1) { $(".loader").hide(); zip.generateAsync({ type: "blob" }).then(function(content) { saveAs(content, "schemas.zip"); }) } } }, 500) })(i); } } }, function(error) { $(".loader").hide(); $scope.noSchemaFound(); }) } $scope.instanceDetails = function() { var instanceUrl = apiConstant.api.instances.url; var instanceApi = instanceUrl.replace('{{serviceId}}', serviceId); var instanceMethod = apiConstant.api.instances.method; var instanceHeaders = { "X-ConsumerId": serviceId }; httpService.apiRequest(instanceApi, instanceMethod, null, instanceHeaders, null).then(function(response) { if (response && response.data && response.data.instances && response.data.instances.length > 0) { for (var i = 0; i < response.data.instances.length; i++) { addresses[i] = []; instances.push(response.data.instances[i].hostName + '-' + response.data.instances[i].instanceId); for (var j = 0; j < response.data.instances[i].endpoints.length; j++) { addresses[i].push(response.data.instances[i].endpoints[j]) } } $scope.noInstance = false; } else { addresses = [ [] ]; $scope.noInstance = true; } }, function(error) { addresses = [ [] ]; $scope.noInstance = true; }); } $scope.instanceDetails(); $scope.downloadSchema = function(selectedSchema) { $(".loader").show(); var schemaApi = apiConstant.api.schema.url; var api = schemaApi.replace("{{serviceId}}", serviceId); var url = api.replace("{{schemaId}}", selectedSchema); var method = apiConstant.api.schema.method; var headers = { "X-ConsumerId": serviceId }; httpService.apiRequest(url, method, null, headers, "nopopup").then(function(response) { if (response && response.data && response.data.schema) { $scope.template = response.data.schema; $scope.template = $scope.template.replace(/\\\s/g, ""); $scope.json = YAML.parse($scope.template); const ui = SwaggerUIBundle({ spec: $scope.json, dom_id: '#swagger-template', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset ], plugins: [ SwaggerUIBundle.plugins.DownloadUrl ], layout: "StandaloneLayout", docExpansion: 'full' }); var interval = $interval(function() { if (angular.element('.swagger-ui').length) { $(".loader").hide(); var content = $document[0].getElementById('singleTemplate').innerHTML; var blob = new Blob([content], { type: "text/html;charset=utf-8" }); var link = angular.element('<a></a>'); link.attr('href', window.URL.createObjectURL(blob)); link.attr('download', selectedSchema + ".html"); link[0].click(); $interval.cancel(interval); var clearDom = angular.element(document.querySelector('#swagger-template')); clearDom.empty(); } }, 500) } }, function(error) { $(".loader").hide(); $scope.noSchemaFound() }); }; $scope.noSchemaFound = function() { $mdDialog.show({ template: `<md-dialog flex="30"> <md-toolbar> <div class="md-toolbar-tools"> <h2>{{ "alert" | translate }}</h2> <span flex></span> <md-button class="md-icon-button" ng-click="cancel()"> <md-icon class="glyphicon glyphicon-remove" aria-label="Close dialog"></md-icon> </md-button> </div> </md-toolbar> <md-dialog-content> <h4 class="text-center" style="margin-top:15px;">{{ "noSchemaAvailableToDownload" | translate }}</h4> </md-dialog-content> <md-dialog-actions layout="row"> <span flex></span> <md-button ng-click="cancel()"> {{ "close" | translate }} </md-button> </md-dialog-actions> </md-dialog>`, parent: angular.element(document.body), clickOutsideToClose: true, controller: function($scope, $mdDialog) { $scope.cancel = function() { $mdDialog.hide(); } } }) }; $scope.testSchema = function(selectedSchema) { $mdDialog.show({ controller: function($scope, $mdDialog, apiConstant, httpService) { $scope.showSchema = false; $scope.instances = instances; $scope.selectedInstance = instances[0] || ''; $scope.addresses = addresses[0]; angular.forEach($scope.addresses, function(addr) { if (addr.indexOf("rest") >= 0) { $scope.selectedAddress = addr; } }); $scope.selectedAddress = ($scope.selectedAddress == '') ? addresses[0][0] : $scope.selectedAddress; $scope.disableNext = $scope.selectedAddress.indexOf("highway") >= 0 ? true : false; $scope.setInstance = function(instance) { for (var i = 0; i < $scope.instances.length; i++) { if (instance == $scope.instances[i]) { $scope.selectedInstance = instance[i]; $scope.addresses = addresses[i]; $scope.selectedAddress = addresses[i][0]; } } }; $scope.setAddress = function(address) { $scope.disableNext = address.indexOf("highway") >= 0 ? true : false; $scope.selectedAddress = address; }; $scope.getSchema = function() { var schemaApi = apiConstant.api.schema.url; var api = schemaApi.replace("{{serviceId}}", serviceId); var url = api.replace("{{schemaId}}", selectedSchema); var method = apiConstant.api.schema.method; var headers = { "X-ConsumerId": serviceId }; httpService.apiRequest(url, method, null, headers, "nopopup").then(function(response) { $(".loader").hide(); if (response && response.data && response.data.schema) { var arr = /^(?:\w+:\/\/)?([^\/?#]+)(.*)$/.exec($scope.selectedAddress); var ip = arr[1]; var schema = response.data.schema; schema = schema.replace(/\\\s/g, ""); var json = YAML.parse(schema); json.basePath = "/testSchema" + json.basePath; json.instanceIP = ip; json.schemaName = selectedSchema; var yamlString = YAML.stringify(json); $scope.testSchema = yamlString; $scope.showSchema = true; } }, function(error) { $(".loader").hide(); $scope.showSchema = true; }); } $scope.hide = function() { $mdDialog.hide(); }; $scope.goBack = function() { $scope.showSchema = false; } $scope.cancel = function() { $mdDialog.cancel(); }; }, templateUrl: 'scripts/modules/serviceCenter/views/testSchema.html', parent: angular.element(document.body), clickOutsideToClose: true, fullscreen: false }); }; } ]);