Katello/katello

View on GitHub
engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js

Summary

Maintainability
D
2 days
Test Coverage
/**
 * @ngdoc object
 * @name  Bastion.repositories.controller:RepositoryDetailsInfoController
 *
 * @requires $scope
 * @requires $q
 * @requires translate
 * @requires Notification
 * @requires ContentCredential
 * @requires CurrentOrganization
 * @requires Checksum
 * @requires DownloadPolicy
 * @requires Architecture
 * @requires HttpProxyPolicy
 * @requires OSVersions
 * @requires RepositoryTypesService
 *
 * @description
 *   Provides the functionality for the repository details info page.
 */
angular.module('Bastion.repositories').controller('RepositoryDetailsInfoController',
    ['$scope', '$q', 'translate', 'Notification', 'ContentCredential', 'CurrentOrganization', 'Checksum', 'DownloadPolicy', 'Architecture', 'HttpProxy', 'HttpProxyPolicy', 'OSVersions', 'RepositoryTypesService', 'MirroringPolicy',
        function ($scope, $q, translate, Notification, ContentCredential, CurrentOrganization, Checksum, DownloadPolicy, Architecture, HttpProxy, HttpProxyPolicy, OSVersions, RepositoryTypesService, MirroringPolicy) {
            $scope.organization = CurrentOrganization;

            $scope.progress = {uploading: false};

            $scope.repository.$promise.then(function () {
                $scope.uploadURL = 'katello/api/v2/repositories/' + $scope.repository.id + '/upload_content';
                $scope.repository['ignore_srpms'] = $scope.repository['ignorable_content'] && $scope.repository['ignorable_content'].includes("srpm");
                $scope.repository['ignore_treeinfo'] = $scope.repository['ignorable_content'] && $scope.repository['ignorable_content'].includes("treeinfo");
                $scope.repository['ansible_collection_auth_exists'] = $scope.repository['ansible_collection_auth_url'] && $scope.repository['ansible_collection_auth_token'];
                $scope.genericContentTypes = RepositoryTypesService.genericContentTypes($scope.repository['content_type']);
                $scope.immediateDownloadPolicy = $scope.repository['download_policy'] === 'immediate';
            });

            $scope.gpgKeys = function () {
                var deferred = $q.defer();

                ContentCredential.queryUnpaged(function (contentCredentials) {
                    var results = contentCredentials.results;

                    results = results.filter(function(obj) {
                        if (obj.content_type === "gpg_key") {
                            return true;
                        }
                        return false;
                    });

                    results.unshift({id: null, name: ''});
                    deferred.resolve(results);
                });

                return deferred.promise;
            };

            $scope.certs = function () {
                var deferred = $q.defer();

                ContentCredential.queryUnpaged(function (contentCredentials) {
                    var results = contentCredentials.results;

                    results = results.filter(function(obj) {
                        if (obj.content_type === "cert") {
                            return true;
                        }
                        return false;
                    });

                    results.unshift({id: null, name: ''});
                    deferred.resolve(results);
                });

                return deferred.promise;
            };

            $scope.architectures = function () {
                var deferred = $q.defer();
                Architecture.queryUnpaged(function (architectures) {
                    var results = architectures.results;
                    results.map(function(i) {
                        i.id = i.name;
                    });
                    results.unshift({
                        id: 'noarch',
                        name: translate('No restriction'),
                        value: null
                    });
                    deferred.resolve(results);
                });
                return deferred.promise;
            };

            $scope.save = function (repository) {
                var deferred = $q.defer();
                var fields = ['upstream_password', 'upstream_username', 'upstream_authentication_token', 'ansible_collection_auth_token', 'ansible_collection_auth_url', 'ansible_collection_requirements'];
                if (repository.content_type === 'yum' && typeof repository.ignore_srpms !== 'undefined' && typeof repository.ignore_treeinfo !== 'undefined') {
                    repository['ignorable_content'] = [];
                    if (repository['ignore_srpms']) {
                        repository['ignorable_content'].push("srpm");
                    }
                    if (repository['ignore_treeinfo']) {
                        repository['ignorable_content'].push("treeinfo");
                    }
                }
                if ($scope.genericRemoteOptions && $scope.genericRemoteOptions !== []) {
                    $scope.genericRemoteOptions.forEach(function(option) {
                       if (option.type === "Array") {
                           repository[option.name] = option.value ? option.value.split(option.delimiter) : [];
                       } else {
                           repository[option.name] = option.value;
                       }
                   });
                }

                if (!_.isEmpty(repository.commaIncludeTags)) {
                    repository["include_tags"] = repository.commaIncludeTags.split(",").map(function(tag) {
                        return tag.trim();
                    }).filter(function(el) {
                        return el;
                    });
                } else {
                    repository["include_tags"] = [];
                }
                if (!_.isEmpty(repository.commaExcludeTags)) {
                    repository["exclude_tags"] = repository.commaExcludeTags.split(",").map(function(tag) {
                        return tag.trim();
                    }).filter(function(el) {
                        return el;
                    });
                } else {
                    repository["exclude_tags"] = [];
                }
                /* eslint-disable camelcase */

                angular.forEach(fields, function(field) {
                    if (repository[field] === '') {
                        repository[field] = null;
                    }
                });
                if (!repository['upstream_username']) {
                    repository['upstream_password'] = null;
                }
                repository.os_versions = $scope.osVersionsParam();
                repository.$update(function (response) {
                    deferred.resolve(response);
                    $scope.immediateDownloadPolicy = repository['download_policy'] === 'immediate';
                    $scope.repository.ignore_srpms = $scope.repository.ignorable_content && $scope.repository.ignorable_content.includes("srpm");
                    $scope.repository.ignore_treeinfo = $scope.repository.ignorable_content && $scope.repository.ignorable_content.includes("treeinfo");
                    if (!_.isEmpty(response["include_tags"])) {
                        repository.commaIncludeTags = repository["include_tags"].join(", ");
                    } else {
                        repository.commaIncludeTags = null;
                    }
                    if (!_.isEmpty(response["exclude_tags"])) {
                        repository.commaExcludeTags = repository["exclude_tags"].join(", ");
                    } else {
                        repository.commaExcludeTags = null;
                    }
                    Notification.setSuccessMessage(translate('Repository Saved.'));
                }, function (response) {
                    deferred.reject(response);
                    Notification.setErrorMessage(translate("An error occurred saving the Repository: ") + response.data.displayMessage);
                });

                return deferred.promise;
            };

            $scope.uploadContent = function (content) {
                var returnData, error, uploaded;

                if (content) {
                    try {
                        returnData = angular.fromJson(angular.element(content).html());
                    } catch (err) {
                        returnData = content;
                    }

                    if (!returnData) {
                        returnData = content;
                    }

                    if (returnData !== null && returnData.status === 'success') {
                        uploaded = returnData.filenames.join(', ');
                        Notification.setSuccessMessage(translate('Successfully uploaded content: ') + uploaded);
                        $scope.repository.$get();
                    } else {
                        error = returnData.displayMessage;
                        Notification.setErrorMessage(translate('Error during upload: ') + error);
                    }

                    $scope.progress.uploading = false;
                }
            };

            $scope.uploadError = function (error, content) {
                if (angular.isString(content) && content.indexOf("Request Entity Too Large")) {
                    error = translate('File too large. Please use the CLI instead.');
                } else {
                    error = content;
                }
                Notification.setErrorMessage(translate('Error during upload: ') + error);
                $scope.progress.uploading = false;
            };

            $scope.handleFiles = function (element) {
                var reader = new FileReader();
                $scope.uploadedFile = true;
                reader.addEventListener("loadend", function() {
                    var data = reader.result;
                    $scope.repository.ansible_collection_requirements = data;
                    $scope.$apply();
                });
                reader.readAsText(element.files[0]);
            };

            $scope.checksums = Checksum.checksums;
            $scope.downloadPolicies = DownloadPolicy.downloadPolicies;
            $scope.mirroringPolicies = MirroringPolicy.mirroringPolicies;

            $scope.checksumTypeDisplay = function (checksum) {
                return Checksum.checksumType(checksum);
            };

            $scope.downloadPolicyDisplay = function (downloadPolicy) {
                return DownloadPolicy.downloadPolicyName(downloadPolicy);
            };

            $scope.mirroringPolicyDisplay = MirroringPolicy.mirroringPolicyName;

            $scope.clearUpstreamAuth = function () {
                $scope.repository['upstream_password'] = null;
                $scope.repository['upstream_auth_exists'] = false;
                $scope.repository['upstream_username'] = null;
                $scope.repository['upstream_authentication_token'] = null;
                $scope.save($scope.repository);
            };

            $scope.clearMetadataExpire = function () {
                $scope.repository['metadata_expire'] = null;
                $scope.save($scope.repository);
            };

            $scope.clearAnsibleCollectionAuth = function () {
                $scope.repository['ansible_collection_auth_url'] = null;
                $scope.repository['ansible_collection_auth_token'] = null;
                $scope.repository['ansible_collection_auth_exists'] = false;
                $scope.save($scope.repository);
            };

            $scope.$watch('repository.content_type', function () {
                var remOptions, optionIndex;
                $scope.genericRemoteOptions = RepositoryTypesService.getAttribute($scope.repository, "generic_remote_options");
                if ($scope.genericRemoteOptions && $scope.genericRemoteOptions !== []) {
                    remOptions = angular.fromJson($scope.repository.generic_remote_options);
                    if (remOptions === null) {
                        return null;
                    }
                    Object.keys(remOptions).forEach(function(key) {
                        if (remOptions[key]) {
                            optionIndex = $scope.genericRemoteOptions.map(function(option) {
                                return option.name;
                            }).indexOf(key);
                            $scope.genericRemoteOptions[optionIndex].value = remOptions[key].join($scope.genericRemoteOptions[optionIndex].delimiter);
                        }
                    });
                }
            });

            $scope.policies = HttpProxyPolicy.policies;
            $scope.proxies = [];

            $scope.displayHttpProxyPolicyName = function (policy) {
                return HttpProxyPolicy.displayHttpProxyPolicyName(policy);
            };

            $scope.displayHttpProxyName = function (proxyId) {
                return HttpProxyPolicy.displayHttpProxyName($scope.proxies, proxyId);
            };

            $scope.osVersionsOptions = function () {
                $scope.selectedOSVersion = $scope.formatOSVersions();
                return OSVersions.getOSVersionsOptions();
            };

            $scope.formatOSVersions = function () {
                return OSVersions.formatOSVersions($scope.repository.os_versions);
            };

            $scope.osVersionsParam = function () {
                return OSVersions.osVersionsParam($scope.selectedOSVersion);
            };

            HttpProxy.queryUnpaged(function (proxies) {
                $scope.proxies = proxies.results;
            });

        }]
);