Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/merge_requests/approval_service.rb')
-rw-r--r--app/services/merge_requests/approval_service.rb53
1 files changed, 33 insertions, 20 deletions
diff --git a/app/services/merge_requests/approval_service.rb b/app/services/merge_requests/approval_service.rb
index b8d817a15f3..dcc4cf4bb1e 100644
--- a/app/services/merge_requests/approval_service.rb
+++ b/app/services/merge_requests/approval_service.rb
@@ -10,14 +10,27 @@ module MergeRequests
return success unless save_approval(approval)
reset_approvals_cache(merge_request)
- create_event(merge_request)
- stream_audit_event(merge_request)
- create_approval_note(merge_request)
- mark_pending_todos_as_done(merge_request)
- execute_approval_hooks(merge_request, current_user)
- remove_attention_requested(merge_request)
merge_request_activity_counter.track_approve_mr_action(user: current_user, merge_request: merge_request)
+ # Approval side effects (things not required to be done immediately but
+ # should happen after a successful approval) should be done asynchronously
+ # utilizing the `Gitlab::EventStore`.
+ #
+ # Workers can subscribe to the `MergeRequests::ApprovedEvent`.
+ if Feature.enabled?(:async_after_approval, project)
+ Gitlab::EventStore.publish(
+ MergeRequests::ApprovedEvent.new(
+ data: { current_user_id: current_user.id, merge_request_id: merge_request.id }
+ )
+ )
+ else
+ create_event(merge_request)
+ stream_audit_event(merge_request)
+ create_approval_note(merge_request)
+ mark_pending_todos_as_done(merge_request)
+ execute_approval_hooks(merge_request, current_user)
+ end
+
success
end
@@ -27,21 +40,22 @@ module MergeRequests
current_user.can?(:approve_merge_request, merge_request)
end
+ def save_approval(approval)
+ Approval.safe_ensure_unique do
+ approval.save
+ end
+ end
+
def reset_approvals_cache(merge_request)
merge_request.approvals.reset
end
- def execute_approval_hooks(merge_request, current_user)
- # Only one approval is required for a merge request to be approved
- notification_service.async.approve_mr(merge_request, current_user)
-
- execute_hooks(merge_request, 'approved')
+ def create_event(merge_request)
+ event_service.approve_mr(merge_request, current_user)
end
- def save_approval(approval)
- Approval.safe_ensure_unique do
- approval.save
- end
+ def stream_audit_event(merge_request)
+ # Defined in EE
end
def create_approval_note(merge_request)
@@ -52,12 +66,11 @@ module MergeRequests
todo_service.resolve_todos_for_target(merge_request, current_user)
end
- def create_event(merge_request)
- event_service.approve_mr(merge_request, current_user)
- end
+ def execute_approval_hooks(merge_request, current_user)
+ # Only one approval is required for a merge request to be approved
+ notification_service.async.approve_mr(merge_request, current_user)
- def stream_audit_event(merge_request)
- # Defined in EE
+ execute_hooks(merge_request, 'approved')
end
end
end