Switch the repos page to use a single API call, rather than one per namespace + one for star repos

This commit is contained in:
Joseph Schorr 2015-05-06 19:15:03 -04:00
parent d53f2f9fc8
commit e647d91e8b
4 changed files with 72 additions and 60 deletions

View file

@ -17,33 +17,46 @@
function RepoListCtrl($scope, $sanitize, $q, Restangular, UserService, ApiService) {
$scope.namespace = null;
$scope.page = 1;
$scope.publicPageCount = null;
$scope.allRepositories = {};
$scope.loading = true;
$scope.namespaces = [];
$scope.namespaceMap = {};
// When loading the UserService, if the user is logged in, create a list of
// relevant namespaces and collect the relevant repositories.
UserService.updateUserIn($scope, function(user) {
$scope.loading = false;
var addNamespace = function(namespace) {
var name = namespace.username || namespace.name;
var namespaceInfo = {
'name': name,
'avatar': namespace.avatar,
'repositories': {
'loading': true,
'value': []
}
};
$scope.namespaceMap[name] = namespaceInfo;
$scope.namespaces.push(namespaceInfo);
};
if (!user.anonymous) {
// Add our user to our list of namespaces.
$scope.namespaces = [{
'name': user.username,
'avatar': user.avatar
}];
addNamespace(user);
// Add each org to our list of namespaces.
user.organizations.map(function(org) {
$scope.namespaces.push({
'name': org.name,
'avatar': org.avatar
});
addNamespace(org);
});
// Load the repos.
loadStarredRepos();
$scope.starred_repositories = {
'loading': true,
'value': []
};
// Load the repositories.
loadRepos();
}
});
@ -62,46 +75,37 @@
}
};
// Finds a duplicate repo if it exists. If it doesn't, inserts the repo.
var findDuplicateRepo = function(repo) {
var found = $scope.allRepositories[repo.namespace + '/' + repo.name];
if (found) {
return found;
} else {
$scope.allRepositories[repo.namespace + '/' + repo.name] = repo;
return repo;
}
};
var loadStarredRepos = function() {
if (!$scope.user || $scope.user.anonymous) {
return;
}
$scope.starred_repositories = ApiService.listStarredReposAsResource().get(function(resp) {
return resp.repositories.map(function(repo) {
repo = findDuplicateRepo(repo);
repo.is_starred = true;
return repo;
});
});
};
var loadRepos = function() {
if (!$scope.user || $scope.user.anonymous || $scope.namespaces.length == 0) {
if (!$scope.user || $scope.user.anonymous || $scope.loading) {
return;
}
$scope.namespaces.map(function(namespace) {
var options = {
'public': false,
'sort': true,
'namespace': namespace.name,
};
var options = {
'public': false,
'sort': true
};
namespace.repositories = ApiService.listReposAsResource().withOptions(options).get(function(resp) {
return resp.repositories.map(findDuplicateRepo);
});
$scope.repositoriesResource = ApiService.listReposAsResource().withOptions(options).get(function(resp) {
for (var i = 0; i < resp.repositories.length; ++i) {
var repository = resp.repositories[i];
var namespace = repository.namespace;
var namespaceInfo = $scope.namespaceMap[namespace];
if (!namespaceInfo) {
continue;
}
namespaceInfo.repositories.value.push(repository);
if (repository.is_starred) {
$scope.starred_repositories.value.push(repository);
}
}
for (var i = 0; i < $scope.namespaces.length; ++i) {
var namespaceInfo = $scope.namespaces[i];
namespaceInfo.repositories.loading = false;
}
$scope.starred_repositories.loading = false;
});
};
}