Basic working poc with favorites send over websocket

This commit is contained in:
Eliot Berriot 2018-03-01 21:51:20 +01:00
parent e490284511
commit d509c090d3
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
7 changed files with 29 additions and 28 deletions

View File

@ -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),
])
),
})

View File

@ -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)

View File

@ -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)

View File

@ -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
})

View File

@ -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'])

View File

@ -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)

View File

@ -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