diff --git a/swh/graphql/resolvers/base_connection.py b/swh/graphql/resolvers/base_connection.py index 7f6d48c..43f548b 100644 --- a/swh/graphql/resolvers/base_connection.py +++ b/swh/graphql/resolvers/base_connection.py @@ -1,83 +1,96 @@ """ """ from abc import ABC, abstractmethod from swh.graphql.utils import utils # from dataclasses import dataclass # @dataclass # class PageInfo: # nex_page_token: str # class Arguments: # """ # dataclass # """ # after # Elements that come after the specified cursor # first # Returns the first n elements class BaseConnection(ABC): def __init__(self, obj, info, **kwargs): self.obj = obj self.info = info self.kwargs = kwargs self._page_data = None self.pageInfo = self.page_info self.totalCount = self.total_count def __call__(self): return self @property def edges(self): return self._get_edges() @property def nodes(self): return self.page_data.results @property def page_info(self): # FIXME Replace with a dataclass # return PageInfo(self.page_data.next_page_token) return { "hasNextPage": bool(self.page_data.next_page_token), "endCursor": utils.get_encoded_cursor(self.page_data.next_page_token), } @property def total_count(self): """ Will be None for most of the connections + override if needed """ return None @property def page_data(self): """ Cache to avoid multiple calls to the backend """ if self._page_data is None: # FIXME, make this call async (not for v1) self._page_data = self._get_page_results() return self._page_data @abstractmethod def _get_page_results(self): """ Override for desired behaviour """ return None def _get_edges(self): return [{"cursor": "test", "node": each} for each in self.page_data.results] + + def _get_after_arg(self): + """ + Return the decoded next page token + """ + return utils.get_decoded_cursor(self.kwargs.get("after")) + + def _get_first_arg(self): + """ + Override to set the default page size + """ + return self.kwargs.get("first", 50) diff --git a/swh/graphql/resolvers/origin.py b/swh/graphql/resolvers/origin.py index c2b1423..f9eca5c 100644 --- a/swh/graphql/resolvers/origin.py +++ b/swh/graphql/resolvers/origin.py @@ -1,18 +1,18 @@ from .base_connection import BaseConnection from .base_node import BaseNode from swh.graphql.backends import archive class OriginConnection(BaseConnection): def _get_page_results(self): # FIXME, make this call async (not for v1) return archive.Archive().get_origins( - after=self.kwargs.get("after"), first=self.kwargs.get("first", 50) + after=self._get_after_arg(), first=self._get_first_arg() ) class OriginNode(BaseNode): def _get_node(self): # FIXME, make this call async (not for v1) return archive.Archive().get_origin(self.kwargs.get("url")) diff --git a/swh/graphql/utils/utils.py b/swh/graphql/utils/utils.py index f224a82..ebe0394 100644 --- a/swh/graphql/utils/utils.py +++ b/swh/graphql/utils/utils.py @@ -1,9 +1,13 @@ # import base64 def get_encoded_cursor(cursor): + if cursor is None: + return None return cursor def get_decoded_cursor(cursor): + if cursor is None: + return None return cursor