From cf4bb02a9f5d0942753a8fa7ed18d311c12b4ebf Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Thu, 22 Jun 2023 18:27:40 +0530 Subject: [PATCH] feat: added CRUD operation for issue subscriber --- apiserver/plane/api/serializers/issue.py | 10 +-- apiserver/plane/api/urls.py | 20 +++++- apiserver/plane/api/views/issue.py | 86 +++++++++++++++++++++++- 3 files changed, 109 insertions(+), 7 deletions(-) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index 540ea9097..7376cf0ff 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -534,11 +534,11 @@ class IssueLiteSerializer(BaseSerializer): class IssueSubscriberSerializer(BaseSerializer): - project = serializers.PrimaryKeyRelatedField(read_only=True) - workspace = serializers.PrimaryKeyRelatedField(read_only=True) - issue = serializers.PrimaryKeyRelatedField(read_only=True) - subscriber = serializers.PrimaryKeyRelatedField(read_only=True) - class Meta: model = IssueSubscriber fields = "__all__" + read_only_fields = [ + "workspace", + "project", + "issue", + ] diff --git a/apiserver/plane/api/urls.py b/apiserver/plane/api/urls.py index bf370063a..9edd92867 100644 --- a/apiserver/plane/api/urls.py +++ b/apiserver/plane/api/urls.py @@ -801,16 +801,34 @@ urlpatterns = [ ## End IssueComments # Issue Subscribers path( - "workspaces//projects//issues//subscribers/", + "workspaces//projects//issues//issue-subscribers/", IssueSubscriberViewSet.as_view( { "get": "list", "post": "create", + } + ), + name="project-issue-subscriber", + ), + path( + "workspaces//projects//issues//issue-subscribers/", + IssueSubscriberViewSet.as_view( + { "delete": "destroy" } ), name="project-issue-subscriber", ), + path( + "workspaces//projects//issues//subscribe/", + IssueSubscriberViewSet.as_view( + { + "get": "subscription_status", + "post": "subscribe", + } + ), + name="project-issue-subscriber", + ), ## End Issue Subscribers ## IssueProperty path( diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 85d205fed..7b64a211c 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -856,7 +856,8 @@ class IssueSubscriberViewSet(BaseViewSet): def perform_create(self, serializer): serializer.save( - subscriber_id=self.request.user.id, issue_id=self.kwargs.get("issue_id") + project_id=self.kwargs.get("project_id"), + issue_id=self.kwargs.get("issue_id"), ) def get_queryset(self): @@ -870,3 +871,86 @@ class IssueSubscriberViewSet(BaseViewSet): .order_by("-created_at") .distinct() ) + + def destroy(self, request, slug, project_id, issue_id, subscriber_id): + try: + issue_subscriber = IssueSubscriber.objects.get( + project=project_id, + subscriber=subscriber_id, + workspace__slug=slug, + issue=issue_id, + ) + + issue_subscriber.delete() + + return Response( + {"message": "Removed Subscription"}, + status=status.HTTP_200_OK, + ) + + except IssueSubscriber.DoesNotExist: + return Response( + {"error": "User is not subscribed to this issue"}, + status=status.HTTP_400_BAD_REQUEST, + ) + + except Exception as e: + capture_exception(e) + return Response( + {"error": "Something went wrong please try again later"}, + status=status.HTTP_400_BAD_REQUEST, + ) + + def subscribe(self, request, slug, project_id, issue_id): + try: + if IssueSubscriber.objects.filter( + issue_id=issue_id, + subscriber=request.user, + workspace__slug=slug, + project=project_id, + ).exists(): + return Response( + {"message": "User already subscribed to the issue."}, + status=status.HTTP_400_BAD_REQUEST, + ) + + issue = Issue.objects.get(id=issue_id) + + subscriber = IssueSubscriber.objects.create( + issue_id=issue_id, + subscriber_id=request.user.id, + project_id=project_id, + ) + + serilaizer = IssueSubscriberSerializer(subscriber) + return Response(serilaizer.data, status=status.HTTP_201_CREATED) + + except Issue.DoesNotExist: + return Response( + {"error": "Issue does not exists"}, + status=status.HTTP_400_BAD_REQUEST, + ) + + except Exception as e: + capture_exception(e) + return Response( + {"error": "Something went wrong, please try again later"}, + status=status.HTTP_400_BAD_REQUEST, + ) + + def subscription_status(self, request, slug, project_id, issue_id): + try: + issue_subscriber = IssueSubscriber.objects.filter( + issue=issue_id, + subscriber=request.user, + workspace__slug=slug, + project=project_id, + ).exists() + return Response({"subscribed": issue_subscriber}, status=status.HTTP_200_OK) + + except Exception as e: + capture_exception(e) + return Response( + {"error": "Something went wrong, please try again later"}, + status=status.HTTP_400_BAD_REQUEST, + )