Basic working poc with favorites send over websocket
This commit is contained in:
parent
e490284511
commit
d509c090d3
|
@ -4,14 +4,15 @@ from channels.auth import AuthMiddlewareStack
|
|||
from channels.routing import ProtocolTypeRouter, URLRouter
|
||||
|
||||
from funkwhale_api.common.auth import TokenAuthMiddleware
|
||||
from funkwhale_api.music import consumers
|
||||
from funkwhale_api.instance import consumers
|
||||
|
||||
|
||||
application = ProtocolTypeRouter({
|
||||
# Empty for now (http->django views is added by default)
|
||||
"websocket": TokenAuthMiddleware(
|
||||
URLRouter([
|
||||
url("^api/v1/test/$", consumers.MyConsumer),
|
||||
url("^api/v1/instance/activity$",
|
||||
consumers.InstanceActivityConsumer),
|
||||
])
|
||||
),
|
||||
})
|
||||
|
|
|
@ -3,3 +3,4 @@ from channels.layers import get_channel_layer
|
|||
|
||||
channel_layer = get_channel_layer()
|
||||
group_send = async_to_sync(channel_layer.group_send)
|
||||
group_add = async_to_sync(channel_layer.group_add)
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from channels.generic.websocket import JsonWebsocketConsumer
|
||||
from funkwhale_api.common import channels
|
||||
|
||||
|
||||
class JsonAuthConsumer(JsonWebsocketConsumer):
|
||||
|
@ -9,3 +10,8 @@ class JsonAuthConsumer(JsonWebsocketConsumer):
|
|||
return self.close()
|
||||
|
||||
return self.accept()
|
||||
|
||||
def accept(self):
|
||||
super().accept()
|
||||
for group in self.groups:
|
||||
channels.group_add(group, self.channel_name)
|
||||
|
|
|
@ -8,10 +8,12 @@ record.registry.register_serializer(
|
|||
|
||||
|
||||
@record.registry.register_consumer('favorites.TrackFavorite')
|
||||
def broadcast_track_favorite_to_instance_timeline(data, obj):
|
||||
def broadcast_track_favorite_to_instance_activity(data, obj):
|
||||
if obj.user.privacy_level not in ['instance', 'everyone']:
|
||||
return
|
||||
channels.group_send('instance_timeline', {
|
||||
'type': 'event',
|
||||
|
||||
channels.group_send('instance_activity', {
|
||||
'type': 'event.send',
|
||||
'text': '',
|
||||
'data': data
|
||||
})
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
from funkwhale_api.common.consumers import JsonAuthConsumer
|
||||
|
||||
|
||||
class InstanceActivityConsumer(JsonAuthConsumer):
|
||||
groups = ["instance_activity"]
|
||||
|
||||
def event_send(self, message):
|
||||
self.send_json(message['data'])
|
|
@ -1,17 +0,0 @@
|
|||
from funkwhale_api.common.consumers import JsonAuthConsumer
|
||||
|
||||
|
||||
class MyConsumer(JsonAuthConsumer):
|
||||
groups = ["broadcast"]
|
||||
|
||||
def receive_json(self, payload):
|
||||
print(payload, self.scope["user"])
|
||||
# Called with either text_data or bytes_data for each frame
|
||||
# You can call:
|
||||
self.send_json({'test': 'me'})
|
||||
# Or, to send a binary frame:
|
||||
# self.send(bytes_data="{Hello} world!")
|
||||
# Want to force-close the connection? Call:
|
||||
# self.close()
|
||||
# # Or add a custom WebSocket error code!
|
||||
# self.close(code=4123)
|
|
@ -37,32 +37,32 @@ def test_track_favorite_serializer_is_connected(activity_registry):
|
|||
def test_track_favorite_serializer_instance_activity_consumer(
|
||||
activity_registry):
|
||||
conf = activity_registry['favorites.TrackFavorite']
|
||||
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
||||
consumer = activities.broadcast_track_favorite_to_instance_activity
|
||||
assert consumer in conf['consumers']
|
||||
|
||||
|
||||
def test_broadcast_track_favorite_to_instance_timeline(
|
||||
def test_broadcast_track_favorite_to_instance_activity(
|
||||
factories, mocker):
|
||||
p = mocker.patch('funkwhale_api.common.channels.group_send')
|
||||
favorite = factories['favorites.TrackFavorite']()
|
||||
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
||||
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
||||
consumer = activities.broadcast_track_favorite_to_instance_activity
|
||||
message = {
|
||||
"type": 'event',
|
||||
"data": data
|
||||
}
|
||||
consumer(data=data, obj=favorite)
|
||||
p.assert_called_once_with('instance_timeline', message)
|
||||
p.assert_called_once_with('instance_activity', message)
|
||||
|
||||
|
||||
def test_broadcast_track_favorite_to_instance_timeline_private(
|
||||
def test_broadcast_track_favorite_to_instance_activity_private(
|
||||
factories, mocker):
|
||||
p = mocker.patch('funkwhale_api.common.channels.group_send')
|
||||
favorite = factories['favorites.TrackFavorite'](
|
||||
user__privacy_level='me'
|
||||
)
|
||||
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
||||
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
||||
consumer = activities.broadcast_track_favorite_to_instance_activity
|
||||
message = {
|
||||
"type": 'event',
|
||||
"data": data
|
||||
|
|
Loading…
Reference in New Issue