Files
music-controller/api/views.py
T
2025-12-27 15:33:48 -05:00

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)