d9bb4230cc
Added visibility_level icons to project view (rather than just text). Added public projects to search results. Added ability to restrict visibility levels standard users can set.
42 lines
1.4 KiB
Ruby
42 lines
1.4 KiB
Ruby
class SearchContext
|
|
attr_accessor :project_ids, :current_user, :params
|
|
|
|
def initialize(project_ids, user, params)
|
|
@project_ids, @current_user, @params = project_ids, user, params.dup
|
|
end
|
|
|
|
def execute
|
|
query = params[:search]
|
|
query = Shellwords.shellescape(query) if query.present?
|
|
|
|
return result unless query.present?
|
|
visibility_levels = @current_user ? [ Gitlab::VisibilityLevel::INTERNAL, Gitlab::VisibilityLevel::PUBLIC ] : [ Gitlab::VisibilityLevel::PUBLIC ]
|
|
result[:projects] = Project.where("projects.id in (?) OR projects.visibility_level in (?)", project_ids, visibility_levels).search(query).limit(20)
|
|
|
|
# Search inside single project
|
|
single_project_search(Project.where(id: project_ids), query)
|
|
result
|
|
end
|
|
|
|
def single_project_search(projects, query)
|
|
project = projects.first if projects.length == 1
|
|
|
|
if params[:search_code].present?
|
|
result[:blobs] = project.repository.search_files(query, params[:repository_ref]) unless project.empty_repo?
|
|
else
|
|
result[:merge_requests] = MergeRequest.in_projects(project_ids).search(query).order('updated_at DESC').limit(20)
|
|
result[:issues] = Issue.where(project_id: project_ids).search(query).order('updated_at DESC').limit(20)
|
|
result[:wiki_pages] = []
|
|
end
|
|
end
|
|
|
|
def result
|
|
@result ||= {
|
|
projects: [],
|
|
merge_requests: [],
|
|
issues: [],
|
|
wiki_pages: [],
|
|
blobs: []
|
|
}
|
|
end
|
|
end
|