module Gitlab::Triage::Resource::Shared::Issuable

Constants

MAX_PARENT_LOOKUP
SourceTooDeep

Public Instance Methods

author() click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 50
def author
  @author ||= resource.dig(:author, :username)
end
full_resource_reference() click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 59
def full_resource_reference
  @full_resource_reference ||=
    "#{project_path}#{reference}#{resource[:iid]}"
end
label_events() click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 41
def label_events
  @label_events ||= query_label_events
    .map { |label_event| LabelEvent.new(label_event, parent: self) }
end
labels() click to toggle source

This will be more useful when we have: gitlab.com/gitlab-org/gitlab-ce/issues/51011

# File lib/gitlab/triage/resource/shared/issuable.rb, line 23
def labels
  @labels ||= resource[:labels] # an array of label names
    .map { |label| Label.new({ name: label }, parent: self) }
end
labels_chronologically() click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 46
def labels_chronologically
  @labels_chronologically ||= labels_with_details.sort_by(&:added_at)
end
labels_with_details() click to toggle source

Make this an alias of `labels` when we have: gitlab.com/gitlab-org/gitlab-ce/issues/51011

# File lib/gitlab/triage/resource/shared/issuable.rb, line 30
def labels_with_details
  # Labels can be deleted thus event.label can be nil
  @labels_with_details ||= label_events
    .select { |event| event.action == 'add' && event.label }
    .map(&:label)
    .sort_by(&:added_at)
    .reverse
    .uniq(&:name)
    .select { |label| resource[:labels].include?(label.name) }
end
milestone() click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 15
def milestone
  @milestone ||=
    resource[:milestone] &&
    Milestone.new(resource[:milestone], parent: self)
end
project_path() click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 54
def project_path
  @project_path ||=
    request_project(resource[:project_id])[:path_with_namespace]
end
reference() click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 64
def reference
  raise NotImplementedError
end
root_id( resource: source_resource, max_levels: MAX_PARENT_LOOKUP) click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 68
def root_id(
  resource: source_resource,
  max_levels: MAX_PARENT_LOOKUP)
  raise SourceTooDeep if max_levels <= 0

  parent_id = resource.dig(:namespace, :parent_id)

  if parent_id
    root_id(
      resource: request_group(parent_id),
      max_levels: max_levels - 1)
  else
    resource.dig(:namespace, :id) || resource[:id]
  end
end

Private Instance Methods

group_url(group_id) click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 99
def group_url(group_id)
  Gitlab::Triage::UrlBuilders::UrlBuilder.new(
    network_options: network.options,
    source: 'groups',
    source_id: group_id
  ).build
end
project_url(project_id) click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 107
def project_url(project_id)
  Gitlab::Triage::UrlBuilders::UrlBuilder.new(
    network_options: network.options,
    source: 'projects',
    source_id: project_id
  ).build
end
query_label_events() click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 86
def query_label_events
  network.query_api_cached(
    resource_url(sub_resource_type: 'resource_label_events'))
end
request_group(group_id) click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 95
def request_group(group_id)
  network.query_api_cached(group_url(group_id)).first
end
request_project(project_id) click to toggle source
# File lib/gitlab/triage/resource/shared/issuable.rb, line 91
def request_project(project_id)
  network.query_api_cached(project_url(project_id)).first
end