diff --git a/chord_metadata_service/chord/api_views.py b/chord_metadata_service/chord/api_views.py index ed28bf86a..59e0c9535 100644 --- a/chord_metadata_service/chord/api_views.py +++ b/chord_metadata_service/chord/api_views.py @@ -12,6 +12,7 @@ from django_filters.rest_framework import DjangoFilterBackend from chord_metadata_service.cleanup.run_all import run_all_cleanup +from chord_metadata_service.resources.serializers import ResourceSerializer from chord_metadata_service.restapi.api_renderers import PhenopacketsRenderer, JSONLDDatasetRenderer, RDFDatasetRenderer from chord_metadata_service.restapi.pagination import LargeResultsSetPagination @@ -85,6 +86,15 @@ def dats(self, _request, *_args, **_kwargs): dataset = self.get_object() return Response(json.loads(dataset.dats_file)) + @action(detail=True, methods=["get"]) + def resources(self, _request, *_args, **_kwargs): + """ + Retrieve all resources (phenopackets/additional_resources) for a dataset and return a JSON response serialized + using ResourceSerializer + """ + dataset = self.get_object() + return Response(ResourceSerializer(dataset.resources.all(), many=True).data) + @async_to_sync async def destroy(self, request, *args, **kwargs): get_obj_async = sync_to_async(self.get_object) diff --git a/chord_metadata_service/chord/tests/test_api.py b/chord_metadata_service/chord/tests/test_api.py index a5c455fa6..1e710f7ed 100644 --- a/chord_metadata_service/chord/tests/test_api.py +++ b/chord_metadata_service/chord/tests/test_api.py @@ -111,6 +111,35 @@ def test_dats(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertDictEqual(response.data, json.loads(payload['dats_file'])) + def test_resources(self): + resource = { + "id": "NCBITaxon:2023-09-14", + "name": "NCBI Taxonomy OBO Edition", + "version": "2023-09-14", + "namespace_prefix": "NCBITaxon", + "url": "http://purl.obolibrary.org/obo/ncbitaxon/2023-09-14/ncbitaxon.owl", + "iri_prefix": "http://purl.obolibrary.org/obo/NCBITaxon_", + } + + r = self.client.post("/api/resources", data=json.dumps(resource), content_type="application/json") + self.assertEqual(r.status_code, status.HTTP_201_CREATED) + + r = self.client.post( + "/api/datasets", + data=json.dumps({ + **valid_dataset_1(self.project["identifier"]), + "additional_resources": [resource["id"]], + }), + content_type="application/json") + self.assertEqual(r.status_code, status.HTTP_201_CREATED) + + dataset_id = Dataset.objects.first().identifier + r = self.client.get(f"/api/datasets/{dataset_id}/resources") + self.assertEqual(r.status_code, status.HTTP_200_OK) + self.assertEqual(len(r.data), 1) + self.assertEqual(r.data[0]["id"], resource["id"]) + + # TODO: Update Dataset # TODO: Delete Dataset