debian-mirror-gitlab/app/services/packages/npm/create_package_service.rb
2020-08-09 17:44:08 +05:30

92 lines
2.1 KiB
Ruby

# frozen_string_literal: true
module Packages
module Npm
class CreatePackageService < BaseService
include Gitlab::Utils::StrongMemoize
def execute
return error('Version is empty.', 400) if version.blank?
return error('Package already exists.', 403) if current_package_exists?
ActiveRecord::Base.transaction { create_package! }
end
private
def create_package!
package = project.packages.create!(
name: name,
version: version,
package_type: 'npm'
)
if build.present?
package.create_build_info!(pipeline: build.pipeline)
end
::Packages::CreatePackageFileService.new(package, file_params).execute
::Packages::CreateDependencyService.new(package, package_dependencies).execute
::Packages::Npm::CreateTagService.new(package, dist_tag).execute
package
end
def current_package_exists?
project.packages
.npm
.with_name(name)
.with_version(version)
.exists?
end
def name
params[:name]
end
def version
strong_memoize(:version) do
params[:versions].each_key.first
end
end
def version_data
params[:versions][version]
end
def build
params[:build]
end
def dist_tag
params['dist-tags'].each_key.first
end
def package_file_name
strong_memoize(:package_file_name) do
"#{name}-#{version}.tgz"
end
end
def attachment
strong_memoize(:attachment) do
params['_attachments'][package_file_name]
end
end
def file_params
{
file: CarrierWaveStringFile.new(Base64.decode64(attachment['data'])),
size: attachment['length'],
file_sha1: version_data[:dist][:shasum],
file_name: package_file_name
}
end
def package_dependencies
_version, versions_data = params[:versions].first
versions_data
end
end
end
end