diff --git a/api/funkwhale_api/common/serializers.py b/api/funkwhale_api/common/serializers.py index 8504fc587..d623b2cae 100644 --- a/api/funkwhale_api/common/serializers.py +++ b/api/funkwhale_api/common/serializers.py @@ -359,3 +359,12 @@ class RateLimitSerializer(serializers.Serializer): enabled = serializers.BooleanField() ident = IdentSerializer() scopes = serializers.ListField(child=ScopesSerializer()) + + +class ErrorDetailSerializer(serializers.Serializer): + detail = serializers.CharField(source="*") + + +class TextPreviewSerializer(serializers.Serializer): + rendered = serializers.CharField(read_only=True, source="*") + text = serializers.CharField(write_only=True) diff --git a/api/funkwhale_api/common/views.py b/api/funkwhale_api/common/views.py index a19927599..6f0a5d896 100644 --- a/api/funkwhale_api/common/views.py +++ b/api/funkwhale_api/common/views.py @@ -18,6 +18,11 @@ from config import plugins from funkwhale_api.users.oauth import permissions as oauth_permissions +from funkwhale_api.common.serializers import ( + ErrorDetailSerializer, + TextPreviewSerializer, +) + from . import filters from . import models from . import mutations @@ -205,18 +210,21 @@ class AttachmentViewSet( class TextPreviewView(views.APIView): permission_classes = [] - @extend_schema(operation_id="preview_text") + @extend_schema( + operation_id="preview_text", + responses={200: TextPreviewSerializer, 400: ErrorDetailSerializer}, + ) def post(self, request, *args, **kwargs): payload = request.data if "text" not in payload: - return response.Response({"detail": "Invalid input"}, status=400) + return response.Response( + ErrorDetailSerializer("Invalid input").data, status=400 + ) permissive = payload.get("permissive", False) - data = { - "rendered": utils.render_html( - payload["text"], "text/markdown", permissive=permissive - ) - } + data = TextPreviewSerializer( + utils.render_html(payload["text"], "text/markdown", permissive=permissive) + ).data return response.Response(data, status=200) diff --git a/api/tests/common/test_views.py b/api/tests/common/test_views.py index 3e1255fcc..cb7f37811 100644 --- a/api/tests/common/test_views.py +++ b/api/tests/common/test_views.py @@ -273,6 +273,16 @@ def test_attachment_destroy_not_owner(factories, logged_in_api_client): attachment.refresh_from_db() +def test_render_fails_for_no_text(api_client): + payload = {} + url = reverse("api:v1:text-preview") + response = api_client.post(url, payload) + + expected = {"detail": "Invalid input"} + assert response.status_code == 400 + assert response.data == expected + + def test_can_render_text_preview(api_client, db): payload = {"text": "Hello world"} url = reverse("api:v1:text-preview") diff --git a/changes/changelog.d/1903.enhancement b/changes/changelog.d/1903.enhancement new file mode 100644 index 000000000..eff5f045e --- /dev/null +++ b/changes/changelog.d/1903.enhancement @@ -0,0 +1 @@ +Add proper serialization for TextPreviewView (#1903)