48 lines
952 B
Ruby
48 lines
952 B
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Autocomplete
|
||
|
# Finder that returns a list of routes that match on the `path` attribute.
|
||
|
class RoutesFinder
|
||
|
attr_reader :current_user, :search
|
||
|
|
||
|
LIMIT = 20
|
||
|
|
||
|
def initialize(current_user, params = {})
|
||
|
@current_user = current_user
|
||
|
@search = params[:search]
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
return [] if @search.blank?
|
||
|
|
||
|
Route
|
||
|
.for_routable(routables)
|
||
|
.sort_by_path_length
|
||
|
.fuzzy_search(@search, [:path])
|
||
|
.limit(LIMIT) # rubocop: disable CodeReuse/ActiveRecord
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def routables
|
||
|
raise NotImplementedError
|
||
|
end
|
||
|
|
||
|
class NamespacesOnly < self
|
||
|
def routables
|
||
|
return Namespace.all if current_user.admin?
|
||
|
|
||
|
current_user.namespaces
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class ProjectsOnly < self
|
||
|
def routables
|
||
|
return Project.all if current_user.admin?
|
||
|
|
||
|
current_user.projects
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|