summaryrefslogtreecommitdiff
path: root/app/finders/packages
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-07-20 12:26:25 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-07-20 12:26:25 +0000
commita09983ae35713f5a2bbb100981116d31ce99826e (patch)
tree2ee2af7bd104d57086db360a7e6d8c9d5d43667a /app/finders/packages
parent18c5ab32b738c0b6ecb4d0df3994000482f34bd8 (diff)
downloadgitlab-ce-a09983ae35713f5a2bbb100981116d31ce99826e.tar.gz
Add latest changes from gitlab-org/gitlab@13-2-stable-ee
Diffstat (limited to 'app/finders/packages')
-rw-r--r--app/finders/packages/composer/packages_finder.rb16
-rw-r--r--app/finders/packages/conan/package_file_finder.rb28
-rw-r--r--app/finders/packages/conan/package_finder.rb32
-rw-r--r--app/finders/packages/go/module_finder.rb29
-rw-r--r--app/finders/packages/go/version_finder.rb44
-rw-r--r--app/finders/packages/group_packages_finder.rb70
-rw-r--r--app/finders/packages/maven/package_finder.rb62
-rw-r--r--app/finders/packages/npm/package_finder.rb29
-rw-r--r--app/finders/packages/nuget/package_finder.rb31
-rw-r--r--app/finders/packages/package_file_finder.rb36
-rw-r--r--app/finders/packages/package_finder.rb16
-rw-r--r--app/finders/packages/packages_finder.rb41
-rw-r--r--app/finders/packages/tags_finder.rb26
13 files changed, 460 insertions, 0 deletions
diff --git a/app/finders/packages/composer/packages_finder.rb b/app/finders/packages/composer/packages_finder.rb
new file mode 100644
index 00000000000..e63b2ee03fa
--- /dev/null
+++ b/app/finders/packages/composer/packages_finder.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+module Packages
+ module Composer
+ class PackagesFinder < Packages::GroupPackagesFinder
+ def initialize(current_user, group, params = {})
+ @current_user = current_user
+ @group = group
+ @params = params
+ end
+
+ def execute
+ packages_for_group_projects.composer.preload_composer
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/conan/package_file_finder.rb b/app/finders/packages/conan/package_file_finder.rb
new file mode 100644
index 00000000000..edf35388a36
--- /dev/null
+++ b/app/finders/packages/conan/package_file_finder.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Packages
+ module Conan
+ class PackageFileFinder < ::Packages::PackageFileFinder
+ private
+
+ def package_files
+ files = super
+ files = by_conan_file_type(files)
+ files = by_conan_package_reference(files)
+ files
+ end
+
+ def by_conan_file_type(files)
+ return files unless params[:conan_file_type]
+
+ files.with_conan_file_type(params[:conan_file_type])
+ end
+
+ def by_conan_package_reference(files)
+ return files unless params[:conan_package_reference]
+
+ files.with_conan_package_reference(params[:conan_package_reference])
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/conan/package_finder.rb b/app/finders/packages/conan/package_finder.rb
new file mode 100644
index 00000000000..26e9182f4e1
--- /dev/null
+++ b/app/finders/packages/conan/package_finder.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Packages
+ module Conan
+ class PackageFinder
+ attr_reader :current_user, :query
+
+ def initialize(current_user, params)
+ @current_user = current_user
+ @query = params[:query]
+ end
+
+ def execute
+ packages_for_current_user.with_name_like(query).order_name_asc if query
+ end
+
+ private
+
+ def packages
+ Packages::Package.conan
+ end
+
+ def packages_for_current_user
+ packages.for_projects(projects_visible_to_current_user)
+ end
+
+ def projects_visible_to_current_user
+ ::Project.public_or_visible_to_user(current_user)
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/go/module_finder.rb b/app/finders/packages/go/module_finder.rb
new file mode 100644
index 00000000000..ed8bd5599d9
--- /dev/null
+++ b/app/finders/packages/go/module_finder.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Packages
+ module Go
+ class ModuleFinder
+ include Gitlab::Golang
+
+ attr_reader :project, :module_name
+
+ def initialize(project, module_name)
+ module_name = Pathname.new(module_name).cleanpath.to_s
+
+ @project = project
+ @module_name = module_name
+ end
+
+ def execute
+ return if @module_name.blank? || !@module_name.start_with?(local_module_prefix)
+
+ module_path = @module_name[local_module_prefix.length..].split('/')
+ project_path = project.full_path.split('/')
+ module_project_path = module_path.shift(project_path.length)
+ return unless module_project_path == project_path
+
+ Packages::Go::Module.new(@project, @module_name, module_path.join('/'))
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/go/version_finder.rb b/app/finders/packages/go/version_finder.rb
new file mode 100644
index 00000000000..8e2fab8ba35
--- /dev/null
+++ b/app/finders/packages/go/version_finder.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Packages
+ module Go
+ class VersionFinder
+ include Gitlab::Golang
+
+ attr_reader :mod
+
+ def initialize(mod)
+ @mod = mod
+ end
+
+ def execute
+ @mod.project.repository.tags
+ .filter { |tag| semver_tag? tag }
+ .map { |tag| @mod.version_by(ref: tag) }
+ .filter { |ver| ver.valid? }
+ end
+
+ def find(target)
+ case target
+ when String
+ if pseudo_version? target
+ semver = parse_semver(target)
+ commit = pseudo_version_commit(@mod.project, semver)
+ Packages::Go::ModuleVersion.new(@mod, :pseudo, commit, name: target, semver: semver)
+ else
+ @mod.version_by(ref: target)
+ end
+
+ when Gitlab::Git::Ref
+ @mod.version_by(ref: target)
+
+ when ::Commit, Gitlab::Git::Commit
+ @mod.version_by(commit: target)
+
+ else
+ raise ArgumentError.new 'not a valid target'
+ end
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/group_packages_finder.rb b/app/finders/packages/group_packages_finder.rb
new file mode 100644
index 00000000000..ffc8c35fbcc
--- /dev/null
+++ b/app/finders/packages/group_packages_finder.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+module Packages
+ class GroupPackagesFinder
+ attr_reader :current_user, :group, :params
+
+ InvalidPackageTypeError = Class.new(StandardError)
+
+ def initialize(current_user, group, params = { exclude_subgroups: false, order_by: 'created_at', sort: 'asc' })
+ @current_user = current_user
+ @group = group
+ @params = params
+ end
+
+ def execute
+ return ::Packages::Package.none unless group
+
+ packages_for_group_projects
+ end
+
+ private
+
+ def packages_for_group_projects
+ packages = ::Packages::Package
+ .for_projects(group_projects_visible_to_current_user)
+ .processed
+ .has_version
+ .sort_by_attribute("#{params[:order_by]}_#{params[:sort]}")
+
+ packages = filter_by_package_type(packages)
+ packages = filter_by_package_name(packages)
+ packages
+ end
+
+ def group_projects_visible_to_current_user
+ ::Project
+ .in_namespace(groups)
+ .public_or_visible_to_user(current_user, Gitlab::Access::REPORTER)
+ .with_project_feature
+ .select { |project| Ability.allowed?(current_user, :read_package, project) }
+ end
+
+ def package_type
+ params[:package_type].presence
+ end
+
+ def groups
+ return [group] if exclude_subgroups?
+
+ group.self_and_descendants
+ end
+
+ def exclude_subgroups?
+ params[:exclude_subgroups]
+ end
+
+ def filter_by_package_type(packages)
+ return packages unless package_type
+ raise InvalidPackageTypeError unless Package.package_types.key?(package_type)
+
+ packages.with_package_type(package_type)
+ end
+
+ def filter_by_package_name(packages)
+ return packages unless params[:package_name].present?
+
+ packages.search_by_name(params[:package_name])
+ end
+ end
+end
diff --git a/app/finders/packages/maven/package_finder.rb b/app/finders/packages/maven/package_finder.rb
new file mode 100644
index 00000000000..775db12adb7
--- /dev/null
+++ b/app/finders/packages/maven/package_finder.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+module Packages
+ module Maven
+ class PackageFinder
+ attr_reader :path, :current_user, :project, :group
+
+ def initialize(path, current_user, project: nil, group: nil)
+ @path = path
+ @current_user = current_user
+ @project = project
+ @group = group
+ end
+
+ def execute
+ packages_with_path.last
+ end
+
+ def execute!
+ packages_with_path.last!
+ end
+
+ private
+
+ def base
+ if project
+ packages_for_a_single_project
+ elsif group
+ packages_for_multiple_projects
+ else
+ packages
+ end
+ end
+
+ def packages_with_path
+ base.only_maven_packages_with_path(path)
+ end
+
+ # Produces a query that returns all packages.
+ def packages
+ ::Packages::Package.all
+ end
+
+ # Produces a query that retrieves packages from a single project.
+ def packages_for_a_single_project
+ project.packages
+ end
+
+ # Produces a query that retrieves packages from multiple projects that
+ # the current user can view within a group.
+ def packages_for_multiple_projects
+ ::Packages::Package.for_projects(projects_visible_to_current_user)
+ end
+
+ # Returns the projects that the current user can view within a group.
+ def projects_visible_to_current_user
+ ::Project
+ .in_namespace(group.self_and_descendants.select(:id))
+ .public_or_visible_to_user(current_user)
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/npm/package_finder.rb b/app/finders/packages/npm/package_finder.rb
new file mode 100644
index 00000000000..8599fd07e7f
--- /dev/null
+++ b/app/finders/packages/npm/package_finder.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+module Packages
+ module Npm
+ class PackageFinder
+ attr_reader :project, :package_name
+
+ delegate :find_by_version, to: :execute
+
+ def initialize(project, package_name)
+ @project = project
+ @package_name = package_name
+ end
+
+ def execute
+ packages
+ end
+
+ private
+
+ def packages
+ project.packages
+ .npm
+ .with_name(package_name)
+ .last_of_each_version
+ .preload_files
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/nuget/package_finder.rb b/app/finders/packages/nuget/package_finder.rb
new file mode 100644
index 00000000000..e6fb6712d47
--- /dev/null
+++ b/app/finders/packages/nuget/package_finder.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+module Packages
+ module Nuget
+ class PackageFinder
+ MAX_PACKAGES_COUNT = 50
+
+ def initialize(project, package_name:, package_version: nil, limit: MAX_PACKAGES_COUNT)
+ @project = project
+ @package_name = package_name
+ @package_version = package_version
+ @limit = limit
+ end
+
+ def execute
+ packages.limit_recent(@limit)
+ end
+
+ private
+
+ def packages
+ result = @project.packages
+ .nuget
+ .has_version
+ .processed
+ .with_name_like(@package_name)
+ result = result.with_version(@package_version) if @package_version.present?
+ result
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/package_file_finder.rb b/app/finders/packages/package_file_finder.rb
new file mode 100644
index 00000000000..d015f4adfa6
--- /dev/null
+++ b/app/finders/packages/package_file_finder.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+class Packages::PackageFileFinder
+ attr_reader :package, :file_name, :params
+
+ def initialize(package, file_name, params = {})
+ @package = package
+ @file_name = file_name
+ @params = params
+ end
+
+ def execute
+ package_files.last
+ end
+
+ def execute!
+ package_files.last!
+ end
+
+ private
+
+ def package_files
+ files = package.package_files
+
+ files = by_file_name(files)
+
+ files
+ end
+
+ def by_file_name(files)
+ if params[:with_file_name_like]
+ files.with_file_name_like(file_name)
+ else
+ files.with_file_name(file_name)
+ end
+ end
+end
diff --git a/app/finders/packages/package_finder.rb b/app/finders/packages/package_finder.rb
new file mode 100644
index 00000000000..0e911491da2
--- /dev/null
+++ b/app/finders/packages/package_finder.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+module Packages
+ class PackageFinder
+ def initialize(project, package_id)
+ @project = project
+ @package_id = package_id
+ end
+
+ def execute
+ @project
+ .packages
+ .processed
+ .find(@package_id)
+ end
+ end
+end
diff --git a/app/finders/packages/packages_finder.rb b/app/finders/packages/packages_finder.rb
new file mode 100644
index 00000000000..c533cb266a2
--- /dev/null
+++ b/app/finders/packages/packages_finder.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Packages
+ class PackagesFinder
+ attr_reader :params, :project
+
+ def initialize(project, params = {})
+ @project = project
+ @params = params
+
+ params[:order_by] ||= 'created_at'
+ params[:sort] ||= 'asc'
+ end
+
+ def execute
+ packages = project.packages.processed.has_version
+ packages = filter_by_package_type(packages)
+ packages = filter_by_package_name(packages)
+ packages = order_packages(packages)
+ packages
+ end
+
+ private
+
+ def filter_by_package_type(packages)
+ return packages unless params[:package_type]
+
+ packages.with_package_type(params[:package_type])
+ end
+
+ def filter_by_package_name(packages)
+ return packages unless params[:package_name]
+
+ packages.search_by_name(params[:package_name])
+ end
+
+ def order_packages(packages)
+ packages.sort_by_attribute("#{params[:order_by]}_#{params[:sort]}")
+ end
+ end
+end
diff --git a/app/finders/packages/tags_finder.rb b/app/finders/packages/tags_finder.rb
new file mode 100644
index 00000000000..020b3d8072a
--- /dev/null
+++ b/app/finders/packages/tags_finder.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+class Packages::TagsFinder
+ attr_reader :project, :package_name, :params
+
+ delegate :find_by_name, to: :execute
+
+ def initialize(project, package_name, params = {})
+ @project = project
+ @package_name = package_name
+ @params = params
+ end
+
+ def execute
+ packages = project.packages
+ .with_name(package_name)
+ packages = packages.with_package_type(package_type) if package_type.present?
+
+ Packages::Tag.for_packages(packages)
+ end
+
+ private
+
+ def package_type
+ params[:package_type]
+ end
+end