noteable.rb 1.88 KB
Newer Older
1
module Noteable
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
  # Names of all implementers of `Noteable` that support resolvable notes.
  RESOLVABLE_TYPES = %w(MergeRequest).freeze

  def base_class_name
    self.class.base_class.name
  end

  # Convert this Noteable class name to a format usable by notifications.
  #
  # Examples:
  #
  #   noteable.class           # => MergeRequest
  #   noteable.human_class_name # => "merge request"
  def human_class_name
    @human_class_name ||= base_class_name.titleize.downcase
  end

  def supports_resolvable_notes?
    RESOLVABLE_TYPES.include?(base_class_name)
  end

  def supports_discussions?
    DiscussionNote::NOTEABLE_TYPES.include?(base_class_name)
  end

27 28 29 30
  def discussion_notes
    notes
  end

31
  delegate :find_discussion, to: :discussion_notes
32 33 34 35 36 37 38

  def discussions
    @discussions ||= discussion_notes
      .inc_relations_for_view
      .discussions(self)
  end

39
  def grouped_diff_discussions(*args)
Douwe Maan's avatar
Douwe Maan committed
40 41
    # Doesn't use `discussion_notes`, because this may include commit diff notes
    # besides MR diff notes, that we do no want to display on the MR Changes tab.
42
    notes.inc_relations_for_view.grouped_diff_discussions(*args)
43
  end
Douwe Maan's avatar
Douwe Maan committed
44 45

  def resolvable_discussions
46 47 48 49 50 51
    @resolvable_discussions ||=
      if defined?(@discussions)
        @discussions.select(&:resolvable?)
      else
        discussion_notes.resolvable.discussions(self)
      end
Douwe Maan's avatar
Douwe Maan committed
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
  end

  def discussions_resolvable?
    resolvable_discussions.any?(&:resolvable?)
  end

  def discussions_resolved?
    discussions_resolvable? && resolvable_discussions.none?(&:to_be_resolved?)
  end

  def discussions_to_be_resolved?
    discussions_resolvable? && !discussions_resolved?
  end

  def discussions_to_be_resolved
    @discussions_to_be_resolved ||= resolvable_discussions.select(&:to_be_resolved?)
  end

  def discussions_can_be_resolved_by?(user)
    discussions_to_be_resolved.all? { |discussion| discussion.can_resolve?(user) }
  end
73
end