Exemplo n.º 1
0
 def follow(self, request, pk):
     # egde case check: duplicate follow action (e.g. multiple clicks from frontend)
     # silent processing. No need to report error.
     # because this kind of duplicated operation are mostly because of internet delay,
     if FriendshipService.has_followed(request.user.id, int(pk)):
         return Response(
             {
                 'success': True,
                 'duplicate': True,
                 'error': [{
                     'pk': f'you have followed the user with id={pk}'
                 }],
             },
             status=status.HTTP_400_BAD_REQUEST)
     serializer = FriendshipSerializerForCreate(
         data={
             'from_user_id': request.user.id,
             'to_user_id': pk,
         })
     if not serializer.is_valid():
         return Response({
             'success': False,
             'errors': serializer.errors,
         },
                         status=status.HTTP_400_BAD_REQUEST)
     instance = serializer.save()
     return Response(
         FollowingSerializer(instance, context={
             'request': request
         }).data,
         status=status.HTTP_201_CREATED,
     )
Exemplo n.º 2
0
    def follow(self, request, pk):
        # check if user with id=pk exists
        to_follow_user = self.get_object()

        if FriendshipService.has_followed(request.user.id, to_follow_user.id):
            return Response({
                'success': False,
                'message': 'Please check input',
                'errors': [{'pk': f'You has followed user with id={pk}'}],
            }, status=status.HTTP_400_BAD_REQUEST)

        # /api/friendships/<pk>/follow/
        serializer = FriendshipSerializerForCreate(data={
            'from_user_id': request.user.id,
            'to_user_id': to_follow_user.id,
        })
        if not serializer.is_valid():
            return Response({
                'success': False,
                'message': 'Please check input',
                'errors': serializer.errors,
            }, status=status.HTTP_400_BAD_REQUEST)
        instance = serializer.save()
        return Response(
            FollowingSerializer(instance, context={'request': request}).data,
            status=status.HTTP_201_CREATED
        )
 def follow(self, request, pk):
     if FriendshipService.has_followed(request.user.id, int(pk)):
         return Response({
             'success': True,
             'duplicate': True,
         },
                         status=status.HTTP_201_CREATED)
     serializer = FriendshipSerializerForCreate(
         data={
             'from_user_id': request.user.id,
             'to_user_id': pk,
         })
     if not serializer.is_valid():
         return Response({
             'success': False,
             'errors': serializer.errors,
         },
                         status=status.HTTP_400_BAD_REQUEST)
     instance = serializer.save()
     return Response(
         FollowingSerializer(instance, context={
             'request': request
         }).data,
         status=status.HTTP_201_CREATED,
     )
Exemplo n.º 4
0
    def follow(self, request, pk):
        # check if the user to follow exists
        to_user = self.get_object()
        # Friendship already existed. Raise error
        # avoid duplicated friendships in HBase
        if FriendshipService.has_followed(from_user_id=request.user.id,
                                          to_user_id=to_user.id):
            return Response({
                'success': True,
                'duplicated': True,
            },
                            status=status.HTTP_201_CREATED)

        # Friendship not exists, creat new friendship
        serializer = FriendshipCreateSerializer(
            data={
                'from_user_id':
                request.user.id,  # only logged in user can follow
                'to_user_id': pk,
            })
        if not serializer.is_valid():
            return Response({
                'success': False,
                'errors': serializer.errors,
            },
                            status=status.HTTP_400_BAD_REQUEST)

        friendship = serializer.save()
        return Response(
            {
                'success': True,
                'friendship': FriendshipCreateSerializer(friendship).data,
            },
            status=status.HTTP_201_CREATED)
Exemplo n.º 5
0
    def follow(self, request, pk):
        # check i fuser with id=pk exists
        # self.get_object()
        # 特殊判断重复 follow 的情况 (比如前端猛点多次follow)
        # 静默处理, 不报错, 因为这类重复操作 因为网络延迟的原因会比较多, 没必要当做错误处理
        if FriendshipService.has_followed(request.user.id, int(pk)):
            return Response({
                'success': True,
                'duplicate': True,
            },
                            status=status.HTTP_201_CREATED)
        serializer = FriendshipSerializerForCreate(
            data={
                'from_user_id': request.user.id,
                'to_user_id': pk,
            })
        if not serializer.is_valid():
            return Response({
                'success': False,
                'errors': serializer.errors,
            },
                            status=status.HTTP_400_BAD_REQUEST)
        serializer.save()

        return Response({'success': True}, status=status.HTTP_201_CREATED)
Exemplo n.º 6
0
    def follow(self, request, pk):
        # 特殊判断重复 follow 的情况(比如前端猛点好多少次 follow)
        # 静默处理,不报错,因为这类重复操作因为网络延迟的原因会比较多,没必要当做错误处理
        to_follow_user = self.get_object()
        if FriendshipService.has_followed(request.user.id, to_follow_user.id):
            return Response(
                {
                    'success': False,
                    'message': 'Please check input',
                    'errors': [{
                        'pk': f'You has followed user with id={pk}'
                    }],
                },
                status=status.HTTP_400_BAD_REQUEST)

        serializer = FriendshipSerializerForCreate(
            data={
                'from_user_id': request.user.id,
                'to_user_id': pk,
            })
        if not serializer.is_valid():
            return Response(
                {
                    "success": False,
                    "message": "Please check input.",
                    "errors": serializer.errors,
                },
                status=status.HTTP_400_BAD_REQUEST)
        instance = serializer.save()
        return Response(
            FollowingSerializer(instance, context={
                'request': request
            }).data,
            status=status.HTTP_201_CREATED,
        )
Exemplo n.º 7
0
    def follow(self, request, pk):
        # /api/friendships/<pk>/follow/
        # 特殊判断重复 follow 的情况(比如前端猛点好多少次 follow)
        # 静默处理,不报错,因为这类重复操作因为网络延迟的原因会比较多,没必要当做错误处理

        # get_object 会检测if user with id=pk 是否存在,如果不存在会return 404 异常
        follow_user = self.get_object()

        if FriendshipService.has_followed(request.user.id, int(pk)):
            return Response({
                'success': True,
                'duplicate': True,
            },
                            status=status.HTTP_201_CREATED)
        serializer = FriendshipSerializerForCreate(
            data={
                'from_user_id': request.user.id,
                'to_user_id': pk,
            })
        if not serializer.is_valid():
            return Response({
                'success': False,
                'errors': serializer.errors,
            },
                            status=status.HTTP_400_BAD_REQUEST)
        instance = serializer.save()
        return Response(
            # instead returning success=> true, returning the pk (the request tries to follow the pk) data
            # the return data includes user_id, created_at
            FollowingSerializer(instance, context={
                'request': request
            }).data,
            status=status.HTTP_201_CREATED,
        )
Exemplo n.º 8
0
 def follow(self, request, pk):
     # dup follow e.g. front end click follow many times
     # keep silent network delay, it is not a real error
     if FriendshipService.has_followed(request.user.id, int(pk)):
         return Response({
             'success': True,
             'duplicate': True,
         }, status=status.HTTP_201_CREATED)
     serializer = FriendshipSerializerForCreate(data={
         'from_user_id': request.user.id,
         'to_user_id': pk,
     })
     if not serializer.is_valid():
         return Response({
             'success': False,
             'errors': serializer.errors,
         }, status=status.HTTP_400_BAD_REQUEST)
     serializer.save()
     #FriendshipService.invalidate_following_cache(request.user.id)
     return Response({'success': True}, status=status.HTTP_201_CREATED)
Exemplo n.º 9
0
    def follow(self, request, pk):
        # check if user with id=pk exists
        to_follow_user = self.get_object()

        if FriendshipService.has_followed(request.user.id, to_follow_user.id):
            return Response({
                'success': False,
                'message': "Please check input",
                'errors': [{'pk': f'You has followed user with id={pk}'}],
            }, status=status.HTTP_400_BAD_REQUEST)

        serializer = FriendshipSerializerForCreate(data={
            'from_user_id': request.user.id,
            'to_user_id': to_follow_user.id,
        })
        if not serializer.is_valid():
            return Response({
                "success": False,
                "errors": serializer.errors,
            }, status=status.HTTP_400_BAD_REQUEST)
        serializer.save()
        return Response({'success': True}, status=status.HTTP_201_CREATED)
Exemplo n.º 10
0
    def follow(self, request, pk):
        # /api/friendships/<pk>/follow/
        # raise 404 if no user with id=pk
        to_follow_user = self.get_object()

        # 特殊判断重复 follow 的情况(比如前端猛点好多少次 follow)
        # 静默处理,不报错,因为这类重复操作因为网络延迟的原因会比较多,没必要当做错误处理
        # 或者报400
        if FriendshipService.has_followed(request.user.id, to_follow_user.id):
            return Response(
                {
                    'success': False,
                    'errors': [{
                        'pk': f'You have followed user with id={pk}'
                    }],
                },
                status=status.HTTP_400_BAD_REQUEST)

        serializer = FriendshipSerializerForCreate(
            data={
                'from_user_id': request.user.id,
                'to_user_id': to_follow_user.id,
            })
        if not serializer.is_valid():
            return Response({
                'success': False,
                'errors': serializer.errors,
            },
                            status=status.HTTP_400_BAD_REQUEST)
        instance = serializer.save()
        # 手动invalidate cache 或者利用listener自动调用 invalidate_following_cache
        # FriendshipService.invalidate_following_cache(request.user.id)
        return Response(FollowingSerializer(instance,
                                            context={
                                                'request': request
                                            }).data,
                        status=status.HTTP_201_CREATED)
Exemplo n.º 11
0
 def get_has_followed(self, obj):
     if self.context['request'].user.is_anonymous:
         return False
     return FriendshipService.has_followed(self.context['request'].user,
                                           obj.to_user)