Commit 1165759b authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge pull request #5146 from karlhungus/feature-api-search-for-projects-by-name

Added search for projects by name to api
parents 203bc7bb 04c7c262
...@@ -13,7 +13,7 @@ class SearchContext ...@@ -13,7 +13,7 @@ class SearchContext
projects = Project.where(id: project_ids) projects = Project.where(id: project_ids)
result[:projects] = projects.search(query).limit(20) result[:projects] = projects.search(query).limit(20)
# Search inside singe project # Search inside single project
project = projects.first if projects.length == 1 project = projects.first if projects.length == 1
if params[:search_code].present? if params[:search_code].present?
......
...@@ -484,3 +484,18 @@ DELETE /projects/:id/fork ...@@ -484,3 +484,18 @@ DELETE /projects/:id/fork
Parameter: Parameter:
+ `id` (required) - The ID of the project + `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
...@@ -73,16 +73,16 @@ module API ...@@ -73,16 +73,16 @@ module API
post do post do
required_attributes! [:name] required_attributes! [:name]
attrs = attributes_for_keys [:name, attrs = attributes_for_keys [:name,
:path, :path,
:description, :description,
:default_branch, :default_branch,
:issues_enabled, :issues_enabled,
:wall_enabled, :wall_enabled,
:merge_requests_enabled, :merge_requests_enabled,
:wiki_enabled, :wiki_enabled,
:snippets_enabled, :snippets_enabled,
:namespace_id, :namespace_id,
:public] :public]
@project = ::Projects::CreateContext.new(current_user, attrs).execute @project = ::Projects::CreateContext.new(current_user, attrs).execute
if @project.saved? if @project.saved?
present @project, with: Entities::Project present @project, with: Entities::Project
...@@ -113,14 +113,14 @@ module API ...@@ -113,14 +113,14 @@ module API
authenticated_as_admin! authenticated_as_admin!
user = User.find(params[:user_id]) user = User.find(params[:user_id])
attrs = attributes_for_keys [:name, attrs = attributes_for_keys [:name,
:description, :description,
:default_branch, :default_branch,
:issues_enabled, :issues_enabled,
:wall_enabled, :wall_enabled,
:merge_requests_enabled, :merge_requests_enabled,
:wiki_enabled, :wiki_enabled,
:snippets_enabled, :snippets_enabled,
:public] :public]
@project = ::Projects::CreateContext.new(user, attrs).execute @project = ::Projects::CreateContext.new(user, attrs).execute
if @project.saved? if @project.saved?
present @project, with: Entities::Project present @project, with: Entities::Project
...@@ -165,7 +165,6 @@ module API ...@@ -165,7 +165,6 @@ module API
end end
end end
# Get a project team members # Get a project team members
# #
# Parameters: # Parameters:
...@@ -262,6 +261,20 @@ module API ...@@ -262,6 +261,20 @@ module API
{message: "Access revoked", id: params[:user_id].to_i} {message: "Access revoked", id: params[:user_id].to_i}
end end
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 end
end end
...@@ -692,4 +692,42 @@ describe API::API do ...@@ -692,4 +692,42 @@ describe API::API do
end end
end 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 end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment