summaryrefslogtreecommitdiff
path: root/lib/gitlab/issuables_count_for_state.rb
blob: 505810964bc17ac9e016d39502471a0fa91df478 (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
module Gitlab
  # Class for counting and caching the number of issuables per state.
  class IssuablesCountForState
    # The name of the RequestStore cache key.
    CACHE_KEY = :issuables_count_for_state

    # The state values that can be safely casted to a Symbol.
    STATES = %w[opened closed merged all].freeze

    # finder - The finder class to use for retrieving the issuables.
    def initialize(finder)
      @finder = finder
      @cache =
        if RequestStore.active?
          RequestStore[CACHE_KEY] ||= initialize_cache
        else
          initialize_cache
        end
    end

    def for_state_or_opened(state = nil)
      self[state || :opened]
    end

    # Returns the count for the given state.
    #
    # state - The name of the state as either a String or a Symbol.
    #
    # Returns an Integer.
    def [](state)
      state = state.to_sym if cast_state_to_symbol?(state)

      cache_for_finder[state] || 0
    end

    private

    def cache_for_finder
      @cache[@finder]
    end

    def cast_state_to_symbol?(state)
      state.is_a?(String) && STATES.include?(state)
    end

    def initialize_cache
      Hash.new { |hash, finder| hash[finder] = finder.count_by_state }
    end
  end
end