Add pagination to the repository list API to make it better for public

Fixes #1166
This commit is contained in:
Joseph Schorr 2016-02-01 13:06:13 +02:00
parent 4905f55268
commit 534ec9cb2b
5 changed files with 69 additions and 98 deletions

View file

@ -11,11 +11,12 @@ from peewee import IntegrityError
import features
from app import app, billing as stripe, authentication, avatar
from data.database import Repository as RepositoryTable
from endpoints.api import (ApiResource, nickname, resource, validate_json_request, request_error,
log_action, internal_only, NotFound, require_user_admin, parse_args,
query_param, InvalidToken, require_scope, format_date, show_if,
license_error, require_fresh_login, path_param, define_json_response,
RepositoryParamResource)
RepositoryParamResource, page_support)
from endpoints.api.subscribe import subscribe
from endpoints.common import common_login
from endpoints.decorators import anon_allowed
@ -30,6 +31,7 @@ from util.useremails import (send_confirmation_email, send_recovery_email, send_
send_password_changed, send_org_recovery_email)
from util.names import parse_single_urn
REPOS_PER_PAGE = 100
logger = logging.getLogger(__name__)
@ -833,15 +835,15 @@ class StarredRepositoryList(ApiResource):
@nickname('listStarredRepos')
@parse_args()
@query_param('page', 'Offset page number. (int)', type=int)
@query_param('limit', 'Limit on the number of results (int)', type=int)
@require_user_admin
def get(self, parsed_args):
@page_support()
def get(self, page_token, parsed_args):
""" List all starred repositories. """
page = parsed_args['page']
limit = parsed_args['limit']
starred_repos = model.repository.get_user_starred_repositories(get_authenticated_user(),
page=page, limit=limit)
repo_query = model.repository.get_user_starred_repositories(get_authenticated_user())
repos, next_page_token = model.modelutil.paginate(repo_query, RepositoryTable,
page_token=page_token, limit=REPOS_PER_PAGE)
def repo_view(repo_obj):
return {
'namespace': repo_obj.namespace_user.username,
@ -850,7 +852,7 @@ class StarredRepositoryList(ApiResource):
'is_public': repo_obj.visibility.name == 'public',
}
return {'repositories': [repo_view(repo) for repo in starred_repos]}
return {'repositories': [repo_view(repo) for repo in repos]}, next_page_token
@require_scope(scopes.READ_REPO)
@nickname('createStar')