summaryrefslogtreecommitdiff
path: root/app/finders
diff options
context:
space:
mode:
Diffstat (limited to 'app/finders')
-rw-r--r--app/finders/deployments_finder.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/app/finders/deployments_finder.rb b/app/finders/deployments_finder.rb
new file mode 100644
index 00000000000..085c6a04fa6
--- /dev/null
+++ b/app/finders/deployments_finder.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+class DeploymentsFinder
+ attr_reader :project, :params
+
+ ALLOWED_SORT_VALUES = %w[id iid created_at updated_at ref].freeze
+ DEFAULT_SORT_VALUE = 'id'.freeze
+
+ ALLOWED_SORT_DIRECTIONS = %w[asc desc].freeze
+ DEFAULT_SORT_DIRECTION = 'asc'.freeze
+
+ def initialize(project, params = {})
+ @project = project
+ @params = params
+ end
+
+ def execute
+ items = init_collection
+ items = by_updated_at(items)
+ sort(items)
+ end
+
+ private
+
+ def init_collection
+ project.deployments
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def sort(items)
+ items.order(sort_params)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def by_updated_at(items)
+ items = items.updated_before(params[:updated_before]) if params[:updated_before].present?
+ items = items.updated_after(params[:updated_after]) if params[:updated_after].present?
+
+ items
+ end
+
+ def sort_params
+ order_by = ALLOWED_SORT_VALUES.include?(params[:order_by]) ? params[:order_by] : DEFAULT_SORT_VALUE
+ order_direction = ALLOWED_SORT_DIRECTIONS.include?(params[:sort]) ? params[:sort] : DEFAULT_SORT_DIRECTION
+
+ { order_by => order_direction }
+ end
+end