From 8689ce1efef8438debeec2a3a6d669f4d5a435c4 Mon Sep 17 00:00:00 2001
From: Marin Jankovski <maxlazio@gmail.com>
Date: Mon, 12 Jan 2015 11:08:53 +0100
Subject: [PATCH] Add search filter option on project api for authorized
 projects.

---
 CHANGELOG                          |  2 +-
 doc/api/projects.md                |  1 +
 lib/api/projects.rb                |  7 ++++---
 spec/requests/api/projects_spec.rb | 25 +++++++++++++++++++++++++
 4 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 6e61a14f0..02ce71fdf 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -25,7 +25,7 @@ v 7.7.0
   -
   -
   -
-  -
+  - Add API project search filter option for authorized projects
   -
   -
   - Fix File blame not respecting branch selection
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 22d3c828a..027a8ec2e 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -13,6 +13,7 @@ Parameters:
 - `archived` (optional) - if passed, limit by archived status
 - `order_by` (optional) - Return requests ordered by `id`, `name`, `created_at` or `last_activity_at` fields
 - `sort` (optional) - Return requests sorted in `asc` or `desc` order
+- `search` (optional) - Return list of authorized projects according to a search criteria
 
 ```json
 [
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index e1cc23488..b9c95c785 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -15,9 +15,6 @@ module API
 
       # Get a projects list for authenticated user
       #
-      # Parameters:
-      #   archived (optional) - if passed, limit by archived status
-      #
       # Example Request:
       #   GET /projects
       get do
@@ -37,6 +34,10 @@ module API
           @projects = @projects.where(archived: parse_boolean(params[:archived]))
         end
 
+        if params[:search].present?
+          @projects = @projects.search(params[:search])
+        end
+
         @projects = paginate @projects
         present @projects, with: Entities::Project
       end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 79865f15f..dfc96c9df 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -7,6 +7,8 @@ describe API::API, api: true  do
   let(:user3) { create(:user) }
   let(:admin) { create(:admin) }
   let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
+  let(:project2) { create(:project, path: 'project2', creator_id: user.id, namespace: user.namespace) }
+  let(:project3) { create(:project, path: 'project3', creator_id: user.id, namespace: user.namespace) }
   let(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }
   let(:project_member) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) }
   let(:project_member2) { create(:project_member, user: user3, project: project, access_level: ProjectMember::DEVELOPER) }
@@ -29,6 +31,29 @@ describe API::API, api: true  do
         json_response.first['name'].should == project.name
         json_response.first['owner']['username'].should == user.username
       end
+
+      context "and using search" do
+        it "should return searched project" do
+          get api("/projects", user), { search: project.name }
+          response.status.should eq(200)
+          json_response.should be_an Array
+          json_response.length.should eq(1)
+        end
+      end
+
+      context "and using sorting" do
+        before do
+          project2
+          project3
+        end
+
+        it "should return the correct order when sorted by id" do
+          get api("/projects", user), { order_by: 'id', sort: 'desc'}
+          response.status.should eq(200)
+          json_response.should be_an Array
+          json_response.first['id'].should eq(3)
+        end
+      end
     end
   end
 
-- 
2.30.9