From dda1cd25313688b0e47437f76d4c82ccdf3b116a Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Thu, 12 Apr 2018 18:42:21 +0200 Subject: [PATCH] Added scan endpoint to trigger a scan for a library --- api/funkwhale_api/federation/serializers.py | 4 +++ api/funkwhale_api/federation/views.py | 16 +++++++++- api/tests/federation/test_views.py | 29 +++++++++++++++++-- .../src/components/federation/LibraryForm.vue | 2 +- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py index 42054c7c4..620c27698 100644 --- a/api/funkwhale_api/federation/serializers.py +++ b/api/funkwhale_api/federation/serializers.py @@ -176,6 +176,10 @@ class APILibrarySerializer(serializers.ModelSerializer): ] + read_only_fields +class APILibraryScanSerializer(serializers.Serializer): + until = serializers.DateTimeField(required=False) + + class APILibraryCreateSerializer(serializers.ModelSerializer): actor = serializers.URLField() federation_enabled = serializers.BooleanField() diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py index cac6c4163..9c56728bc 100644 --- a/api/funkwhale_api/federation/views.py +++ b/api/funkwhale_api/federation/views.py @@ -25,6 +25,7 @@ from . import models from . import permissions from . import renderers from . import serializers +from . import tasks from . import utils from . import webfinger @@ -186,7 +187,7 @@ class LibraryViewSet( ) @list_route(methods=['get']) - def scan(self, request, *args, **kwargs): + def fetch(self, request, *args, **kwargs): account = request.GET.get('account') if not account: return response.Response( @@ -195,6 +196,19 @@ class LibraryViewSet( data = library.scan_from_account_name(account) return response.Response(data) + @detail_route(methods=['post']) + def scan(self, request, *args, **kwargs): + library = self.get_object() + serializer = serializers.APILibraryScanSerializer( + data=request.data + ) + serializer.is_valid(raise_exception=True) + id = tasks.scan_library.delay( + library_id=library.pk, + until=serializer.validated_data['until'] + ) + return response.Response({'task': id}) + @list_route(methods=['get']) def following(self, request, *args, **kwargs): library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance() diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py index 72feaabfd..c54cc873e 100644 --- a/api/tests/federation/test_views.py +++ b/api/tests/federation/test_views.py @@ -1,5 +1,6 @@ -from django.urls import reverse from django.core.paginator import Paginator +from django.urls import reverse +from django.utils import timezone import pytest @@ -168,13 +169,13 @@ def test_library_actor_includes_library_link(db, settings, api_client): assert response.data['url'] == expected_links -def test_can_scan_library(superuser_api_client, mocker): +def test_can_fetch_library(superuser_api_client, mocker): result = {'test': 'test'} scan = mocker.patch( 'funkwhale_api.federation.library.scan_from_account_name', return_value=result) - url = reverse('api:v1:federation:libraries-scan') + url = reverse('api:v1:federation:libraries-fetch') response = superuser_api_client.get( url, data={'account': 'test@test.library'}) @@ -306,3 +307,25 @@ def test_can_patch_library(factories, superuser_api_client): for k, v in data.items(): assert getattr(library, k) == v + + +def test_scan_library(factories, mocker, superuser_api_client): + scan = mocker.patch( + 'funkwhale_api.federation.tasks.scan_library.delay', + return_value='id') + library = factories['federation.Library']() + now = timezone.now() + data = { + 'until': now, + } + url = reverse( + 'api:v1:federation:libraries-scan', + kwargs={'uuid': str(library.uuid)}) + response = superuser_api_client.post(url, data) + + assert response.status_code == 200 + assert response.data == {'task': 'id'} + scan.assert_called_once_with( + library_id=library.pk, + until=now + ) diff --git a/front/src/components/federation/LibraryForm.vue b/front/src/components/federation/LibraryForm.vue index 5da46dc17..3aec5213d 100644 --- a/front/src/components/federation/LibraryForm.vue +++ b/front/src/components/federation/LibraryForm.vue @@ -72,7 +72,7 @@ export default { this.isLoading = true self.errors = [] self.result = null - axios.get('/federation/libraries/scan/', {params: {account: this.libraryUsername}}).then((response) => { + axios.get('/federation/libraries/fetch/', {params: {account: this.libraryUsername}}).then((response) => { self.result = response.data self.result.display_name = self.libraryUsername self.isLoading = false