diff options
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/merge_requests/remove_approval_service.rb | 31 | ||||
-rw-r--r-- | app/services/notification_service.rb | 12 | ||||
-rw-r--r-- | app/services/system_note_service.rb | 5 |
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) |