Commit 0f87ae3be5d7d1bc0a3728f43ae0465005b68b92

Authored by Izaak Alpert
1 parent cddec75d

Allow searching by namespace name, include public projects

GITLAB-1457 (GITLAB-836)

Change-Id: If8e2474bc6908accca51f395f58937687f101b58
app/contexts/search_context.rb
... ... @@ -9,11 +9,14 @@ class SearchContext
9 9 query = params[:search]
10 10  
11 11 return result unless query.present?
12   -
13   - projects = Project.where(id: project_ids)
14   - result[:projects] = projects.search(query).limit(20)
  12 + result[:projects] = Project.where("projects.id in (?) OR projects.public = true", project_ids).search(query).limit(20)
15 13  
16 14 # Search inside single project
  15 + single_project_search(Project.where(id: project_ids), query)
  16 + result
  17 + end
  18 +
  19 + def single_project_search(projects, query)
17 20 project = projects.first if projects.length == 1
18 21  
19 22 if params[:search_code].present?
... ... @@ -23,7 +26,6 @@ class SearchContext
23 26 result[:issues] = Issue.where(project_id: project_ids).search(query).order('updated_at DESC').limit(20)
24 27 result[:wiki_pages] = []
25 28 end
26   - result
27 29 end
28 30  
29 31 def result
... ...
app/models/project.rb
... ... @@ -122,7 +122,7 @@ class Project < ActiveRecord::Base
122 122 end
123 123  
124 124 def search query
125   - where("projects.name LIKE :query OR projects.path LIKE :query", query: "%#{query}%")
  125 + joins(:namespace).where("projects.name LIKE :query OR projects.path LIKE :query OR namespaces.name LIKE :query", query: "%#{query}%")
126 126 end
127 127  
128 128 def find_with_namespace(id)
... ...
spec/contexts/search_context_spec.rb 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +require 'spec_helper'
  2 +
  3 +describe SearchContext do
  4 + let(:found_namespace) { create(:namespace, name: 'searchable namespace', path:'another_thing') }
  5 + let(:user) { create(:user, namespace: found_namespace) }
  6 + let!(:found_project) { create(:project, name: 'searchable_project', creator_id: user.id, namespace: found_namespace, public: false) }
  7 +
  8 + let(:unfound_namespace) { create(:namespace, name: 'unfound namespace', path: 'yet_something_else') }
  9 + let!(:unfound_project) { create(:project, name: 'unfound_project', creator_id: user.id, namespace: unfound_namespace, public: false) }
  10 + let(:public_namespace) { create(:namespace, path: 'something_else',name: 'searchable public namespace') }
  11 + let(:other_user) { create(:user, namespace: public_namespace) }
  12 + let!(:public_project) { create(:project, name: 'searchable_public_project', creator_id: other_user.id, namespace: public_namespace, public: true) }
  13 +
  14 + describe '#execute' do
  15 + it 'public projects should be searchable' do
  16 + context = SearchContext.new([found_project.id], {search_code: false, search: "searchable"})
  17 + results = context.execute
  18 + results[:projects].should == [found_project, public_project]
  19 + end
  20 +
  21 + it 'namespace name should be searchable' do
  22 + context = SearchContext.new([found_project.id], {search_code: false, search: "searchable namespace"})
  23 + results = context.execute
  24 + results[:projects].should == [found_project]
  25 + end
  26 + end
  27 +end
... ...