summaryrefslogtreecommitdiff
path: root/app/serializers/merge_request_user_entity.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/serializers/merge_request_user_entity.rb')
-rw-r--r--app/serializers/merge_request_user_entity.rb12
1 files changed, 11 insertions, 1 deletions
diff --git a/app/serializers/merge_request_user_entity.rb b/app/serializers/merge_request_user_entity.rb
index edb7e10bac5..a36c4da3e83 100644
--- a/app/serializers/merge_request_user_entity.rb
+++ b/app/serializers/merge_request_user_entity.rb
@@ -4,6 +4,10 @@ class MergeRequestUserEntity < ::API::Entities::UserBasic
include UserStatusTooltip
include RequestAwareEntity
+ def self.satisfies(*methods)
+ ->(_, options) { methods.all? { |m| options[:merge_request].try(m) } }
+ end
+
expose :can_merge do |reviewer, options|
options[:merge_request]&.can_be_merged_by?(reviewer)
end
@@ -12,11 +16,17 @@ class MergeRequestUserEntity < ::API::Entities::UserBasic
request.current_user&.can?(:update_merge_request, options[:merge_request])
end
- expose :reviewed, if: -> (_, options) { options[:merge_request] && options[:merge_request].allows_reviewers? } do |reviewer, options|
+ expose :reviewed, if: satisfies(:present?, :allows_reviewers?) do |reviewer, options|
reviewer = options[:merge_request].find_reviewer(reviewer)
reviewer&.reviewed?
end
+
+ expose :approved, if: satisfies(:present?) do |user, options|
+ # This approach is preferred over MergeRequest#approved_by? since this
+ # makes one query per merge request, whereas #approved_by? makes one per user
+ options[:merge_request].approvals.any? { |app| app.user_id == user.id }
+ end
end
MergeRequestUserEntity.prepend_if_ee('EE::MergeRequestUserEntity')