summaryrefslogtreecommitdiff
path: root/app/services
diff options
context:
space:
mode:
Diffstat (limited to 'app/services')
-rw-r--r--app/services/merge_requests/remove_approval_service.rb31
-rw-r--r--app/services/notification_service.rb12
-rw-r--r--app/services/system_note_service.rb5
3 files changed, 48 insertions, 0 deletions
diff --git a/app/services/merge_requests/remove_approval_service.rb b/app/services/merge_requests/remove_approval_service.rb
new file mode 100644
index 00000000000..8ae6651e59b
--- /dev/null
+++ b/app/services/merge_requests/remove_approval_service.rb
@@ -0,0 +1,31 @@
+module MergeRequests
+ class RemoveApprovalService < MergeRequests::BaseService
+ def execute(merge_request)
+ # paranoid protection against running wrong deletes
+ return unless merge_request.id && current_user.id
+
+ approval = merge_request.approvals.where(user: current_user)
+
+ currently_approved = merge_request.approved?
+
+ if approval.destroy_all
+ # bust the cache here, otherwise will show results from
+ # before the deletion
+ merge_request.approvals(true)
+
+ create_note(merge_request)
+
+ if currently_approved
+ notification_service.unapprove_mr(merge_request, current_user)
+ execute_hooks(merge_request, 'unapproved')
+ end
+ end
+ end
+
+ private
+
+ def create_note(merge_request)
+ SystemNoteService.unapprove_mr(merge_request, current_user)
+ end
+ end
+end
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index 89396156d0c..34982ff4167 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -162,6 +162,10 @@ class NotificationService
approve_mr_email(merge_request, merge_request.target_project, current_user)
end
+ def unapprove_mr(merge_request, current_user)
+ unapprove_mr_email(merge_request, merge_request.target_project, current_user)
+ end
+
def resolve_all_discussions(merge_request, current_user)
recipients = build_recipients(merge_request, merge_request.target_project, current_user, action: "resolve_all_discussions")
@@ -608,6 +612,14 @@ class NotificationService
end
end
+ def unapprove_mr_email(merge_request, project, current_user)
+ recipients = build_recipients(merge_request, project, current_user)
+
+ recipients.each do |recipient|
+ mailer.unapproved_merge_request_email(recipient.id, merge_request.id, current_user.id).deliver_later
+ end
+ end
+
def add_mr_approvers_email(merge_request, approvers, current_user)
approvers.each do |approver|
recipient = approver.user
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index c6c9d006809..9e6a3c8f31d 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -474,6 +474,11 @@ module SystemNoteService
create_note(noteable: noteable, project: noteable.project, author: user, note: body)
end
+ def unapprove_mr(noteable, user)
+ body = "Unapproved this merge request"
+ create_note(noteable: noteable, project: noteable.project, author: user, note: body)
+ end
+
private
def notes_for_mentioner(mentioner, noteable, notes)