From df88f9c9e391cd68d488e18bc20a5ccd29bdd28e Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Mon, 23 Sep 2019 17:53:58 +0200
Subject: [PATCH] Dispatch hook event when creating listening

---
 api/funkwhale_api/history/serializers.py | 12 +++++++++++-
 api/tests/history/test_serializers.py    | 25 ++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/api/funkwhale_api/history/serializers.py b/api/funkwhale_api/history/serializers.py
index c894ec59ab..c61fda6620 100644
--- a/api/funkwhale_api/history/serializers.py
+++ b/api/funkwhale_api/history/serializers.py
@@ -1,6 +1,8 @@
 from rest_framework import serializers
 
+from funkwhale_api import plugins
 from funkwhale_api.activity import serializers as activity_serializers
+from funkwhale_api.common import utils
 from funkwhale_api.federation import serializers as federation_serializers
 from funkwhale_api.music.serializers import TrackActivitySerializer, TrackSerializer
 from funkwhale_api.users.serializers import UserActivitySerializer, UserBasicSerializer
@@ -53,4 +55,12 @@ class ListeningWriteSerializer(serializers.ModelSerializer):
     def create(self, validated_data):
         validated_data["user"] = self.context["user"]
 
-        return super().create(validated_data)
+        instance = super().create(validated_data)
+        plugins_conf = getattr(self.context["request"], "plugins_conf", None)
+        utils.on_commit(
+            plugins.hooks.dispatch,
+            "history.listening.created",
+            listening=instance,
+            plugins_conf=plugins_conf,
+        )
+        return instance
diff --git a/api/tests/history/test_serializers.py b/api/tests/history/test_serializers.py
index 170b44d6b1..397467a0cb 100644
--- a/api/tests/history/test_serializers.py
+++ b/api/tests/history/test_serializers.py
@@ -1,3 +1,4 @@
+from funkwhale_api import plugins
 from funkwhale_api.federation import serializers as federation_serializers
 from funkwhale_api.history import serializers
 from funkwhale_api.music import serializers as music_serializers
@@ -18,3 +19,27 @@ def test_listening_serializer(factories, to_api_date):
     serializer = serializers.ListeningSerializer(listening)
 
     assert serializer.data == expected
+
+
+def test_listening_create(factories, to_api_date, mocker, now):
+    user = factories["users.User"]()
+    track = factories["music.Track"]()
+    payload = {"track": track.pk}
+    on_commit = mocker.patch("funkwhale_api.common.utils.on_commit")
+    request = mocker.Mock(plugins_conf=mocker.Mock())
+    serializer = serializers.ListeningWriteSerializer(
+        data=payload, context={"request": request, "user": user}
+    )
+
+    assert serializer.is_valid(raise_exception=True) is True
+    listening = serializer.save()
+
+    assert serializer.instance.user == user
+    assert serializer.instance.track == track
+
+    on_commit.assert_called_once_with(
+        plugins.hooks.dispatch,
+        "history.listening.created",
+        listening=listening,
+        plugins_conf=request.plugins_conf,
+    )
-- 
GitLab