summaryrefslogtreecommitdiff
path: root/lib/gitlab/request_endpoints.rb
blob: 157c0f91e65ce2648ebe8b11c0dd8e08de65631f (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
# frozen_string_literal: true

module Gitlab
  module RequestEndpoints
    class << self
      def all_api_endpoints
        # This compile does not do anything if the routes were already built
        # but if they weren't, the routes will be drawn and available for the rest of
        # application.
        API::API.compile!
        API::API.routes.select { |route| route.app.options[:for] < API::Base }
      end

      def all_controller_actions
        # This will return tuples of all controller actions defined in the routes
        # Only for controllers inheriting ApplicationController
        # Excluding controllers from gems (OAuth, Sidekiq)
        Rails.application.routes.routes.filter_map do |route|
          route_info = route.required_defaults.presence
          next unless route_info
          next if route_info[:controller].blank? || route_info[:action].blank?

          controller = constantize_controller(route_info[:controller])
          next unless controller&.include?(::Gitlab::EndpointAttributes)
          next if controller == ApplicationController
          next if controller == Devise::UnlocksController

          [controller, route_info[:action]]
        end
      end

      private

      def constantize_controller(name)
        "#{name.camelize}Controller".constantize
      rescue NameError
        nil # some controllers, like the omniauth ones are dynamic
      end
    end
  end
end