summaryrefslogtreecommitdiff
path: root/app/finders/packages
diff options
context:
space:
mode:
Diffstat (limited to 'app/finders/packages')
-rw-r--r--app/finders/packages/debian/distributions_finder.rb52
-rw-r--r--app/finders/packages/group_packages_finder.rb8
-rw-r--r--app/finders/packages/maven/package_finder.rb16
-rw-r--r--app/finders/packages/nuget/package_finder.rb35
-rw-r--r--app/finders/packages/packages_finder.rb8
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]