diff options
Diffstat (limited to 'app/finders/packages')
-rw-r--r-- | app/finders/packages/debian/distributions_finder.rb | 52 | ||||
-rw-r--r-- | app/finders/packages/group_packages_finder.rb | 8 | ||||
-rw-r--r-- | app/finders/packages/maven/package_finder.rb | 16 | ||||
-rw-r--r-- | app/finders/packages/nuget/package_finder.rb | 35 | ||||
-rw-r--r-- | app/finders/packages/packages_finder.rb | 8 |
5 files changed, 105 insertions, 14 deletions
diff --git a/app/finders/packages/debian/distributions_finder.rb b/app/finders/packages/debian/distributions_finder.rb new file mode 100644 index 00000000000..e64b6bdfec1 --- /dev/null +++ b/app/finders/packages/debian/distributions_finder.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module Packages + module Debian + class DistributionsFinder + def initialize(container, params = {}) + @container, @params = container, params + end + + def execute + collection = relation.with_container(container) + collection = by_codename(collection) + collection = by_suite(collection) + collection = by_codename_or_suite(collection) + collection + end + + private + + attr_reader :container, :params + + def relation + case container + when Project + Packages::Debian::ProjectDistribution + when Group + Packages::Debian::GroupDistribution + else + raise ArgumentError, "Unexpected container type of '#{container.class}'" + end + end + + def by_codename(collection) + return collection unless params[:codename].present? + + collection.with_codename(params[:codename]) + end + + def by_suite(collection) + return collection unless params[:suite].present? + + collection.with_suite(params[:suite]) + end + + def by_codename_or_suite(collection) + return collection unless params[:codename_or_suite].present? + + collection.with_codename_or_suite(params[:codename_or_suite]) + end + end + end +end diff --git a/app/finders/packages/group_packages_finder.rb b/app/finders/packages/group_packages_finder.rb index a51057571f1..860c4068b31 100644 --- a/app/finders/packages/group_packages_finder.rb +++ b/app/finders/packages/group_packages_finder.rb @@ -27,9 +27,9 @@ module Packages .including_tags .for_projects(group_projects_visible_to_current_user.select(:id)) .processed - .has_version .sort_by_attribute("#{params[:order_by]}_#{params[:sort]}") + packages = filter_with_version(packages) packages = filter_by_package_type(packages) packages = filter_by_package_name(packages) packages @@ -72,5 +72,11 @@ module Packages packages.search_by_name(params[:package_name]) end + + def filter_with_version(packages) + return packages if params[:include_versionless].present? + + packages.has_version + end end end diff --git a/app/finders/packages/maven/package_finder.rb b/app/finders/packages/maven/package_finder.rb index 775db12adb7..7e753705cbd 100644 --- a/app/finders/packages/maven/package_finder.rb +++ b/app/finders/packages/maven/package_finder.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + module Packages module Maven class PackageFinder @@ -27,17 +28,22 @@ module Packages elsif group packages_for_multiple_projects else - packages + ::Packages::Package.none end end def packages_with_path - base.only_maven_packages_with_path(path) + matching_packages = base.only_maven_packages_with_path(path) + matching_packages = matching_packages.order_by_package_file if versionless_package?(matching_packages) + + matching_packages end - # Produces a query that returns all packages. - def packages - ::Packages::Package.all + def versionless_package?(matching_packages) + return if matching_packages.empty? + + # if one matching package is versionless, they all are. + matching_packages.first&.version.nil? end # Produces a query that retrieves packages from a single project. diff --git a/app/finders/packages/nuget/package_finder.rb b/app/finders/packages/nuget/package_finder.rb index e6fb6712d47..8f585f045a1 100644 --- a/app/finders/packages/nuget/package_finder.rb +++ b/app/finders/packages/nuget/package_finder.rb @@ -1,11 +1,15 @@ # frozen_string_literal: true + module Packages module Nuget class PackageFinder + include ::Packages::FinderHelper + MAX_PACKAGES_COUNT = 50 - def initialize(project, package_name:, package_version: nil, limit: MAX_PACKAGES_COUNT) - @project = project + def initialize(current_user, project_or_group, package_name:, package_version: nil, limit: MAX_PACKAGES_COUNT) + @current_user = current_user + @project_or_group = project_or_group @package_name = package_name @package_version = package_version @limit = limit @@ -17,15 +21,32 @@ module Packages private + def base + if project? + @project_or_group.packages + elsif group? + packages_visible_to_user(@current_user, within_group: @project_or_group) + else + ::Packages::Package.none + end + end + def packages - result = @project.packages - .nuget - .has_version - .processed - .with_name_like(@package_name) + result = base.nuget + .has_version + .processed + .with_name_like(@package_name) result = result.with_version(@package_version) if @package_version.present? result end + + def project? + @project_or_group.is_a?(::Project) + end + + def group? + @project_or_group.is_a?(::Group) + end end end end diff --git a/app/finders/packages/packages_finder.rb b/app/finders/packages/packages_finder.rb index 519e8bf9c34..72a63224d2f 100644 --- a/app/finders/packages/packages_finder.rb +++ b/app/finders/packages/packages_finder.rb @@ -18,7 +18,7 @@ module Packages .including_project_route .including_tags .processed - .has_version + packages = filter_with_version(packages) packages = filter_by_package_type(packages) packages = filter_by_package_name(packages) packages = order_packages(packages) @@ -27,6 +27,12 @@ module Packages private + def filter_with_version(packages) + return packages if params[:include_versionless].present? + + packages.has_version + end + def filter_by_package_type(packages) return packages unless params[:package_type] |