diff --git a/swh/graphql/backends/archive.py b/swh/graphql/backends/archive.py --- a/swh/graphql/backends/archive.py +++ b/swh/graphql/backends/archive.py @@ -44,8 +44,19 @@ def get_origin_visit(self, origin_url: str, visit_id: int) -> Optional[OriginVisit]: return self.storage.origin_visit_get_by(origin=origin_url, visit=visit_id) - def get_origin_latest_visit(self, origin_url: str) -> Optional[OriginVisit]: - return self.storage.origin_visit_get_latest(origin=origin_url) + def get_origin_latest_visit( + self, + origin_url: str, + visit_type: Optional[str] = None, + allowed_statuses: Optional[List[str]] = None, + require_snapshot: bool = False, + ) -> Optional[OriginVisit]: + return self.storage.origin_visit_get_latest( + origin=origin_url, + type=visit_type, + allowed_statuses=allowed_statuses, + require_snapshot=require_snapshot, + ) def get_visit_status( self, diff --git a/swh/graphql/resolvers/visit.py b/swh/graphql/resolvers/visit.py --- a/swh/graphql/resolvers/visit.py +++ b/swh/graphql/resolvers/visit.py @@ -48,7 +48,12 @@ def _get_node_data(self): # self.obj.url is the origin URL - return self.archive.get_origin_latest_visit(self.obj.url) + return self.archive.get_origin_latest_visit( + origin_url=self.obj.url, + visit_type=self.kwargs.get("visitType"), + allowed_statuses=self.kwargs.get("allowedStatuses"), + require_snapshot=self.kwargs.get("requireSnapshot"), + ) class OriginVisitConnection(BaseConnection): diff --git a/swh/graphql/schema/schema.graphql b/swh/graphql/schema/schema.graphql --- a/swh/graphql/schema/schema.graphql +++ b/swh/graphql/schema/schema.graphql @@ -137,7 +137,22 @@ """ Latest visit object for the origin """ - latestVisit: Visit + latestVisit( + """ + Return the latest visit with the given visit type + """ + visitType: String + + """ + Return the latest visit with any of the given statuses + """ + allowedStatuses: [VisitStatusState] + + """ + If True, the latest visit with a snapshot will be returned + """ + requireSnapshot: Boolean + ): Visit """ Connection to all the snapshots for the origin diff --git a/swh/graphql/tests/functional/test_origin_node.py b/swh/graphql/tests/functional/test_origin_node.py --- a/swh/graphql/tests/functional/test_origin_node.py +++ b/swh/graphql/tests/functional/test_origin_node.py @@ -57,3 +57,55 @@ assert data_origin["latestVisit"]["visitId"] == visits_and_statuses[-1].visit.visit snapshots = storage.origin_snapshot_get_all(origin.url) assert len(data_origin["snapshots"]["nodes"]) == len(snapshots) + + +def test_latest_visit_type_filter(client): + query_str = """ + { + origin(url: "%s") { + latestVisit(visitType: "%s") { + visitId + } + } + } + """ + data, _ = get_query_response(client, query_str % (get_origins()[0].url, "git")) + assert data["origin"] == {"latestVisit": {"visitId": 3}} + + data, _ = get_query_response(client, query_str % (get_origins()[0].url, "hg")) + assert data["origin"] == {"latestVisit": None} + + +def test_latest_visit_require_snapshot_filter(client): + query_str = """ + { + origin(url: "%s") { + latestVisit(requireSnapshot: %s) { + visitId + } + } + } + """ + data, _ = get_query_response(client, query_str % (get_origins()[1].url, "true")) + assert data["origin"] == {"latestVisit": {"visitId": 2}} + + +def test_latest_visit_allowed_statuses_filter(client): + query_str = """ + { + origin(url: "%s") { + latestVisit(allowedStatuses: [partial]) { + visitId + statuses { + nodes { + status + } + } + } + } + } + """ + data, _ = get_query_response(client, query_str % (get_origins()[1].url)) + assert data["origin"] == { + "latestVisit": {"statuses": {"nodes": [{"status": "partial"}]}, "visitId": 2} + }