59 lines
1.4 KiB
Ruby
59 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
# Class for counting and caching the number of issuables per state.
|
|
class IssuablesCountForState
|
|
# The name of the Gitlab::SafeRequestStore 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
|
|
|
|
attr_reader :project
|
|
|
|
def self.declarative_policy_class
|
|
'IssuablePolicy'
|
|
end
|
|
|
|
# finder - The finder class to use for retrieving the issuables.
|
|
def initialize(finder, project = nil)
|
|
@finder = finder
|
|
@project = project
|
|
@cache = Gitlab::SafeRequestStore[CACHE_KEY] ||= initialize_cache
|
|
end
|
|
|
|
def for_state_or_opened(state = nil)
|
|
self[state || :opened]
|
|
end
|
|
|
|
# Define method for each state
|
|
STATES.each do |state|
|
|
define_method(state) { self[state] }
|
|
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
|