/** * Element for managing the robots owned by an organization or a user. */ angular.module('quay').directive('robotsManager', function () { var directiveDefinitionObject = { priority: 0, templateUrl: '/static/directives/robots-manager.html', replace: false, transclude: false, restrict: 'C', scope: { 'organization': '=organization', 'user': '=user', 'isEnabled': '=isEnabled' }, controller: function($scope, $element, ApiService, $routeParams, $location, CreateService, Config, $rootScope) { $scope.ROBOT_PATTERN = ROBOT_PATTERN; $scope.robots = null; $scope.loading = false; $scope.shownRobot = null; $scope.showRobotCounter = 0; $scope.Config = Config; // Listen for route changes and update the tabs accordingly. var locationListener = $rootScope.$on('$routeUpdate', function(){ if ($location.search()['showRobot']) { $scope.filterToRobot($location.search()['showRobot']); } }); $scope.$on('$destroy', function() { locationListener && locationListener(); }); var loadRobotPermissions = function(info) { var shortName = $scope.getShortenedName(info.name); info.loading_permissions = true; ApiService.getRobotPermissions($scope.organization, null, {'robot_shortname': shortName}).then(function(resp) { info.permissions = resp.permissions; info.loading_permissions = false; }, ApiService.errorDisplay('Could not load robot permissions')); }; $scope.filterToRobot = function(robotName) { if ($scope.robotFilter == robotName) { return; } var index = $scope.findRobotIndexByName(robotName); if (index < 0) { // Robot doesn't exist. Reload the list to see if we can find it. update(); } $scope.robotFilter = robotName; }; $scope.showPermissions = function(robotInfo) { robotInfo.showing_permissions = !robotInfo.showing_permissions; if (robotInfo.showing_permissions) { loadRobotPermissions(robotInfo); } }; $scope.regenerateToken = function(username) { if (!username) { return; } var shortName = $scope.getShortenedName(username); ApiService.regenerateRobotToken($scope.organization, null, {'robot_shortname': shortName}).then(function(updated) { var index = $scope.findRobotIndexByName(username); if (index >= 0) { $scope.robots.splice(index, 1); $scope.robots.push(updated); } $scope.shownRobot = updated; }, ApiService.errorDisplay('Cannot regenerate robot account token')); }; $scope.showRobot = function(info) { $scope.shownRobot = info; $scope.showRobotCounter++; }; $scope.findRobotIndexByName = function(name) { if (!$scope.robots) { return -1; } for (var i = 0; i < $scope.robots.length; ++i) { if ($scope.robots[i].name == name) { return i; } } return -1; }; $scope.getShortenedRobotName = function(info) { return $scope.getShortenedName(info.name); }; $scope.getShortenedName = function(name) { var plus = name.indexOf('+'); return name.substr(plus + 1); }; $scope.getPrefix = function(name) { var plus = name.indexOf('+'); return name.substr(0, plus); }; $scope.createRobot = function(name) { if (!name) { return; } CreateService.createRobotAccount(ApiService, !!$scope.organization, $scope.organization ? $scope.organization.name : '', name, function(created) { created.teams = []; created.repositories = []; $scope.robots.push(created); }); }; $scope.deleteRobot = function(info) { var shortName = $scope.getShortenedName(info.name); ApiService.deleteRobot($scope.organization, null, {'robot_shortname': shortName}).then(function(resp) { var index = $scope.findRobotIndexByName(info.name); if (index >= 0) { $scope.robots.splice(index, 1); } }, ApiService.errorDisplay('Cannot delete robot account')); }; $scope.askDeleteRobot = function(info) { bootbox.confirm('Are you sure you want to delete robot ' + info.name + '?', function(resp) { if (resp) { $scope.deleteRobot(info); } }); }; var update = function() { if (!$scope.user && !$scope.organization) { return; } if ($scope.loading || !$scope.isEnabled) { return; } var params = { 'permissions': true }; $scope.loading = true; ApiService.getRobots($scope.organization, null, params).then(function(resp) { $scope.robots = resp.robots; $scope.loading = false; if ($routeParams.showRobot) { $scope.filterToRobot($routeParams.showRobot); } }); }; $scope.$watch('isEnabled', update); $scope.$watch('organization', update); $scope.$watch('user', update); } }; return directiveDefinitionObject; });