From e9d94451959e4717e0ba4ca882b5a54437efbee1 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Tue, 21 Feb 2017 17:20:50 +0900 Subject: [PATCH] - Add new parameters for Pipeline API - Expand PipelinesFinder functions --- .../projects/pipelines_controller.rb | 10 +- app/finders/pipelines_finder.rb | 108 ++++++++++++++---- lib/api/pipelines.rb | 12 +- 3 files changed, 104 insertions(+), 26 deletions(-) diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb index 1780cc0233c..454b8ee17af 100644 --- a/app/controllers/projects/pipelines_controller.rb +++ b/app/controllers/projects/pipelines_controller.rb @@ -9,19 +9,19 @@ class Projects::PipelinesController < Projects::ApplicationController def index @scope = params[:scope] @pipelines = PipelinesFinder - .new(project) - .execute(scope: @scope) + .new(project, scope: @scope) + .execute .page(params[:page]) .per(30) @running_count = PipelinesFinder - .new(project).execute(scope: 'running').count + .new(project, scope: 'running').execute.count @pending_count = PipelinesFinder - .new(project).execute(scope: 'pending').count + .new(project, scope: 'pending').execute.count @finished_count = PipelinesFinder - .new(project).execute(scope: 'finished').count + .new(project, scope: 'finished').execute.count @pipelines_count = PipelinesFinder .new(project).execute.count diff --git a/app/finders/pipelines_finder.rb b/app/finders/pipelines_finder.rb index a9172f6767f..5a5416d00cc 100644 --- a/app/finders/pipelines_finder.rb +++ b/app/finders/pipelines_finder.rb @@ -1,29 +1,21 @@ class PipelinesFinder - attr_reader :project, :pipelines + attr_reader :project, :pipelines, :params - def initialize(project) + def initialize(project, params = {}) @project = project @pipelines = project.pipelines + @params = params end - def execute(scope: nil) - scoped_pipelines = - case scope - when 'running' - pipelines.running - when 'pending' - pipelines.pending - when 'finished' - pipelines.finished - when 'branches' - from_ids(ids_for_ref(branches)) - when 'tags' - from_ids(ids_for_ref(tags)) - else - pipelines - end - - scoped_pipelines.order(id: :desc) + def execute + items = pipelines + items = by_scope(items) + items = by_status(items) + items = by_ref(items) + items = by_user(items) + items = by_duration(items) + items = by_yaml_error(items) + order_and_sort(items) end private @@ -43,4 +35,80 @@ class PipelinesFinder def tags project.repository.tag_names end + + def by_scope(items) + case params[:scope] + when 'running' + items.running + when 'pending' + items.pending + when 'finished' + items.finished + when 'branches' + from_ids(ids_for_ref(branches)) + when 'tags' + from_ids(ids_for_ref(tags)) + else + items + end + end + + def by_status(items) + case params[:status] + when 'running' + items.running + when 'pending' + items.pending + when 'success' + items.success + when 'failed' + items.failed + when 'canceled' + items.canceled + when 'skipped' + items.skipped + else + items + end + end + + def by_ref(items) + if params[:ref].present? + items.where(ref: params[:ref]) + else + items + end + end + + def by_user(items) + if params[:user_id].present? + items.where(user_id: params[:user_id]) + else + items + end + end + + def by_duration(items) + if params[:duration].present? + items.where("duration > ?", params[:duration]) + else + items + end + end + + def by_yaml_error(items) + if params[:yaml_error].present? && params[:yaml_error] + items.where("yaml_errors IS NOT NULL") + else + items + end + end + + def order_and_sort(items) + if params[:order_by].present? && params[:sort].present? + items.order("#{params[:order_by]} #{params[:sort]}") + else + items.order(id: :desc) + end + end end diff --git a/lib/api/pipelines.rb b/lib/api/pipelines.rb index 754c3d85a04..905e72a3a95 100644 --- a/lib/api/pipelines.rb +++ b/lib/api/pipelines.rb @@ -16,11 +16,21 @@ module API use :pagination optional :scope, type: String, values: %w(running branches tags), desc: 'Either running, branches, or tags' + optional :status, type: String, values: ['running', 'pending', 'success', 'failed', 'canceled', 'skipped'], + desc: 'Pipeline Status' + optional :ref, type: String, desc: 'Pipeline Ref' + optional :duration, type: Integer, desc: 'Greater than the specified duration' + optional :yaml_error, type: Boolean, desc: 'If true, returns only yaml error pipelines.' + optional :user_id, type: String, desc: 'User who executed pipelines' + optional :order_by, type: String, values: ['id', 'status', 'ref', 'user_id', 'started_at', 'finished_at', 'created_at', 'updated_at'], default: 'id', + desc: 'Return issues ordered by `created_at` or `updated_at` fields.' + optional :sort, type: String, values: ['asc', 'desc'], default: 'desc', + desc: 'Return pipelines sorted in `asc` or `desc` order.' end get ':id/pipelines' do authorize! :read_pipeline, user_project - pipelines = PipelinesFinder.new(user_project).execute(scope: params[:scope]) + pipelines = PipelinesFinder.new(user_project, params).execute(scope: params[:scope]) present paginate(pipelines), with: Entities::PipelineBasic end