diff --git a/swh/graphql/resolvers/base_node.py b/swh/graphql/resolvers/base_node.py index c2aa54d..ed2d99c 100644 --- a/swh/graphql/resolvers/base_node.py +++ b/swh/graphql/resolvers/base_node.py @@ -1,32 +1,27 @@ """ """ class BaseNode: def __init__(self, obj, info, **kwargs): self.obj = obj self.info = info self.kwargs = kwargs self._node = None def __call__(self): - return self - - def __getattr__(self, attr): - if attr in self.__dict__: - return getattr(self, attr) - return getattr(self.node, attr) + return self.node @property def node(self): if self._node is None: self._node = self._get_node() return self._node def _get_node(self): """ Override for desired behaviour """ return None diff --git a/swh/graphql/resolvers/resolvers.py b/swh/graphql/resolvers/resolvers.py index f219dc5..7cce7eb 100644 --- a/swh/graphql/resolvers/resolvers.py +++ b/swh/graphql/resolvers/resolvers.py @@ -1,72 +1,76 @@ from .origin import OriginConnection, OriginNode from .visit import OriginVisitConnection from ariadne import ObjectType query = ObjectType("Query") origin = ObjectType("Origin") origins = ObjectType("OriginConnection") visit = ObjectType("Visit") -def node_resolver_factory(resolver_type): +def node_resolver_factory(resolver_type, obj, info, **kw): mapping = { "origin": OriginNode, } - return mapping[resolver_type] + return mapping[resolver_type](obj, info, **kw) -def connection_resolver_factory(resolver_type): - mapping = {"origins": OriginConnection, "origin_visits": OriginVisitConnection} - return mapping[resolver_type] +def connection_resolver_factory(resolver_type, obj, info, **kw): + mapping = { + "origins": OriginConnection, + "origin_visits": OriginVisitConnection + } + return mapping[resolver_type](obj, info, **kw) # Nodes - @query.field("origin") def resolve_origin(_, info, **kw): """ Top level query Get the origin matching the URL """ - # FIXME change to static factory in base class - return node_resolver_factory("origin")(None, info, **kw) + # FIXME change to static factory in base class to avoid args + return node_resolver_factory("origin", None, info, **kw)() @origin.field("id") def origin_id(origin, info): # Using ariadne decorator to avoid infinite loop issue with id return origin.id.hex() # def resolve_visit(_, info, **kw): # pass - @visit.field("date") def visit_date(visit, info): return visit.date.timestamp() @visit.field("id") def visit_id(visit, info): return str(visit.visit) # Connections @query.field("origins") def resolve_origins(_, info, **kw): # FIXME change to static factory in base class - return connection_resolver_factory("origins")(None, info, **kw) + return connection_resolver_factory("origins", None, info, **kw)() @origin.field("visits") def origin_visits(origin, info, **kw): - return connection_resolver_factory("origin_visits")(origin, info, **kw) + return connection_resolver_factory("origin_visits", origin, info, **kw)() +@visit.field("status") +def origin_visits(origin, info, **kw): + return connection_resolver_factory("origin_visits", origin, info, **kw)() # Other diff --git a/swh/graphql/schema/schema.graphql b/swh/graphql/schema/schema.graphql index 0c91f4e..294f7bb 100644 --- a/swh/graphql/schema/schema.graphql +++ b/swh/graphql/schema/schema.graphql @@ -1,99 +1,106 @@ interface Node { id: ID! } scalar Date type PageInfo { endCursor: String hasNextPage: Boolean! } type Origin implements Node { url: String! id: ID! visits( first: Int after: String ): VisitConnection! } type OriginEdge { cursor: String! node: Origin } type OriginConnection { edges: [OriginEdge] nodes: [Origin] pageInfo: PageInfo! totalCount: Int } type Visit implements Node { id: ID! date: Date! status: VisitStatusConnection # origin: Origin } type VisitEdge { cursor: String! node: Visit } type VisitConnection { edges: [VisitEdge] nodes: [Visit] pageInfo: PageInfo! totalCount: Int } type VisitStatus implements Node { id: ID! status: String! date: Date! snapshot: String type: String } type VisitStatusEdge { cursor: String! node: [VisitStatus] } type VisitStatusConnection { edges: [VisitStatusEdge] nodes: [VisitStatus] pageInfo: PageInfo! totalCount: Int } type Snapshot implements Node { id: ID! # branches } type Query { """ Get an origin with its url """ origin( url: String! ): Origin """ Get a list of origins matching the given filters """ origins( first: Int after: String ): OriginConnection! # visit( # originUrl: String! # id: String! # ): Visit } + + +# Remove statusConnection +# Make visit obj by making multiple calls +# Make snapshot object +# Make revisionconnection +# Make contnetConnection