diff --git a/requirements-swh.txt b/requirements-swh.txt index 0a4e4b76..623c03e6 100644 --- a/requirements-swh.txt +++ b/requirements-swh.txt @@ -1,7 +1,7 @@ swh.core >= 0.0.95 swh.indexer >= 0.0.171 -swh.model >= 0.3.8 +swh.model >= 0.5.0 swh.scheduler >= 0.1.1 swh.search >= 0.0.4 swh.storage >= 0.8.0 swh.vault >= 0.0.33 diff --git a/swh/web/api/views/identifiers.py b/swh/web/api/views/identifiers.py index 4f3ab1a5..ccd254f8 100644 --- a/swh/web/api/views/identifiers.py +++ b/swh/web/api/views/identifiers.py @@ -1,112 +1,112 @@ # Copyright (C) 2018-2020 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information from swh.web.api.apidoc import api_doc, format_docstring from swh.web.api.apiurls import api_route from swh.web.common import service from swh.web.common.exc import LargePayloadExc from swh.web.common.identifiers import ( resolve_swhid, get_swhid, group_swhids, ) @api_route(r"/resolve/(?P.*)/", "api-1-resolve-swhid") @api_doc("/resolve/") @format_docstring() def api_resolve_swhid(request, swhid): """ .. http:get:: /api/1/resolve/(swhid)/ Resolve :ref:`persistent-identifiers`. Try to resolve a provided SWHID into an url for browsing the pointed archive object. If the provided identifier is valid, the existence of the object in the archive will also be checked. :param string swhid: a SoftWare Heritage persistent IDentifier :>json string browse_url: the url for browsing the pointed object :>json object metadata: object holding optional parts of the SWHID :>json string namespace: the SWHID namespace :>json string object_id: the hash identifier of the pointed object :>json string object_type: the type of the pointed object :>json number scheme_version: the scheme version of the SWHID {common_headers} :statuscode 200: no error :statuscode 400: an invalid SWHID has been provided :statuscode 404: the pointed object does not exist in the archive **Example:** .. parsed-literal:: :swh_web_api:`resolve/swh:1:rev:96db9023b881d7cd9f379b0c154650d6c108e9a3;origin=https://github.com/openssl/openssl/` """ # try to resolve the provided swhid swhid_resolved = resolve_swhid(swhid) # id is well-formed, now check that the pointed # object is present in the archive, NotFoundExc # will be raised otherwise swhid_parsed = swhid_resolved["swhid_parsed"] object_type = swhid_parsed.object_type object_id = swhid_parsed.object_id service.lookup_object(object_type, object_id) # id is well-formed and the pointed object exists - swhid_data = swhid_parsed._asdict() + swhid_data = swhid_parsed.to_dict() swhid_data["browse_url"] = request.build_absolute_uri(swhid_resolved["browse_url"]) return swhid_data @api_route(r"/known/", "api-1-known", methods=["POST"]) @api_doc("/known/") @format_docstring() def api_swhid_known(request): """ .. http:post:: /api/1/known/ Check if a list of objects are present in the Software Heritage archive. The objects to check existence must be provided using :ref:`persistent-identifiers`. :json object : an object whose keys are input SWHIDs and values objects with the following keys: * **known (bool)**: whether the object was found {common_headers} :statuscode 200: no error :statuscode 400: an invalid SWHID was provided :statuscode 413: the input array of SWHIDs is too large """ limit = 1000 if len(request.data) > limit: raise LargePayloadExc( "The maximum number of SWHIDs this endpoint can receive is %s" % limit ) swhids = [get_swhid(swhid) for swhid in request.data] response = {str(swhid): {"known": False} for swhid in swhids} # group swhids by their type swhids_by_type = group_swhids(swhids) # search for hashes not present in the storage missing_hashes = service.lookup_missing_hashes(swhids_by_type) for swhid in swhids: if swhid.object_id not in missing_hashes: response[str(swhid)]["known"] = True return response