From a03a41ea5f550c801bb973db987dd60c2a8bf65d Mon Sep 17 00:00:00 2001 From: shuaixr <1025sxr@gmail.com> Date: Mon, 3 Feb 2025 01:23:40 -0800 Subject: [PATCH] fix: delete webhook for issues, issue_comments, projects (#6539) * fix: prevent error when triggering deletion webhook The deletion webhook was not firing because it attempted to retrieve data after deletion, causing a failure. According to the webhook documentation https://developers.plane.so/webhooks/intro-webhooks, the delete event should only contain id, so the fix aligns with this expected behavior. * fix: make delete_comment_activity include comment_id The delete issues comment webhook requires comment_id * fix: trigger webhook on project delete --- apiserver/plane/api/views/project.py | 15 ++++++++++++++- apiserver/plane/app/views/project/base.py | 16 ++++++++++++++-- apiserver/plane/bgtasks/issue_activities_task.py | 2 ++ apiserver/plane/bgtasks/webhook_task.py | 6 +++++- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index 824ca6b5e3..e98f35d573 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -28,7 +28,7 @@ from plane.db.models import ( Workspace, UserFavorite, ) -from plane.bgtasks.webhook_task import model_activity +from plane.bgtasks.webhook_task import model_activity, webhook_activity from .base import BaseAPIView @@ -326,6 +326,19 @@ class ProjectAPIEndpoint(BaseAPIView): entity_type="project", entity_identifier=pk, project_id=pk ).delete() project.delete() + webhook_activity.delay( + event="project", + verb="deleted", + field=None, + old_value=None, + new_value=None, + actor_id=request.user.id, + slug=slug, + current_site=request.META.get("HTTP_ORIGIN"), + event_id=project.id, + old_identifier=None, + new_identifier=None, + ) return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/apiserver/plane/app/views/project/base.py b/apiserver/plane/app/views/project/base.py index 9123e6d87f..8988fc3ee4 100644 --- a/apiserver/plane/app/views/project/base.py +++ b/apiserver/plane/app/views/project/base.py @@ -39,7 +39,7 @@ from plane.db.models import ( WorkspaceMember, ) from plane.utils.cache import cache_response -from plane.bgtasks.webhook_task import model_activity +from plane.bgtasks.webhook_task import model_activity, webhook_activity from plane.bgtasks.recent_visited_task import recent_visited_task from plane.utils.exception_logger import log_exception @@ -462,7 +462,19 @@ class ProjectViewSet(BaseViewSet): ): project = Project.objects.get(pk=pk) project.delete() - + webhook_activity.delay( + event="project", + verb="deleted", + field=None, + old_value=None, + new_value=None, + actor_id=request.user.id, + slug=slug, + current_site=request.META.get("HTTP_ORIGIN"), + event_id=project.id, + old_identifier=None, + new_identifier=None, + ) # Delete the project members DeployBoard.objects.filter(project_id=pk, workspace__slug=slug).delete() diff --git a/apiserver/plane/bgtasks/issue_activities_task.py b/apiserver/plane/bgtasks/issue_activities_task.py index e0e2ea84e9..2113819797 100644 --- a/apiserver/plane/bgtasks/issue_activities_task.py +++ b/apiserver/plane/bgtasks/issue_activities_task.py @@ -738,8 +738,10 @@ def delete_comment_activity( issue_activities, epoch, ): + requested_data = json.loads(requested_data) if requested_data is not None else None issue_activities.append( IssueActivity( + issue_comment_id=requested_data.get("comment_id", None), issue_id=issue_id, project_id=project_id, workspace_id=workspace_id, diff --git a/apiserver/plane/bgtasks/webhook_task.py b/apiserver/plane/bgtasks/webhook_task.py index 141daf7962..c1ea01a4dc 100644 --- a/apiserver/plane/bgtasks/webhook_task.py +++ b/apiserver/plane/bgtasks/webhook_task.py @@ -387,7 +387,11 @@ def webhook_activity( webhook=webhook.id, slug=slug, event=event, - event_data=get_model_data(event=event, event_id=event_id), + event_data=( + {"id": event_id} + if verb == "deleted" + else get_model_data(event=event, event_id=event_id) + ), action=verb, current_site=current_site, activity={