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
|
# frozen_string_literal: true
module Ci
module Catalog
# This class is the SSoT to displaying the list of resources in the CI/CD Catalog.
class Listing
MIN_SEARCH_LENGTH = 3
def initialize(current_user)
@current_user = current_user
end
def resources(sort: nil, search: nil, scope: :all)
relation = Ci::Catalog::Resource.published.includes(:project)
relation = by_scope(relation, scope)
relation = by_search(relation, search)
case sort.to_s
when 'name_desc' then relation.order_by_name_desc
when 'name_asc' then relation.order_by_name_asc
when 'latest_released_at_desc' then relation.order_by_latest_released_at_desc
when 'latest_released_at_asc' then relation.order_by_latest_released_at_asc
when 'created_at_asc' then relation.order_by_created_at_asc
when 'created_at_desc' then relation.order_by_created_at_desc
when 'usage_count_asc' then relation.order_by_last_30_day_usage_count_asc
when 'usage_count_desc' then relation.order_by_last_30_day_usage_count_desc
when 'star_count_asc' then relation.order_by_star_count(:asc)
else
relation.order_by_star_count(:desc)
end
end
def find_resource(id: nil, full_path: nil)
resource = id ? Ci::Catalog::Resource.find_by_id(id) : Project.find_by_full_path(full_path)&.catalog_resource
return unless resource.present?
return unless resource.published?
return unless Ability.allowed?(current_user, :read_code, resource.project)
resource
end
private
attr_reader :current_user
def by_search(relation, search)
return relation unless search
return relation.none if search.length < MIN_SEARCH_LENGTH
relation.search(search)
end
def by_scope(relation, scope)
if scope == :namespaces
relation.visible_to_user(current_user)
else
relation.public_or_visible_to_user(current_user)
end
end
end
end
end
|