diff options
Diffstat (limited to 'app/finders/packages/build_infos_finder.rb')
-rw-r--r-- | app/finders/packages/build_infos_finder.rb | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/app/finders/packages/build_infos_finder.rb b/app/finders/packages/build_infos_finder.rb new file mode 100644 index 00000000000..92ad5888eb9 --- /dev/null +++ b/app/finders/packages/build_infos_finder.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +module Packages + class BuildInfosFinder + MAX_PAGE_SIZE = 100 + + def initialize(package, params) + @package = package + @params = params + end + + def execute + build_infos = @package.build_infos.without_empty_pipelines + build_infos = apply_order(build_infos) + build_infos = apply_limit(build_infos) + apply_cursor(build_infos) + end + + private + + def apply_order(build_infos) + order_direction = :desc + order_direction = :asc if last + + build_infos.order_by_pipeline_id(order_direction) + end + + def apply_limit(build_infos) + limit = [first, last, max_page_size, MAX_PAGE_SIZE].compact.min + limit += 1 if support_next_page + build_infos.limit(limit) + end + + def apply_cursor(build_infos) + if before + build_infos.with_pipeline_id_greater_than(before) + elsif after + build_infos.with_pipeline_id_less_than(after) + else + build_infos + end + end + + def first + @params[:first] + end + + def last + @params[:last] + end + + def max_page_size + @params[:max_page_size] + end + + def before + @params[:before] + end + + def after + @params[:after] + end + + def support_next_page + @params[:support_next_page] + end + end +end |