summaryrefslogtreecommitdiff
path: root/app/finders/jobs_with_artifacts_finder.rb
blob: bc29186445245cfb56da832adb9847e4434d3aab (plain)
1
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# frozen_string_literal: true

class JobsWithArtifactsFinder
  NUMBER_OF_JOBS_PER_PAGE = 30

  def initialize(project:, params:)
    @project = project
    @params = params
  end

  def execute
    jobs = jobs_with_size
    jobs = filter_by_name(jobs)
    jobs = filter_by_deleted_branches(jobs)
    jobs = sorted(jobs)
    jobs = paginated(jobs)
    jobs
  end

  def total_size
    job_ids = @project.builds.select(:id)

    @project.builds.where(id: job_ids).sum(:artifacts_size) +
      @project.job_artifacts.where(job_id: job_ids).sum(:size)
  end

  def sort_key
    @params[:sort].presence || 'created_asc'
  end

  private

  def filter_by_name(jobs)
    return jobs if @params[:search].blank?

    jobs.search(@params[:search])
  end

  def filter_by_deleted_branches(jobs)
    deleted_branches = @params[:'deleted_branches_deleted-branches']

    return jobs if deleted_branches.blank?

    deleted_branches = ActiveModel::Type::Boolean.new.cast(deleted_branches)

    if deleted_branches
      jobs.where.not(ref: @project.repository.ref_names)
    else
      jobs.where(ref: @project.repository.ref_names)
    end
  end

  def sorted(jobs)
    jobs.order_by(sort_key)
  end

  def paginated(jobs)
    jobs.page(@params[:page]).per(NUMBER_OF_JOBS_PER_PAGE).without_count
  end

  def jobs_with_size
    @project.builds.with_sum_artifacts_size
  end
end