summaryrefslogtreecommitdiff
path: root/lib/ci/project_list_builder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ci/project_list_builder.rb')
-rw-r--r--lib/ci/project_list_builder.rb21
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/ci/project_list_builder.rb b/lib/ci/project_list_builder.rb
new file mode 100644
index 00000000000..da26f9a9f47
--- /dev/null
+++ b/lib/ci/project_list_builder.rb
@@ -0,0 +1,21 @@
+module Ci
+ class ProjectListBuilder
+ def execute(current_user, search = nil)
+ projects = current_user.authorized_projects
+ projects = projects.search(search) if search
+
+ projects.
+ joins("LEFT JOIN ci_projects ON projects.id = ci_projects.gitlab_id
+ LEFT JOIN #{last_commit_subquery} AS last_commit ON #{Ci::Project.table_name}.id = last_commit.project_id").
+ reorder("ci_projects.id is NULL ASC,
+ CASE WHEN last_commit.committed_at IS NULL THEN 1 ELSE 0 END,
+ last_commit.committed_at DESC")
+ end
+
+ private
+
+ def last_commit_subquery
+ "(SELECT project_id, MAX(committed_at) committed_at FROM #{Ci::Commit.table_name} GROUP BY project_id)"
+ end
+ end
+end