merge_requests_finder.rb 1.97 KB
Newer Older
1 2
# frozen_string_literal: true

3 4 5 6 7 8 9
# Finders::MergeRequest class
#
# Used to filter MergeRequests collections by set of params
#
# Arguments:
#   current_user - which user use
#   params:
10
#     scope: 'created_by_me' or 'assigned_to_me' or 'all'
11
#     state: 'open', 'closed', 'merged', 'locked', or 'all'
12 13
#     group_id: integer
#     project_id: integer
14
#     milestone_title: string
15
#     author_id: integer
16 17 18 19
#     assignee_id: integer
#     search: string
#     label_name: string
#     sort: string
20
#     non_archived: boolean
21
#     my_reaction_emoji: string
22 23
#     source_branch: string
#     target_branch: string
24 25 26 27
#     created_after: datetime
#     created_before: datetime
#     updated_after: datetime
#     updated_before: datetime
28
#
29
class MergeRequestsFinder < IssuableFinder
30 31 32 33
  def self.scalar_params
    @scalar_params ||= super + [:wip]
  end

34 35 36
  def klass
    MergeRequest
  end
37

38 39
  def filter_items(_items)
    items = by_source_branch(super)
40
    items = by_wip(items)
41 42 43
    by_target_branch(items)
  end

44 45
  private

46 47 48 49
  def source_branch
    @source_branch ||= params[:source_branch].presence
  end

50
  # rubocop: disable CodeReuse/ActiveRecord
51 52 53 54 55
  def by_source_branch(items)
    return items unless source_branch

    items.where(source_branch: source_branch)
  end
56
  # rubocop: enable CodeReuse/ActiveRecord
57 58 59 60 61

  def target_branch
    @target_branch ||= params[:target_branch].presence
  end

62
  # rubocop: disable CodeReuse/ActiveRecord
63 64 65 66 67
  def by_target_branch(items)
    return items unless target_branch

    items.where(target_branch: target_branch)
  end
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

  def item_project_ids(items)
    items&.reorder(nil)&.select(:target_project_id)
  end

  def by_wip(items)
    if params[:wip] == 'yes'
      items.where(wip_match(items.arel_table))
    elsif params[:wip] == 'no'
      items.where.not(wip_match(items.arel_table))
    else
      items
    end
  end

  def wip_match(table)
    table[:title].matches('WIP:%')
        .or(table[:title].matches('WIP %'))
        .or(table[:title].matches('[WIP]%'))
  end
88
end