formatting head

This commit is contained in:
Acid
2025-12-27 15:33:48 -05:00
commit 6f3bdd61d4
63 changed files with 6935 additions and 0 deletions
View File
+1
View File
@@ -0,0 +1 @@
# Register your models here.
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api'
+24
View File
@@ -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)),
],
),
]
View File
+22
View File
@@ -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)
+30
View File
@@ -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')
+1
View File
@@ -0,0 +1 @@
# Create your tests here.
+12
View File
@@ -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
View File
@@ -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)