160 lines
6.2 KiB
Python
160 lines
6.2 KiB
Python
from rest_framework import generics, status
|
|
from rest_framework.views import APIView
|
|
from rest_framework.response import Response
|
|
from django.http import JsonResponse
|
|
|
|
from .serializers import CreateRoomSerializer, RoomSerializer, UpdateRoomSerializer
|
|
from .models import Room
|
|
|
|
# Create your views here.
|
|
|
|
|
|
class RoomsView(generics.ListAPIView):
|
|
queryset = Room.objects.all()
|
|
serializer_class = RoomSerializer
|
|
|
|
|
|
class CreateRoom(APIView):
|
|
serializer_class = CreateRoomSerializer
|
|
|
|
def post(self, request):
|
|
sessionid = request.COOKIES.get("sessionid")
|
|
print(" sessionid:", sessionid)
|
|
|
|
# check if user has active session , if not , create it
|
|
if not self.request.session.exists(self.request.session.session_key): # pyright: ignore
|
|
self.request.session.create()
|
|
|
|
serializer = self.serializer_class(data=request.data)
|
|
|
|
if serializer.is_valid():
|
|
guest_can_pause = serializer.data.get('guest_can_pause')
|
|
votes_to_skip = serializer.data.get('votes_to_skip')
|
|
host = self.request.session.session_key
|
|
queryset = Room.objects.filter(host=host)
|
|
|
|
if queryset.exists():
|
|
room = queryset[0]
|
|
room.guest_can_pause = guest_can_pause
|
|
room.votes_to_skip = votes_to_skip
|
|
room.save(update_fields=['guest_can_pause', 'votes_to_skip'])
|
|
self.request.session['room_code'] = room.code
|
|
|
|
return Response(RoomSerializer(room).data, status=status.HTTP_200_OK)
|
|
else:
|
|
room = Room(
|
|
host=host,
|
|
guest_can_pause=guest_can_pause,
|
|
votes_to_skip=votes_to_skip,
|
|
)
|
|
|
|
room.save()
|
|
self.request.session['room_code'] = room.code
|
|
|
|
return Response(RoomSerializer(room).data, status=status.HTTP_201_CREATED)
|
|
return Response(status=status.HTTP_418_IM_A_TEAPOT)
|
|
|
|
|
|
class GetRoom(APIView): # This defines an API endpoint
|
|
serializer_class = RoomSerializer
|
|
|
|
def get(self, request, format=None): # This HANDLES incoming GET requests
|
|
code = request.GET.get('code') # READS the query parameter from URL
|
|
|
|
# Debug
|
|
print(f"Session Key: {request.session.session_key}")
|
|
print(f"Session Data: {dict(request.session)}")
|
|
print(f"All cookies: {request.COOKIES}")
|
|
|
|
if code is not None:
|
|
room = Room.objects.filter(code=code) # QUERIES the database
|
|
if room:
|
|
data = RoomSerializer(room[0]).data # SERIALIZES the data to send back
|
|
if self.request.session.session_key == room[0].host:
|
|
data['isHost'] = True
|
|
else:
|
|
data['isHost'] = False
|
|
return Response(data, status=status.HTTP_200_OK)
|
|
|
|
return Response({'Room not Faunt': 'Invalid Code'}, status=status.HTTP_404_NOT_FOUND)
|
|
return Response({'Bad request': 'Code not in request'}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class JoinRoom(APIView):
|
|
def post(self, request, format=None):
|
|
# check if user has active session , if not , create it
|
|
if not self.request.session.exists(self.request.session.session_key): # pyright: ignore
|
|
self.request.session.create()
|
|
|
|
code = request.data.get('code')
|
|
if code is not None:
|
|
room_search = Room.objects.filter(code=code)
|
|
if room_search:
|
|
room = room_search[0]
|
|
self.request.session['room_code'] = code
|
|
return Response({'message': 'Room Joined'}, status=status.HTTP_202_ACCEPTED)
|
|
|
|
return Response({'Bad request': ' No Room Found'}, status=status.HTTP_400_BAD_REQUEST)
|
|
return Response({'Bad request': 'Invalid data'}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class UserInRoom(APIView):
|
|
def get(self, request, format=None):
|
|
# check session , or create
|
|
if not self.request.session.exists(self.request.session.session_key): # pyright: ignore
|
|
self.request.session.create()
|
|
|
|
# dbug
|
|
print("Session key:", self.request.session.session_key)
|
|
print("All session data:", dict(self.request.session))
|
|
print("room_code value:", self.request.session.get('room_code'))
|
|
|
|
data = {'code': self.request.session.get('room_code')}
|
|
return JsonResponse(data, status=status.HTTP_200_OK)
|
|
|
|
|
|
class LeaveRoom(APIView):
|
|
def post(self, request, format=None):
|
|
if 'room_code' in self.request.session:
|
|
self.request.session.pop('room_code')
|
|
host_id = self.request.session.session_key
|
|
room = Room.objects.filter(host=host_id)
|
|
|
|
if room:
|
|
room[0].delete()
|
|
self.request.session.flush()
|
|
return Response({'message': 'Room deleted'}, status=status.HTTP_200_OK)
|
|
return Response({'message': 'left room'}, status=status.HTTP_200_OK)
|
|
|
|
|
|
class UpdateRoom(APIView):
|
|
serializer_class = UpdateRoomSerializer
|
|
|
|
def patch(self, request):
|
|
if not self.request.session.exists(self.request.session.session_key): # pyright: ignore
|
|
self.request.session.create()
|
|
|
|
serializer = self.serializer_class(data=request.data)
|
|
if serializer.is_valid():
|
|
guest_can_pause = serializer.data.get('guest_can_pause')
|
|
votes_to_skip = serializer.data.get('votes_to_skip')
|
|
|
|
code = serializer.data.get('code')
|
|
query = Room.objects.filter(code=code)
|
|
|
|
if not query.exists():
|
|
return Response({'query': 'Room not found'}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
room = query[0]
|
|
# check if host
|
|
user_id = self.request.session.session_key
|
|
if room.host != user_id:
|
|
return Response({'Cant delete room ': 'you are not host'}, status=status.HTTP_403_FORBIDDEN)
|
|
|
|
room.guest_can_pause = guest_can_pause
|
|
room.votes_to_skip = votes_to_skip
|
|
room.save(update_fields=['guest_can_pause', 'votes_to_skip'])
|
|
|
|
return Response(RoomSerializer(room).data, status=status.HTTP_200_OK)
|
|
return Response({'Bad request': 'Invalid data'}, status=status.HTTP_400_BAD_REQUEST)
|