diff options
Diffstat (limited to 'app/serializers/suggestion_entity.rb')
-rw-r--r-- | app/serializers/suggestion_entity.rb | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/app/serializers/suggestion_entity.rb b/app/serializers/suggestion_entity.rb index 4fb19fbc074..c9fcbe14f2e 100644 --- a/app/serializers/suggestion_entity.rb +++ b/app/serializers/suggestion_entity.rb @@ -2,6 +2,7 @@ class SuggestionEntity < API::Entities::Suggestion include RequestAwareEntity + include Gitlab::Utils::StrongMemoize unexpose :from_line, :to_line, :from_content, :to_content expose :diff_lines, using: DiffLineEntity do |suggestion| @@ -9,7 +10,29 @@ class SuggestionEntity < API::Entities::Suggestion end expose :current_user do expose :can_apply do |suggestion| - Ability.allowed?(current_user, :apply_suggestion, suggestion) + can_apply?(suggestion) + end + end + + expose :inapplicable_reason do |suggestion| + next _("You don't have write access to the source branch.") unless can_apply?(suggestion) + next if suggestion.appliable? + + case suggestion.inapplicable_reason + when :merge_request_merged + _("This merge request was merged. To apply this suggestion, edit this file directly.") + when :merge_request_closed + _("This merge request is closed. To apply this suggestion, edit this file directly.") + when :source_branch_deleted + _("Can't apply as the source branch was deleted.") + when :outdated + phrase = suggestion.single_line? ? 'this line was' : 'these lines were' + + _("Can't apply as %{phrase} changed in a more recent version.") % { phrase: phrase } + when :same_content + _("This suggestion already matches its content.") + else + _("Can't apply this suggestion.") end end @@ -18,4 +41,10 @@ class SuggestionEntity < API::Entities::Suggestion def current_user request.current_user end + + def can_apply?(suggestion) + strong_memoize(:can_apply) do + Ability.allowed?(current_user, :apply_suggestion, suggestion) + end + end end |