formatting head
This commit is contained in:
@@ -0,0 +1 @@
|
||||
# Register your models here.
|
||||
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ApiConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'api'
|
||||
@@ -0,0 +1,24 @@
|
||||
# Generated by Django 5.2.4 on 2025-08-18 22:20
|
||||
|
||||
import api.models
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
initial = True
|
||||
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Room',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('code', models.CharField(default=api.models.generate_unique_code, max_length=8, unique=True)),
|
||||
('host', models.CharField(max_length=50, unique=True)),
|
||||
('guest_can_pause', models.BooleanField(default=False)),
|
||||
('votes_to_skip', models.IntegerField(default=1)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
from django.db import models
|
||||
import string
|
||||
import random
|
||||
|
||||
# Create your models here.
|
||||
|
||||
|
||||
def generate_unique_code():
|
||||
length = 6
|
||||
|
||||
while True:
|
||||
code = ''.join(random.choices(string.ascii_uppercase, k=length))
|
||||
if not Room.objects.filter(code=code).exists():
|
||||
return code
|
||||
|
||||
|
||||
class Room(models.Model):
|
||||
code = models.CharField(max_length=8, default=generate_unique_code, unique=True)
|
||||
host = models.CharField(max_length=50, unique=True)
|
||||
guest_can_pause = models.BooleanField(null=False, default=False)
|
||||
votes_to_skip = models.IntegerField(null=False, default=1)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
@@ -0,0 +1,30 @@
|
||||
from rest_framework import serializers
|
||||
from .models import Room
|
||||
|
||||
|
||||
class RoomSerializer(serializers.ModelSerializer):
|
||||
class Meta: # pyright: ignore
|
||||
model = Room
|
||||
fields = (
|
||||
'id',
|
||||
'code',
|
||||
'host',
|
||||
'guest_can_pause',
|
||||
'votes_to_skip',
|
||||
'created_at',
|
||||
)
|
||||
|
||||
|
||||
class CreateRoomSerializer(serializers.ModelSerializer):
|
||||
class Meta: # pyright: ignore
|
||||
model = Room
|
||||
fields = ('guest_can_pause', 'votes_to_skip')
|
||||
|
||||
|
||||
class UpdateRoomSerializer(serializers.ModelSerializer):
|
||||
# code is unique so needs to be modifies to get it passed here
|
||||
code = serializers.CharField(validators=[])
|
||||
|
||||
class Meta: # pyright: ignore
|
||||
model = Room
|
||||
fields = ('guest_can_pause', 'votes_to_skip', 'code')
|
||||
@@ -0,0 +1 @@
|
||||
# Create your tests here.
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
from django.urls import path
|
||||
from .views import CreateRoom, GetRoom, LeaveRoom, RoomsView, JoinRoom, UpdateRoom, UserInRoom
|
||||
|
||||
urlpatterns = [
|
||||
path('rooms/', RoomsView.as_view()),
|
||||
path('create-room/', CreateRoom.as_view()),
|
||||
path('join-room/', JoinRoom.as_view()),
|
||||
path('get-room/', GetRoom.as_view()),
|
||||
path('user-in-room/', UserInRoom.as_view()),
|
||||
path('leave-room/', LeaveRoom.as_view()),
|
||||
path('update-room/', UpdateRoom.as_view()),
|
||||
]
|
||||
+159
@@ -0,0 +1,159 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user