summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-12-29 16:10:17 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-12-29 16:10:17 +0000
commit71ae8570fcefff809bdd1bc293d6d2d68e83b573 (patch)
treeedf87eadd9f9d3583770ed8f83f00e415ae7873f
parent75043a9eba557d1fe31d81dc30bd979af321e907 (diff)
parent23e83a6a99d1e79c0d81281b2bde5680bbfe5f3d (diff)
downloadgitlab-ce-71ae8570fcefff809bdd1bc293d6d2d68e83b573.tar.gz
Merge branch 'project-ordering' into 'master'
API: Project ordering Added support for ordering and sorting projects by id, name, created_at or last_activity_at fields. When the order_by parameter is passed the projects will be ordered by the appropriate field, when the parameter is not passed the original ordering will apply. the sort parameter will default to ASC, and will only be DESC if the sort parameter is desc See merge request !266
-rw-r--r--CHANGELOG2
-rw-r--r--doc/api/projects.md10
-rw-r--r--lib/api/projects.rb43
3 files changed, 49 insertions, 6 deletions
diff --git a/CHANGELOG b/CHANGELOG
index ea390eef200..9fafbbba673 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -19,7 +19,7 @@ v 7.7.0
-
- Add alert message in case of outdated browser (IE < 10)
-
- -
+ - Added API support for sorting projects
v 7.6.0
- Fork repository to groups
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 0055e2e476f..22d3c828a4b 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -11,6 +11,8 @@ GET /projects
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
```json
[
@@ -628,6 +630,8 @@ 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
+- `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
+- `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
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 7fcf97d1ad6..d6dd03656a6 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -22,6 +22,15 @@ module API
# GET /projects
get do
@projects = current_user.authorized_projects
+ sort = params[:sort] == 'desc' ? 'desc' : 'asc'
+
+ @projects = case params["order_by"]
+ when 'id' then @projects.reorder("id #{sort}")
+ when 'name' then @projects.reorder("name #{sort}")
+ when 'created_at' then @projects.reorder("created_at #{sort}")
+ when 'last_activity_at' then @projects.reorder("last_activity_at #{sort}")
+ else @projects
+ end
# If the archived parameter is passed, limit results accordingly
if params[:archived].present?
@@ -37,7 +46,17 @@ module API
# Example Request:
# GET /projects/owned
get '/owned' do
- @projects = paginate current_user.owned_projects
+ sort = params[:sort] == 'desc' ? 'desc' : 'asc'
+ @projects = current_user.owned_projects
+ @projects = case params["order_by"]
+ when 'id' then @projects.reorder("id #{sort}")
+ when 'name' then @projects.reorder("name #{sort}")
+ when 'created_at' then @projects.reorder("created_at #{sort}")
+ when 'last_activity_at' then @projects.reorder("last_activity_at #{sort}")
+ else @projects
+ end
+
+ @projects = paginate @projects
present @projects, with: Entities::Project
end
@@ -47,7 +66,17 @@ module API
# GET /projects/all
get '/all' do
authenticated_as_admin!
- @projects = paginate Project
+ sort = params[:sort] == 'desc' ? 'desc' : 'asc'
+
+ @projects = case params["order_by"]
+ when 'id' then Project.order("id #{sort}")
+ when 'name' then Project.order("name #{sort}")
+ when 'created_at' then Project.order("created_at #{sort}")
+ when 'last_activity_at' then Project.order("last_activity_at #{sort}")
+ else Project
+ end
+
+ @projects = paginate @projects
present @projects, with: Entities::Project
end
@@ -227,6 +256,16 @@ module API
ids = current_user.authorized_projects.map(&:id)
visibility_levels = [ Gitlab::VisibilityLevel::INTERNAL, Gitlab::VisibilityLevel::PUBLIC ]
projects = Project.where("(id in (?) OR visibility_level in (?)) AND (name LIKE (?))", ids, visibility_levels, "%#{params[:query]}%")
+ sort = params[:sort] == 'desc' ? 'desc' : 'asc'
+
+ projects = case params["order_by"]
+ when 'id' then projects.order("id #{sort}")
+ when 'name' then projects.order("name #{sort}")
+ when 'created_at' then projects.order("created_at #{sort}")
+ when 'last_activity_at' then projects.order("last_activity_at #{sort}")
+ else projects
+ end
+
present paginate(projects), with: Entities::Project
end