Performance improvement when fetching favorites, down to a single, small http request

merge-requests/552/head
Eliot Berriot 2019-01-10 11:58:18 +01:00
rodzic 81e7b900fe
commit 3916986fb8
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: DD6965E2476E5C27
4 zmienionych plików z 31 dodań i 10 usunięć

Wyświetl plik

@ -71,3 +71,19 @@ class TrackFavoriteViewSet(
return Response({}, status=400)
favorite.delete()
return Response([], status=status.HTTP_204_NO_CONTENT)
@list_route(methods=["get"])
def all(self, request, *args, **kwargs):
"""
Return all the favorites of the current user, with only limited data
to have a performant endpoint and avoid lots of queries just to display
favorites status in the UI
"""
if not request.user.is_authenticated:
return Response({"results": [], "count": 0}, status=200)
favorites = list(
request.user.track_favorites.values("id", "track").order_by("id")
)
payload = {"results": favorites, "count": len(favorites)}
return Response(payload, status=200)

Wyświetl plik

@ -39,6 +39,18 @@ def test_user_can_get_his_favorites(api_request, factories, logged_in_client, cl
assert response.data["results"] == expected
def test_user_can_retrieve_all_favorites_at_once(
api_request, factories, logged_in_client, client
):
favorite = factories["favorites.TrackFavorite"](user=logged_in_client.user)
factories["favorites.TrackFavorite"]()
url = reverse("api:v1:favorites:tracks-all")
response = logged_in_client.get(url, {"user": logged_in_client.user.pk})
expected = [{"track": favorite.track.id, "id": favorite.id}]
assert response.status_code == 200
assert response.data["results"] == expected
def test_user_can_add_favorite_via_api(factories, logged_in_client, activity_muted):
track = factories["music.Track"]()
url = reverse("api:v1:favorites:tracks-list")

Wyświetl plik

@ -0,0 +1 @@
Performance improvement when fetching favorites, down to a single, small http request

Wyświetl plik

@ -60,20 +60,12 @@ export default {
page_size: 50,
ordering: '-creation_date'
}
let promise
if (url) {
promise = axios.get(url)
} else {
promise = axios.get('favorites/tracks/', {params: params})
}
let promise = axios.get('favorites/tracks/all/', {params: params})
return promise.then((response) => {
logger.default.info('Fetched a batch of ' + response.data.results.length + ' favorites')
response.data.results.forEach(result => {
commit('track', {id: result.track.id, value: true})
commit('track', {id: result.track, value: true})
})
if (response.data.next) {
dispatch('fetch', response.data.next)
}
})
}
}