summaryrefslogtreecommitdiff
path: root/app/models/users/merge_request_interaction.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/users/merge_request_interaction.rb')
-rw-r--r--app/models/users/merge_request_interaction.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/app/models/users/merge_request_interaction.rb b/app/models/users/merge_request_interaction.rb
new file mode 100644
index 00000000000..35d1d3206b5
--- /dev/null
+++ b/app/models/users/merge_request_interaction.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Users
+ class MergeRequestInteraction
+ def initialize(user:, merge_request:)
+ @user = user
+ @merge_request = merge_request
+ end
+
+ def declarative_policy_subject
+ merge_request
+ end
+
+ def can_merge?
+ merge_request.can_be_merged_by?(user)
+ end
+
+ def can_update?
+ user.can?(:update_merge_request, merge_request)
+ end
+
+ def review_state
+ reviewer&.state
+ end
+
+ def reviewed?
+ reviewer&.reviewed? == true
+ end
+
+ def approved?
+ merge_request.approvals.any? { |app| app.user_id == user.id }
+ end
+
+ private
+
+ def reviewer
+ @reviewer ||= merge_request.merge_request_reviewers.find { |r| r.user_id == user.id }
+ end
+
+ attr_reader :user, :merge_request
+ end
+end
+
+::Users::MergeRequestInteraction.prepend_if_ee('EE::Users::MergeRequestInteraction')