fix(openapi): Use a proper serializer for Search endpoint

This commit is contained in:
Georg Krause 2022-10-13 10:59:47 +02:00
parent f1d50d0c17
commit 2d913862e1
No known key found for this signature in database
GPG Key ID: 2970D504B2183D22
3 changed files with 20 additions and 15 deletions

View File

@ -556,7 +556,7 @@ class UploadActionSerializer(common_serializers.ActionSerializer):
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = tag_models.Tag
fields = ("id", "name", "creation_date")
fields = ("name", "creation_date")
class SimpleAlbumSerializer(serializers.ModelSerializer):
@ -850,3 +850,10 @@ class FSImportSerializer(serializers.Serializer):
return self.context["user"].actor.libraries.get(uuid=value)
except models.Library.DoesNotExist:
raise serializers.ValidationError("Invalid library")
class SearchResultSerializer(serializers.Serializer):
artists = ArtistWithAlbumsSerializer(many=True)
tracks = TrackSerializer(many=True)
albums = AlbumSerializer(many=True)
tags = TagSerializer(many=True)

View File

@ -820,7 +820,9 @@ class Search(views.APIView):
required_scope = "libraries"
anonymous_policy = "setting"
@extend_schema(operation_id="get_search_results")
@extend_schema(
operation_id="get_search_results", responses=serializers.SearchResultSerializer
)
def get(self, request, *args, **kwargs):
query = request.GET.get("query", request.GET.get("q", "")) or ""
query = query.strip()
@ -828,25 +830,20 @@ class Search(views.APIView):
return Response({"detail": "empty query"}, status=400)
try:
results = {
# 'tags': serializers.TagSerializer(self.get_tags(query), many=True).data,
"artists": serializers.ArtistWithAlbumsSerializer(
self.get_artists(query), many=True
).data,
"tracks": serializers.TrackSerializer(
self.get_tracks(query), many=True
).data,
"albums": serializers.AlbumSerializer(
self.get_albums(query), many=True
).data,
"tags": TagSerializer(self.get_tags(query), many=True).data,
"artists": self.get_artists(query),
"tracks": self.get_tracks(query),
"albums": self.get_albums(query),
"tags": self.get_tags(query),
}
except django.db.utils.ProgrammingError as e:
if "in tsquery:" in str(e):
return Response({"detail": "Invalid query"}, status=400)
return Response(
{"detail": "Invalid query"}, status=400
) # TODO This might be better a 500?
else:
raise
return Response(results, status=200)
return Response(serializers.SearchResultSerializer(results).data, status=200)
def get_tracks(self, query):
query_obj = utils.get_fts_query(

View File

@ -0,0 +1 @@
Use proper serializer for Search endpoint (#1902)