/** * 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' }, controller: function($scope, $element, ApiService, $routeParams, CreateService, Config) { $scope.ROBOT_PATTERN = ROBOT_PATTERN; // TODO(jschorr): move this to a service. $scope.roles = [ { 'id': 'read', 'title': 'Read', 'kind': 'success' }, { 'id': 'write', 'title': 'Write', 'kind': 'success' }, { 'id': 'admin', 'title': 'Admin', 'kind': 'primary' } ]; $scope.robots = null; $scope.loading = false; $scope.shownRobot = null; $scope.showRobotCounter = 0; $scope.Config = Config; 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.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) { 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) { $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')); }; var update = function() { if (!$scope.user && !$scope.organization) { return; } if ($scope.loading) { return; } $scope.loading = true; ApiService.getRobots($scope.organization).then(function(resp) { $scope.robots = resp.robots; $scope.loading = false; if ($routeParams.showRobot) { var index = $scope.findRobotIndexByName($routeParams.showRobot); if (index >= 0) { $scope.showRobot($scope.robots[index]); } } }); }; $scope.$watch('organization', update); $scope.$watch('user', update); } }; return directiveDefinitionObject; });