diff --git a/swh/web/api/views/origin.py b/swh/web/api/views/origin.py --- a/swh/web/api/views/origin.py +++ b/swh/web/api/views/origin.py @@ -217,19 +217,19 @@ :swh_web_api:`origin/search/python/?limit=2` """ result = {} - offset = int(request.query_params.get('offset', '0')) limit = min(int(request.query_params.get('limit', '70')), 1000) + page_token = request.query_params.get('page_token') with_visit = request.query_params.get('with_visit', 'false') - results = api_lookup(service.search_origin, url_pattern, offset, limit, - bool(strtobool(with_visit)), - enrich_fn=_enrich_origin) + (results, page_token) = api_lookup( + service.search_origin, url_pattern, limit, + bool(strtobool(with_visit)), page_token, + enrich_fn=_enrich_origin) - nb_results = len(results) - if nb_results == limit: + if page_token is not None: query_params = {} - query_params['offset'] = offset + limit query_params['limit'] = limit + query_params['page_token'] = page_token result['headers'] = { 'link-next': reverse('api-1-origin-search', diff --git a/swh/web/common/service.py b/swh/web/common/service.py --- a/swh/web/common/service.py +++ b/swh/web/common/service.py @@ -247,19 +247,20 @@ return map(converters.from_origin, origins) -def search_origin(url_pattern, offset=0, limit=50, with_visit=False): +def search_origin(url_pattern, limit=50, with_visit=False, page_token=None): """Search for origins whose urls contain a provided string pattern or match a provided regular expression. Args: url_pattern: the string pattern to search for in origin urls - offset: number of found origins to skip before returning results limit: the maximum number of found origins to return + page_token: opaque string used to get the next results of a search Returns: list of origin information as dict. """ + offset = int(page_token) if page_token else 0 regexp = True search_words = [re.escape(word) for word in url_pattern.split()] if len(search_words) >= 7: @@ -272,7 +273,12 @@ origins = storage.origin_search(url_pattern, offset, limit, regexp, with_visit) - return map(converters.from_origin, origins) + origins = list(map(converters.from_origin, origins)) + if len(origins) >= limit: + page_token = str(offset + len(origins)) + else: + page_token = None + return (origins, page_token) def search_origin_metadata(fulltext, limit=50):