🚧(backend) serialize the LiveKit access token

Call utility function while getting room informations, to return
a proper access token to the user which connects to a room.
This commit is contained in:
lebaudantoine
2024-06-25 19:07:34 +02:00
parent 2deef12d05
commit 817d352f00
3 changed files with 35 additions and 25 deletions

View File

@@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from rest_framework.exceptions import PermissionDenied from rest_framework.exceptions import PermissionDenied
from core import models from core import models, utils
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
@@ -119,11 +119,11 @@ class RoomSerializer(serializers.ModelSerializer):
del output["configuration"] del output["configuration"]
if role is not None or instance.is_public: if role is not None or instance.is_public:
slug = f"{instance.id!s}".replace("-", "")
output["livekit"] = { output["livekit"] = {
# todo - generate a proper livekit name "room": slug,
"room": "foo", "token": utils.generate_token(room=slug, user=request.user),
# todo - generate a proper token
"token": "foo",
} }
output["is_administrable"] = is_admin output["is_administrable"] = is_admin

View File

@@ -17,7 +17,7 @@ from rest_framework import (
response as drf_response, response as drf_response,
) )
from core import models from core import models, utils
from . import permissions, serializers from . import permissions, serializers
@@ -192,8 +192,7 @@ class RoomViewSet(
"id": None, "id": None,
"livekit": { "livekit": {
"room": slug, "room": slug,
# todo - generate a proper token "token": utils.generate_token(room=slug, user=request.user),
"token": "foo",
}, },
} }
else: else:

View File

@@ -2,7 +2,9 @@
Test rooms API endpoints in the impress core app: retrieve. Test rooms API endpoints in the impress core app: retrieve.
""" """
import random import random
from unittest import mock
from django.contrib.auth.models import AnonymousUser
from django.test.utils import override_settings from django.test.utils import override_settings
import pytest import pytest
@@ -83,7 +85,8 @@ def test_api_rooms_retrieve_anonymous_private_slug_not_normalized():
@override_settings(ALLOW_UNREGISTERED_ROOMS=True) @override_settings(ALLOW_UNREGISTERED_ROOMS=True)
def test_api_rooms_retrieve_anonymous_unregistered_allowed(): @mock.patch("core.utils.generate_token", return_value="foo")
def test_api_rooms_retrieve_anonymous_unregistered_allowed(mock_token):
""" """
Retrieving an unregistered room should return a Livekit token Retrieving an unregistered room should return a Livekit token
if unregistered rooms are allowed. if unregistered rooms are allowed.
@@ -100,11 +103,12 @@ def test_api_rooms_retrieve_anonymous_unregistered_allowed():
}, },
} }
# todo - assert generate_token has been called mock_token.assert_called_once_with(room="unregistered-room", user=AnonymousUser())
@override_settings(ALLOW_UNREGISTERED_ROOMS=True) @override_settings(ALLOW_UNREGISTERED_ROOMS=True)
def test_api_rooms_retrieve_anonymous_unregistered_allowed_not_normalized(): @mock.patch("core.utils.generate_token", return_value="foo")
def test_api_rooms_retrieve_anonymous_unregistered_allowed_not_normalized(mock_token):
""" """
Getting an unregistered room by a slug that is not normalized should work Getting an unregistered room by a slug that is not normalized should work
and use the Livekit room on the url-safe name. and use the Livekit room on the url-safe name.
@@ -121,7 +125,7 @@ def test_api_rooms_retrieve_anonymous_unregistered_allowed_not_normalized():
}, },
} }
# todo - assert generate_token has been called mock_token.assert_called_once_with(room="reunion", user=AnonymousUser())
@override_settings(ALLOW_UNREGISTERED_ROOMS=False) @override_settings(ALLOW_UNREGISTERED_ROOMS=False)
@@ -136,7 +140,8 @@ def test_api_rooms_retrieve_anonymous_unregistered_not_allowed():
assert response.json() == {"detail": "Not found."} assert response.json() == {"detail": "Not found."}
def test_api_rooms_retrieve_anonymous_public(): @mock.patch("core.utils.generate_token", return_value="foo")
def test_api_rooms_retrieve_anonymous_public(mock_token):
""" """
Anonymous users should be able to retrieve a room with a token provided it is public. Anonymous users should be able to retrieve a room with a token provided it is public.
""" """
@@ -145,22 +150,24 @@ def test_api_rooms_retrieve_anonymous_public():
response = client.get(f"/api/v1.0/rooms/{room.id!s}/") response = client.get(f"/api/v1.0/rooms/{room.id!s}/")
assert response.status_code == 200 assert response.status_code == 200
expected_name = f"{room.id!s}".replace("-", "")
assert response.json() == { assert response.json() == {
"id": str(room.id), "id": str(room.id),
"is_administrable": False, "is_administrable": False,
"is_public": True, "is_public": True,
"livekit": { "livekit": {
"room": "foo", "room": expected_name,
"token": "foo", "token": "foo",
}, },
"name": room.name, "name": room.name,
"slug": room.slug, "slug": room.slug,
} }
# todo - assert generate_token has been called mock_token.assert_called_once()
def test_api_rooms_retrieve_authenticated_public(): @mock.patch("core.utils.generate_token", return_value="foo")
def test_api_rooms_retrieve_authenticated_public(mock_token):
""" """
Authenticated users should be allowed to retrieve a room and get a token for a room to Authenticated users should be allowed to retrieve a room and get a token for a room to
which they are not related, provided the room is public. which they are not related, provided the room is public.
@@ -177,19 +184,20 @@ def test_api_rooms_retrieve_authenticated_public():
) )
assert response.status_code == 200 assert response.status_code == 200
expected_name = f"{room.id!s}".replace("-", "")
assert response.json() == { assert response.json() == {
"id": str(room.id), "id": str(room.id),
"is_administrable": False, "is_administrable": False,
"is_public": True, "is_public": True,
"livekit": { "livekit": {
"room": "foo", "room": expected_name,
"token": "foo", "token": "foo",
}, },
"name": room.name, "name": room.name,
"slug": room.slug, "slug": room.slug,
} }
# todo - assert generate_token has been called mock_token.assert_called_once_with(room=expected_name, user=user)
def test_api_rooms_retrieve_authenticated(): def test_api_rooms_retrieve_authenticated():
@@ -217,7 +225,8 @@ def test_api_rooms_retrieve_authenticated():
} }
def test_api_rooms_retrieve_members(django_assert_num_queries): @mock.patch("core.utils.generate_token", return_value="foo")
def test_api_rooms_retrieve_members(mock_token, django_assert_num_queries):
""" """
Users who are members of a room should be allowed to see related users. Users who are members of a room should be allowed to see related users.
""" """
@@ -265,22 +274,24 @@ def test_api_rooms_retrieve_members(django_assert_num_queries):
key=lambda x: x["id"], key=lambda x: x["id"],
) )
expected_name = str(room.id).replace("-", "")
assert content_dict == { assert content_dict == {
"id": str(room.id), "id": str(room.id),
"is_administrable": False, "is_administrable": False,
"is_public": room.is_public, "is_public": room.is_public,
"livekit": { "livekit": {
"room": "foo", "room": expected_name,
"token": "foo", "token": "foo",
}, },
"name": room.name, "name": room.name,
"slug": room.slug, "slug": room.slug,
} }
# todo - assert generate_token has been called mock_token.assert_called_once_with(room=expected_name, user=user)
def test_api_rooms_retrieve_administrators(django_assert_num_queries): @mock.patch("core.utils.generate_token", return_value="foo")
def test_api_rooms_retrieve_administrators(mock_token, django_assert_num_queries):
""" """
A user who is an administrator or owner of a room should be allowed A user who is an administrator or owner of a room should be allowed
to see related users. to see related users.
@@ -327,18 +338,18 @@ def test_api_rooms_retrieve_administrators(django_assert_num_queries):
], ],
key=lambda x: x["id"], key=lambda x: x["id"],
) )
expected_name = str(room.id).replace("-", "")
assert content_dict == { assert content_dict == {
"id": str(room.id), "id": str(room.id),
"is_administrable": True, "is_administrable": True,
"is_public": room.is_public, "is_public": room.is_public,
"configuration": {}, "configuration": {},
"livekit": { "livekit": {
"room": "foo", "room": expected_name,
"token": "foo", "token": "foo",
}, },
"name": room.name, "name": room.name,
"slug": room.slug, "slug": room.slug,
} }
# todo - assert generate_token has been called mock_token.assert_called_once_with(room=expected_name, user=user)