diff options
Diffstat (limited to 'app/services/packages/rubygems/dependency_resolver_service.rb')
-rw-r--r-- | app/services/packages/rubygems/dependency_resolver_service.rb | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/app/services/packages/rubygems/dependency_resolver_service.rb b/app/services/packages/rubygems/dependency_resolver_service.rb new file mode 100644 index 00000000000..c44b26e2b92 --- /dev/null +++ b/app/services/packages/rubygems/dependency_resolver_service.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Packages + module Rubygems + class DependencyResolverService < BaseService + include Gitlab::Utils::StrongMemoize + + DEFAULT_PLATFORM = 'ruby' + + def execute + return ServiceResponse.error(message: "forbidden", http_status: :forbidden) unless Ability.allowed?(current_user, :read_package, project) + return ServiceResponse.error(message: "#{gem_name} not found", http_status: :not_found) if packages.empty? + + payload = packages.map do |package| + dependencies = package.dependency_links.map do |link| + [link.dependency.name, link.dependency.version_pattern] + end + + { + name: gem_name, + number: package.version, + platform: DEFAULT_PLATFORM, + dependencies: dependencies + } + end + + ServiceResponse.success(payload: payload) + end + + private + + def packages + strong_memoize(:packages) do + project.packages.with_name(gem_name) + end + end + + def gem_name + params[:gem_name] + end + end + end +end |