From 25755ad39b6f9dbddf8fd45307a7b4bae1177dd8 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Sun, 22 Jul 2018 11:56:25 +0200
Subject: [PATCH] Fixed #384: unfiltered results in favorites API

---
 api/funkwhale_api/favorites/filters.py  | 15 +++++++++++++++
 api/funkwhale_api/favorites/views.py    |  3 ++-
 api/tests/favorites/test_favorites.py   |  3 ++-
 changes/changelog.d/384.bugfix          |  1 +
 front/src/components/favorites/List.vue |  2 +-
 front/src/store/favorites.js            |  7 +++++--
 6 files changed, 26 insertions(+), 5 deletions(-)
 create mode 100644 api/funkwhale_api/favorites/filters.py
 create mode 100644 changes/changelog.d/384.bugfix

diff --git a/api/funkwhale_api/favorites/filters.py b/api/funkwhale_api/favorites/filters.py
new file mode 100644
index 0000000000..a355593d91
--- /dev/null
+++ b/api/funkwhale_api/favorites/filters.py
@@ -0,0 +1,15 @@
+from django_filters import rest_framework as filters
+
+from funkwhale_api.common import fields
+
+from . import models
+
+
+class TrackFavoriteFilter(filters.FilterSet):
+    q = fields.SearchFilter(
+        search_fields=["track__title", "track__artist__name", "track__album__title"]
+    )
+
+    class Meta:
+        model = models.TrackFavorite
+        fields = ["user", "q"]
diff --git a/api/funkwhale_api/favorites/views.py b/api/funkwhale_api/favorites/views.py
index ae47e03f25..dae90ebbdc 100644
--- a/api/funkwhale_api/favorites/views.py
+++ b/api/funkwhale_api/favorites/views.py
@@ -7,7 +7,7 @@ from funkwhale_api.activity import record
 from funkwhale_api.common import fields, permissions
 from funkwhale_api.music.models import Track
 
-from . import models, serializers
+from . import filters, models, serializers
 
 
 class TrackFavoriteViewSet(
@@ -17,6 +17,7 @@ class TrackFavoriteViewSet(
     viewsets.GenericViewSet,
 ):
 
+    filter_class = filters.TrackFavoriteFilter
     serializer_class = serializers.UserTrackFavoriteSerializer
     queryset = (
         models.TrackFavorite.objects.all()
diff --git a/api/tests/favorites/test_favorites.py b/api/tests/favorites/test_favorites.py
index 6ef323db50..0b99c93409 100644
--- a/api/tests/favorites/test_favorites.py
+++ b/api/tests/favorites/test_favorites.py
@@ -20,8 +20,9 @@ def test_user_can_add_favorite(factories):
 def test_user_can_get_his_favorites(api_request, factories, logged_in_client, client):
     r = api_request.get("/")
     favorite = factories["favorites.TrackFavorite"](user=logged_in_client.user)
+    factories["favorites.TrackFavorite"]()
     url = reverse("api:v1:favorites:tracks-list")
-    response = logged_in_client.get(url)
+    response = logged_in_client.get(url, {"user": logged_in_client.user.pk})
     expected = [
         {
             "user": users_serializers.UserBasicSerializer(
diff --git a/changes/changelog.d/384.bugfix b/changes/changelog.d/384.bugfix
new file mode 100644
index 0000000000..c8920985bc
--- /dev/null
+++ b/changes/changelog.d/384.bugfix
@@ -0,0 +1 @@
+Fixed unfiltered results in favorites API (#384)
diff --git a/front/src/components/favorites/List.vue b/front/src/components/favorites/List.vue
index 71355536ed..eacea63eca 100644
--- a/front/src/components/favorites/List.vue
+++ b/front/src/components/favorites/List.vue
@@ -11,7 +11,7 @@
         <translate
           translate-plural="%{ count } favorites"
           :translate-n="$store.state.favorites.count"
-          :translate-params="{count: $store.state.favorites.count}">
+          :translate-params="{count: results.count}">
           1 favorite
         </translate>
       </h2>
diff --git a/front/src/store/favorites.js b/front/src/store/favorites.js
index b7e7895112..5983d18051 100644
--- a/front/src/store/favorites.js
+++ b/front/src/store/favorites.js
@@ -53,10 +53,13 @@ export default {
     toggle ({getters, dispatch}, id) {
       dispatch('set', {id, value: !getters['isFavorite'](id)})
     },
-    fetch ({dispatch, state, commit}, url) {
+    fetch ({dispatch, state, commit, rootState}, url) {
       // will fetch favorites by batches from API to have them locally
+      let params = {
+        user: rootState.auth.profile.id
+      }
       url = url || 'favorites/tracks/'
-      return axios.get(url).then((response) => {
+      return axios.get(url, {params: params}).then((response) => {
         logger.default.info('Fetched a batch of ' + response.data.results.length + ' favorites')
         response.data.results.forEach(result => {
           commit('track', {id: result.track, value: true})
-- 
GitLab