File: listing.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (63 lines) | stat: -rw-r--r-- 2,083 bytes parent folder | download
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