Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion backend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ RUN pip install --no-cache-dir -r requirements.txt

COPY . /src


EXPOSE 8000

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
CMD ["sh", "-c", "python manage.py flush && python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"]



Expand Down
2 changes: 0 additions & 2 deletions backend/src/restapi/.env

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 6.0.2 on 2026-04-14 20:52

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('gametime', '0001_initial'),
]

operations = [
migrations.AlterUniqueTogether(
name='reviews',
unique_together={('userID', 'gameID')},
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 6.0.2 on 2026-04-15 23:13

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('gametime', '0002_alter_reviews_unique_together'),
]

operations = [
migrations.AlterUniqueTogether(
name='backlog',
unique_together={('userID', 'gameID')},
),
migrations.AlterUniqueTogether(
name='completed',
unique_together={('userID', 'gameID')},
),
migrations.AlterUniqueTogether(
name='favorites',
unique_together={('userID', 'gameID')},
),
]
9 changes: 9 additions & 0 deletions backend/src/restapi/gametime/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,25 @@ class BACKLOG(models.Model):
userID = models.ForeignKey(USER, on_delete=models.CASCADE)
gameID = models.IntegerField()

class Meta:
unique_together = ('userID', 'gameID')


class COMPLETED(models.Model):
userID = models.ForeignKey(USER, on_delete=models.CASCADE)
gameID = models.IntegerField()

class Meta:
unique_together = ('userID', 'gameID')
# Favorites table


class FAVORITES(models.Model):
userID = models.ForeignKey(USER, on_delete=models.CASCADE)
gameID = models.IntegerField()

class Meta:
unique_together = ('userID', 'gameID')
# User Reviews


Expand Down
18 changes: 17 additions & 1 deletion backend/src/restapi/gametime/serializers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from rest_framework import serializers
from .models import REVIEWS
from .models import REVIEWS, FAVORITES, BACKLOG, USER



class reviewSerializer(serializers.ModelSerializer):
Expand All @@ -12,3 +13,18 @@ class reviewSerializer(serializers.ModelSerializer):
class Meta:
model = REVIEWS
fields = ['username', 'review', 'rating', 'formatedDate']


class gameSerializer(serializers.ModelSerializer):
class Meta:
model = FAVORITES
fields = ['gameID']



class backlogSerializer(serializers.ModelSerializer):
class Meta:
model = BACKLOG
fields = ['gameID']


9 changes: 7 additions & 2 deletions backend/src/restapi/gametime/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,13 @@
path('create-account/', views.createAccount, name='create-account'),
path('reviews/<int:id>/', views.getReviews, name='reviews'),
path('user/create-review/', views.createReview, name='create-review'),
path('user/account/favorites/', views.addFavorite),
path('user/account/followed-games/', views.followGame),
path('followers/<str:user>/', views.getFollowers),
path('favorites/<str:user>/', views.getFavorites),
path('user/account/favorites/', views.handleFavorites),
path('user/account/followed-games/', views.handleFollowGames),
path('user/account/followed-users/', views.followUser),
path('user/account/backlog/', views.handleBacklog),
path('user/account/check/buttons/<int:id>/', views.checkButtons)


]
131 changes: 84 additions & 47 deletions backend/src/restapi/gametime/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from urllib import request

import requests
from rest_framework.authtoken.models import Token
Expand All @@ -6,8 +7,8 @@
from django.contrib.auth import authenticate
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response
from .models import USER, REVIEWS, FAVORITES, FOLLOWGAME, FOLLOWUSER
from .serializers import reviewSerializer
from .models import USER, REVIEWS, FAVORITES, FOLLOWGAME, FOLLOWUSER, BACKLOG
from .serializers import reviewSerializer, gameSerializer, backlogSerializer

# Create your views here.
# get the client id from the .env file
Expand Down Expand Up @@ -200,114 +201,150 @@ def deleteReview(request):
date=data['date'],
)
review.delete()
review.save()
content = {
"Review has been deleted!"
}
return Response(content)
return Response({"error: Could not delete review."}, status=400)


@api_view(['POST'])
@api_view(['POST', 'DELETE'])
@permission_classes([IsAuthenticated])
def addFavorite(request):
def handleFavorites(request):
user = request.user
gameID = request.data.get("gameID")
if request.method == 'POST':
data = request.data
favorites = FAVORITES.objects.create(
userID=data['userID'],
gameID=data['gameID'],
userID=user,
gameID=gameID,
)
favorites.save()
content = {
"Favorite has been added!"
}
return Response(content)
return Response({"error: Could not add to favorites."}, status=400)


@api_view(['DELETE'])
@permission_classes([IsAuthenticated])
def removeFavorite(request):
if request.method == 'DELETE':
data = request.data
favorites = FAVORITES.objects.get(
userID=data['userID'],
gameID=data['gameID'],
userID=user,
gameID=gameID,
)
favorites.delete()
favorites.save()
content = {
"Favorite has been removed."
}
return Response(content)
return Response({"error: Could not remove from favorites."}, status=400)

return Response({"error: Could not fufil request."}, status=400)

@api_view(['POST'])

@api_view(['POST', 'DELETE'])
@permission_classes([IsAuthenticated])
def followGame(request):
def handleFollowGames(request):
user = request.user
gameId = request.data.get("gameID")

if request.method == 'POST':
data = request.data

gamefollows = FOLLOWGAME.objects.create(
followed=data['followed'],
follower=data['follower'],
gameID=gameId,
followerID=user,
)
gamefollows.save()
content = {
"Game has been followed."
}
return Response(content)
return Response({"error: Could not follow user."}, status=400)


@api_view(['DELETE'])
@permission_classes([IsAuthenticated])
def unfollowGame(request):
if request.method == 'DELETE':
data = request.data

gamefollows = FOLLOWGAME.objects.get(
followerID=data['followerID'],
gameID=data['gameID'],
followerID=user,
gameID=gameId,
)
gamefollows.delete()
gamefollows.save()

content = {
"Game has been unfollowed."
}
return Response(content)
return Response({"error: Could not unfollow game."})


@api_view(['POST'])

@api_view(['POST', 'GET'])
@permission_classes([IsAuthenticated])
def handleBacklog(request):
user = request.user
if request.method == 'POST':
backlogId = request.data.get("gameID")
logged = BACKLOG.objects.create(
gameID=backlogId,
userID=user
)
logged.save()
content = {"message": "Backlog"}
return Response(content, status=200)
if request.method == 'GET':
backlogs = BACKLOG.objects.filter(userID=user)
content = backlogSerializer(backlogs, many=True).data
return Response(content, status=200)

return Response({"Couldn't backlog item"})


@api_view(['POST', 'DELETE'])
@permission_classes([IsAuthenticated])
def followUser(request):
followerID = request.user
followed = request.data.get("username")
followedUser = USER.objects.get(username=followed)
if request.method == 'POST':
data = request.data
userfollows = FOLLOWUSER.objects.create(
followerID=data['followerID'],
gameID=data['gameID'],
followed=followedUser,
follower=followerID,
)
userfollows.save()
content = {
"User has been followed."
}
return Response(content)
return Response({"error: Could not follow user."}, status=400)


@api_view(['DELETE'])
@permission_classes([IsAuthenticated])
def unfollowUser(request):
if request.method == 'DELETE':
data = request.data
userfollows = FOLLOWUSER.objects.get(
followerID=data['followerID'],
gameID=data['gameID'],
followed=followedUser,
follower=followerID,
)
userfollows.delete()
userfollows.save()
content = {
"User has been unfollowed."
}
return Response(content)
return Response({"error: Could not unfollow user."}, status=400)

return Response({"error: Could not follow user."}, status=400)


@api_view(['GET'])
def getFollowers(request, user):
if request.method == 'GET':
user_obj = USER.objects.filter(username=user).first()
count = user_obj.followers.count()
return Response({'followers': count})


@api_view(['GET'])
def getFavorites(request, user):
if request.method == 'GET':
user_obj = USER.objects.filter(username=user).first()
games = FAVORITES.objects.filter(userID=user_obj)
content = gameSerializer(games, many=True).data
return Response(content)

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def checkButtons(request, id: int):
user = request.user
checkBacklog = BACKLOG.objects.filter(userID=user, gameID=id).exists()
checkFavorites = FAVORITES.objects.filter(userID=user, gameID=id).exists()
checkFollow = FOLLOWGAME.objects.filter(followerID=user, gameID=id).exists()
checks = [checkFollow, checkFavorites, checkBacklog]
return Response(checks, status=200)
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ services:
- "8000:8000"
volumes:
- ./backend:/src
command: python manage.py runserver 0.0.0.0:8000
command: sh -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"

frontend:
build: ./frontend
Expand Down
Loading