Skip to content

Commit

Permalink
removed Null=True from friends in User model in models.py, add a seri…
Browse files Browse the repository at this point in the history
…alizer for FriendRequest model to the serializer, wrote a get function friend_requests for user pendling list in views and fixed accept_friend_request and send_friend_request
  • Loading branch information
mtoof committed Jul 11, 2024
1 parent 047e1d9 commit d26037a
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 15 deletions.
2 changes: 1 addition & 1 deletion Backend/user_service/user_service/user_app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class User(AbstractUser):
Email: The email field is required for the user model.
"""
friends = models.ManyToManyField("self", null=True, symmetrical=True)
friends = models.ManyToManyField("self", blank=True, symmetrical=True)
status = models.BooleanField(default=False)
REQUIRED_FIELDS = ["email"]

Expand Down
6 changes: 5 additions & 1 deletion Backend/user_service/user_service/user_app/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@
from rest_framework import serializers
from rest_framework.validators import UniqueValidator

from .models import User
from .models import User, FriendRequest
from .validators import CustomPasswordValidator


class FriendSerializer(serializers.ModelSerializer):
class Meta:
model=FriendRequest
fields = ["sender_user", "receiver_user", "status"]
class UserSerializer(serializers.ModelSerializer):
"""
UserSerializer class to define the user serializer.
Expand Down
3 changes: 2 additions & 1 deletion Backend/user_service/user_service/user_app/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
path("user/",UserViewSet.as_view({"get": "users_list",}),name="users-list",),
path("user/<int:pk>/",UserViewSet.as_view({"get": "retrieve_user","put": "update_user","delete": "destroy_user",}),name="user-detail",),
path("user/<int:user_pk>/friends/", FriendsViewSet.as_view({"get": "friends_list"}), name="friends-list"),
path("user/<int:user_pk>/friends/<int:pk>/", FriendsViewSet.as_view({"put": "accept_friend_request", "post": "send_friend_request"}), name="friends-list"),
path("user/<int:user_pk>/pending/", FriendsViewSet.as_view({"get": "friend_requests"}), name="pending-list"),
path("user/<int:user_pk>/friends/<int:pk>/", FriendsViewSet.as_view({"put": "accept_friend_request", "post": "send_friend_request"}), name="friends-request"),

]
33 changes: 21 additions & 12 deletions Backend/user_service/user_service/user_app/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from rest_framework.exceptions import ValidationError
from .models import User, FriendRequest
from .rabbitmq_utils import consume_message, publish_message
from .serializers import UserSerializer
from .serializers import UserSerializer, FriendSerializer


class UserViewSet(viewsets.ViewSet):
Expand Down Expand Up @@ -255,11 +255,14 @@ def remove_friend(self, request, user_pk=None, pk=None):

def send_friend_request(self, request, user_pk=None, pk=None):
try:
current_user = get_object_or_404(User, id=user_pk)
receiver = get_object_or_404(User, id=pk)
if (user_pk == pk):
raise ValidationError(detail={"You can't send a friend request to yourself"}, code=status.HTTP_400_BAD_REQUEST)
current_user = get_object_or_404(User, id=user_pk) # current user is sending a request to the target
receiver = get_object_or_404(User, id=pk) # target user is the receiver of the request
# This FriendRequest.objects.get_or_create() function will get the object or create it
friend_request, created = FriendRequest.objects.get_or_create(
receiver_user = current_user,
sender_user = receiver,
sender_user = current_user,
receiver_user = receiver,
status = 'pending'
)
if created:
Expand All @@ -272,12 +275,18 @@ def send_friend_request(self, request, user_pk=None, pk=None):
def accept_friend_request(self, request, user_pk=None, pk=None):
try:
current_user = get_object_or_404(User, id=user_pk)
pending_user = get_object_or_404(FriendRequest, id=pk)
if pending_user.receiver_user == current_user:
if pending_user.status == 'pending':
pending_user.status = 'accepted'
pending_user.accept()
pending_user.save()
return Response({"detail": "Request accepted"}, status=status.HTTP_202_ACCEPTED)
sender_user = get_object_or_404(User, id=pk)
pending_requests = FriendRequest.objects.filter(receiver_user=current_user, sender_user=sender_user, status='pending') # filter returns a list
if pending_requests.exists(): # We can not use is not None instead used exists(), it is more efficient because it translates to a SELECT EXISTS SQL query
for request in pending_requests:
request.accept()
return Response({"detail": "Request accepted"}, status=status.HTTP_202_ACCEPTED)
return Response({"detail": "No pending requests found"}, status=status.HTTP_404_NOT_FOUND)
except User.DoesNotExist:
return Response({"detail": "Invalid user_id"}, status=status.HTTP_400_BAD_REQUEST)

def friend_requests(self, request, user_pk=None): # get user pending list
user = get_object_or_404(User, id = user_pk)
pending_requests = FriendRequest.objects.filter(receiver_user=user, status='pending') # filter returns a list
data = FriendSerializer(pending_requests, many=True)
return Response(data.data, status=status.HTTP_200_OK)

0 comments on commit d26037a

Please sign in to comment.