Merge pull request #1217 from coreos-inc/v2pagination
Fix V2 catalog and tag pagination
This commit is contained in:
commit
81a36ee3b8
7 changed files with 105 additions and 38 deletions
|
@ -1,19 +1,22 @@
|
|||
from flask import jsonify, url_for
|
||||
|
||||
from endpoints.v2 import v2_bp
|
||||
from auth.auth import process_auth
|
||||
from auth.registry_jwt_auth import process_registry_jwt_auth, get_granted_entity
|
||||
from endpoints.decorators import anon_protect
|
||||
from data import model
|
||||
from endpoints.v2.v2util import add_pagination
|
||||
from auth.auth_context import get_authenticated_user
|
||||
|
||||
@v2_bp.route('/_catalog', methods=['GET'])
|
||||
@process_auth
|
||||
@process_registry_jwt_auth
|
||||
@anon_protect
|
||||
def catalog_search():
|
||||
url = url_for('v2.catalog_search')
|
||||
|
||||
username = get_authenticated_user().username if get_authenticated_user() else None
|
||||
username = None
|
||||
entity = get_granted_entity()
|
||||
if entity:
|
||||
username = entity.user.username
|
||||
|
||||
query = model.repository.get_visible_repositories(username, include_public=(username is None))
|
||||
link, query = add_pagination(query, url)
|
||||
|
||||
|
|
|
@ -1,19 +1,42 @@
|
|||
from flask import request
|
||||
from app import get_app_url
|
||||
from util.pagination import encrypt_page_token, decrypt_page_token
|
||||
import urllib
|
||||
import logging
|
||||
|
||||
_MAX_RESULTS_PER_PAGE = 100
|
||||
_MAX_RESULTS_PER_PAGE = 50
|
||||
|
||||
def add_pagination(query, url):
|
||||
""" Adds optional pagination to the given query by looking for the Docker V2 pagination request
|
||||
args. """
|
||||
limit = request.args.get('n', None)
|
||||
page = request.args.get('page', 1)
|
||||
args.
|
||||
"""
|
||||
try:
|
||||
requested_limit = int(request.args.get('n', _MAX_RESULTS_PER_PAGE))
|
||||
except ValueError:
|
||||
requested_limit = 0
|
||||
|
||||
if limit is None:
|
||||
return None, query
|
||||
limit = max(min(requested_limit, _MAX_RESULTS_PER_PAGE), 1)
|
||||
next_page_token = request.args.get('next_page', None)
|
||||
|
||||
limit = max(limit, _MAX_RESULTS_PER_PAGE)
|
||||
# Decrypt the next page token, if any.
|
||||
offset = 0
|
||||
page_info = decrypt_page_token(next_page_token)
|
||||
if page_info is not None:
|
||||
# Note: we use offset here instead of ID >= n because one of the V2 queries is a UNION.
|
||||
offset = page_info.get('offset', 0)
|
||||
query = query.offset(offset)
|
||||
|
||||
query = query.limit(limit + 1)
|
||||
url = get_app_url() + url
|
||||
query = query.paginate(page, limit)
|
||||
link = url + '?n=%s&last=%s; rel="next"' % (limit, page + 1)
|
||||
return link, query
|
||||
|
||||
results = list(query)
|
||||
if len(results) <= limit:
|
||||
return None, results
|
||||
|
||||
# Add a link to the next page of results.
|
||||
page_info = dict(offset=limit + offset)
|
||||
next_page_token = encrypt_page_token(page_info)
|
||||
|
||||
link = url + '?' + urllib.urlencode(dict(n=limit, next_page=next_page_token))
|
||||
link = link + '; rel="next"'
|
||||
return link, results[0:-1]
|
||||
|
|
Reference in a new issue