Source code for swh.graphql.resolvers.snapshot

# Copyright (C) 2022 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information

from typing import TYPE_CHECKING, Optional, Union

from swh.graphql.utils import utils
from swh.model.model import CoreSWHID, Snapshot

from .base_connection import BaseConnection, ConnectionData
from .base_node import BaseSWHNode
from .origin import OriginNode
from .visit_status import BaseVisitStatusNode


[docs] class BaseSnapshotNode(BaseSWHNode): """ Base resolver for all the snapshot nodes """
[docs] def is_type_of(self): # is_type_of is required only when resolving a UNION type # This is for ariadne to return the right type return "Snapshot"
[docs] class SnapshotNode(BaseSnapshotNode): """ Node resolver for a snapshot requested directly with its SWHID """ def _get_node_data(self) -> Optional[Snapshot]: """ """ swhid = self.kwargs.get("swhid") assert isinstance(swhid, CoreSWHID) return self.archive.get_snapshot(snapshot_id=swhid.object_id, verify=True)
[docs] class VisitSnapshotNode(BaseSnapshotNode): """ Node resolver for a snapshot requested from a visit-status """ # Visit snapshot is not using the target indirection, # hence this implementation (not using TargetSnapshotNode) _can_be_null = True obj: BaseVisitStatusNode def _get_node_data(self): snapshot_id = self.obj.snapshot_id() if snapshot_id is None: return None return self.archive.get_snapshot(snapshot_id=snapshot_id, verify=False)
[docs] class TargetSnapshotNode(BaseSnapshotNode): """ Node resolver for a snapshot requested as a target """ if TYPE_CHECKING: # pragma: no cover from .target import BranchTargetNode obj: Union[BranchTargetNode] _can_be_null = True def _get_node_data(self): return self.archive.get_snapshot(snapshot_id=self.obj.target_hash, verify=False)
[docs] class LatestSnapshotNode(BaseSnapshotNode): """ Node resolver for the latest snapshot in an origin """ obj: OriginNode _can_be_null = True def _get_node_data(self): latest_status_with_snapshot = self.archive.get_latest_origin_visit_status( origin=self.obj.url, require_snapshot=True, ) if not latest_status_with_snapshot: return None return self.archive.get_snapshot( snapshot_id=latest_status_with_snapshot.snapshot, verify=False )
[docs] class OriginSnapshotConnection(BaseConnection): """ Connection resolver for the snapshots in an origin """ obj: OriginNode _node_class = BaseSnapshotNode def _get_connection_data(self) -> ConnectionData: results = self.archive.get_origin_snapshots(self.obj.url) snapshots = [ self.archive.get_snapshot(snapshot_id=snapshot, verify=False) for snapshot in results ] # FIXME, using dummy(local) pagination, move pagination to backend # To remove localpagination, just drop the paginated call # STORAGE-TODO return utils.get_local_paginated_data( snapshots, self._get_first_arg(), self._get_after_arg() )