diff --git a/doc/release/RELEASE-NOTES.md b/doc/release/RELEASE-NOTES.md index 0a644e506..bbbed7477 100644 --- a/doc/release/RELEASE-NOTES.md +++ b/doc/release/RELEASE-NOTES.md @@ -21,6 +21,7 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html * [OSDEV-1346](https://opensupplyhub.atlassian.net/browse/OSDEV-1346) - Create GET request for `v1/moderation-events` endpoint. * [OSDEV-1332](https://opensupplyhub.atlassian.net/browse/OSDEV-1332) - Introduced new `PATCH api/v1/moderation-events/{moderation_id}` endpoint to modify moderation event `status`. +* [OSDEV-1347](https://opensupplyhub.atlassian.net/browse/OSDEV-1347) - Create GET request for `v1/moderation-events/{moderation_id}` endpoint. ### Architecture/Environment changes * *Describe architecture/environment changes here.* diff --git a/src/django/api/views/v1/moderation_events.py b/src/django/api/views/v1/moderation_events.py index 9440499ce..05c87171d 100644 --- a/src/django/api/views/v1/moderation_events.py +++ b/src/django/api/views/v1/moderation_events.py @@ -1,3 +1,4 @@ +from django.http import QueryDict from rest_framework import status from rest_framework.viewsets import ViewSet from rest_framework.response import Response @@ -59,13 +60,33 @@ def list(self, request): return Response(response) @handle_errors_decorator - def patch(self, request, moderation_id): + def retrieve(self, _, pk=None): + if not ModerationIdValidator.is_valid_uuid(pk): + return handle_path_error( + field="moderation_id", + message="Invalid UUID format.", + status_code=status.HTTP_400_BAD_REQUEST + ) + + query_params = QueryDict('', mutable=True) + query_params.update({'moderation_id': pk}) + query_body = self.opensearch_query_director.build_query( + query_params + ) + response = self.opensearch_service.search_index( + OpenSearchIndexNames.MODERATION_EVENTS_INDEX, + query_body + ) + return Response(response) + + @handle_errors_decorator + def patch(self, request, pk=None): if not (request.user.is_superuser or request.user.is_staff): raise PermissionDenied( detail="Only the Moderator can perform this action." ) - if not ModerationIdValidator.is_valid_uuid(moderation_id): + if not ModerationIdValidator.is_valid_uuid(pk): return handle_path_error( field="moderation_id", message="Invalid UUID format.", @@ -73,7 +94,7 @@ def patch(self, request, moderation_id): ) try: - event = ModerationEvent.objects.get(uuid=moderation_id) + event = ModerationEvent.objects.get(uuid=pk) except ModerationEvent.DoesNotExist: return handle_path_error( field="moderation_id", diff --git a/src/django/oar/urls.py b/src/django/oar/urls.py index 11fef4d2c..a746e15c2 100644 --- a/src/django/oar/urls.py +++ b/src/django/oar/urls.py @@ -102,6 +102,11 @@ ProductionLocations.as_view({'get': 'retrieve'}), name='production-locations-details' ), + path( + 'api/v1/moderation-events//', + ModerationEvents.as_view({'get': 'retrieve'}), + name='moderation-events-details' + ), path( 'api/v1/moderation-events//', ModerationEvents.as_view({'patch': 'patch'}), diff --git a/src/tests/v1/test_moderation_events.py b/src/tests/v1/test_moderation_events.py index a8c966e71..71a2d02f1 100644 --- a/src/tests/v1/test_moderation_events.py +++ b/src/tests/v1/test_moderation_events.py @@ -5,6 +5,26 @@ class ModerationEventsTest(BaseAPITest): + def test_moderation_events_exact(self): + moderation_id_wrong = '0f35a90f-70a0-4c3e-8e06-2ed8e1fc6800' + response = requests.get( + f"{self.root_url}/api/v1/moderation-events/{moderation_id_wrong}", + headers=self.basic_headers, + ) + + result = response.json() + self.assertEqual(result['count'], 0) + + moderation_id = '1f35a90f-70a0-4c3e-8e06-2ed8e1fc6800' + response = requests.get( + f"{self.root_url}/api/v1/moderation-events/{moderation_id}", + headers=self.basic_headers, + ) + + result = response.json() + self.assertEqual(result['count'], 1) + self.assertEqual(result['data'][0]['moderation_id'], moderation_id) + def test_moderation_events_status(self): response = requests.get( f"{self.root_url}/api/v1/moderation-events/",