summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-09-25 06:57:34 -0700
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-09-25 06:57:34 -0700
commit1165759b14b02ad87dff46716e37e569f678b0b5 (patch)
tree8c3277a947e1c7094a0729748f8ec67522bd31d2
parent203bc7bb7e352391bc1405c800ae4907d7f3fe02 (diff)
parent04c7c262a7be469a4ae4865464b003c4b522a895 (diff)
downloadgitlab-ce-1165759b14b02ad87dff46716e37e569f678b0b5.tar.gz
Merge pull request #5146 from karlhungus/feature-api-search-for-projects-by-name
Added search for projects by name to api
-rw-r--r--app/contexts/search_context.rb2
-rw-r--r--doc/api/projects.md15
-rw-r--r--lib/api/projects.rb51
-rw-r--r--spec/requests/api/projects_spec.rb38
4 files changed, 86 insertions, 20 deletions
diff --git a/app/contexts/search_context.rb b/app/contexts/search_context.rb
index 0817d52cd00..48def0784fd 100644
--- a/app/contexts/search_context.rb
+++ b/app/contexts/search_context.rb
@@ -13,7 +13,7 @@ class SearchContext
projects = Project.where(id: project_ids)
result[:projects] = projects.search(query).limit(20)
- # Search inside singe project
+ # Search inside single project
project = projects.first if projects.length == 1
if params[:search_code].present?
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 9afffcbaa80..5150331e7d7 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -484,3 +484,18 @@ DELETE /projects/:id/fork
Parameter:
+ `id` (required) - The ID of the project
+
+
+## Search for projects by name
+
+Search for projects by name which are public or the calling user has access to
+
+```
+GET /projects/search/:query
+```
+
+Parameters:
+
++ query (required) - A string contained in the project name
++ per_page (optional) - number of projects to return per page
++ page (optional) - the page to retrieve
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index c6ff524cb06..cf357b23c40 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -73,16 +73,16 @@ module API
post do
required_attributes! [:name]
attrs = attributes_for_keys [:name,
- :path,
- :description,
- :default_branch,
- :issues_enabled,
- :wall_enabled,
- :merge_requests_enabled,
- :wiki_enabled,
- :snippets_enabled,
- :namespace_id,
- :public]
+ :path,
+ :description,
+ :default_branch,
+ :issues_enabled,
+ :wall_enabled,
+ :merge_requests_enabled,
+ :wiki_enabled,
+ :snippets_enabled,
+ :namespace_id,
+ :public]
@project = ::Projects::CreateContext.new(current_user, attrs).execute
if @project.saved?
present @project, with: Entities::Project
@@ -113,14 +113,14 @@ module API
authenticated_as_admin!
user = User.find(params[:user_id])
attrs = attributes_for_keys [:name,
- :description,
- :default_branch,
- :issues_enabled,
- :wall_enabled,
- :merge_requests_enabled,
- :wiki_enabled,
- :snippets_enabled,
- :public]
+ :description,
+ :default_branch,
+ :issues_enabled,
+ :wall_enabled,
+ :merge_requests_enabled,
+ :wiki_enabled,
+ :snippets_enabled,
+ :public]
@project = ::Projects::CreateContext.new(user, attrs).execute
if @project.saved?
present @project, with: Entities::Project
@@ -165,7 +165,6 @@ module API
end
end
-
# Get a project team members
#
# Parameters:
@@ -262,6 +261,20 @@ module API
{message: "Access revoked", id: params[:user_id].to_i}
end
end
+
+ # search for projects current_user has access to
+ #
+ # Parameters:
+ # query (required) - A string contained in the project name
+ # per_page (optional) - number of projects to return per page
+ # page (optional) - the page to retrieve
+ # Example Request:
+ # GET /projects/search/:query
+ get "/search/:query" do
+ ids = current_user.authorized_projects.map(&:id)
+ projects = Project.where("(id in (?) OR public = true) AND (name LIKE (?))", ids, "%#{params[:query]}%")
+ present paginate(projects), with: Entities::Project
+ end
end
end
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 2de3dc55e40..b8c0b6f33ed 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -692,4 +692,42 @@ describe API::API do
end
end
end
+
+ describe "GET /projects/search/:query" do
+ let!(:query) { 'query'}
+ let!(:search) { create(:project, name: query, creator_id: user.id, namespace: user.namespace) }
+ let!(:pre) { create(:project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) }
+ let!(:post) { create(:project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) }
+ let!(:pre_post) { create(:project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) }
+ let!(:unfound) { create(:project, name: 'unfound', creator_id: user.id, namespace: user.namespace) }
+ let!(:public) { create(:project, name: "another #{query}",public: true) }
+ let!(:unfound_public) { create(:project, name: 'unfound public', public: true) }
+
+ context "when unauthenticated" do
+ it "should return authentication error" do
+ get api("/projects/search/#{query}")
+ response.status.should == 401
+ end
+ end
+
+ context "when authenticated" do
+ it "should return an array of projects" do
+ get api("/projects/search/#{query}",user)
+ response.status.should == 200
+ json_response.should be_an Array
+ json_response.size.should == 5
+ json_response.each {|project| project['name'].should =~ /.*query.*/}
+ end
+ end
+
+ context "when authenticated as a different user" do
+ it "should return matching public projects" do
+ get api("/projects/search/#{query}", user2)
+ response.status.should == 200
+ json_response.should be_an Array
+ json_response.size.should == 1
+ json_response.first['name'].should == "another #{query}"
+ end
+ end
+ end
end