summaryrefslogtreecommitdiff
path: root/app/services/packages/maven/metadata/append_package_file_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/packages/maven/metadata/append_package_file_service.rb')
-rw-r--r--app/services/packages/maven/metadata/append_package_file_service.rb88
1 files changed, 88 insertions, 0 deletions
diff --git a/app/services/packages/maven/metadata/append_package_file_service.rb b/app/services/packages/maven/metadata/append_package_file_service.rb
new file mode 100644
index 00000000000..e991576ebc6
--- /dev/null
+++ b/app/services/packages/maven/metadata/append_package_file_service.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+module Packages
+ module Maven
+ module Metadata
+ class AppendPackageFileService
+ XML_CONTENT_TYPE = 'application/xml'
+ DEFAULT_CONTENT_TYPE = 'application/octet-stream'
+
+ MD5_FILE_NAME = "#{Metadata.filename}.md5"
+ SHA1_FILE_NAME = "#{Metadata.filename}.sha1"
+ SHA256_FILE_NAME = "#{Metadata.filename}.sha256"
+ SHA512_FILE_NAME = "#{Metadata.filename}.sha512"
+
+ def initialize(package:, metadata_content:)
+ @package = package
+ @metadata_content = metadata_content
+ end
+
+ def execute
+ return ServiceResponse.error(message: 'package is not set') unless @package
+ return ServiceResponse.error(message: 'metadata content is not set') unless @metadata_content
+
+ file_md5 = digest_from(@metadata_content, :md5)
+ file_sha1 = digest_from(@metadata_content, :sha1)
+ file_sha256 = digest_from(@metadata_content, :sha256)
+ file_sha512 = digest_from(@metadata_content, :sha512)
+
+ @package.transaction do
+ append_metadata_file(
+ content: @metadata_content,
+ file_name: Metadata.filename,
+ content_type: XML_CONTENT_TYPE,
+ sha1: file_sha1,
+ md5: file_md5,
+ sha256: file_sha256
+ )
+
+ append_metadata_file(content: file_md5, file_name: MD5_FILE_NAME)
+ append_metadata_file(content: file_sha1, file_name: SHA1_FILE_NAME)
+ append_metadata_file(content: file_sha256, file_name: SHA256_FILE_NAME)
+ append_metadata_file(content: file_sha512, file_name: SHA512_FILE_NAME)
+ end
+
+ ServiceResponse.success(message: 'New metadata package file created')
+ end
+
+ private
+
+ def append_metadata_file(content:, file_name:, content_type: DEFAULT_CONTENT_TYPE, sha1: nil, md5: nil, sha256: nil)
+ file_md5 = md5 || digest_from(content, :md5)
+ file_sha1 = sha1 || digest_from(content, :sha1)
+ file_sha256 = sha256 || digest_from(content, :sha256)
+
+ file = CarrierWaveStringFile.new_file(
+ file_content: content,
+ filename: file_name,
+ content_type: content_type
+ )
+
+ ::Packages::CreatePackageFileService.new(
+ @package,
+ file: file,
+ size: file.size,
+ file_name: file_name,
+ file_sha1: file_sha1,
+ file_md5: file_md5,
+ file_sha256: file_sha256
+ ).execute
+ end
+
+ def digest_from(content, type)
+ digest_class = case type
+ when :md5
+ Digest::MD5
+ when :sha1
+ Digest::SHA1
+ when :sha256
+ Digest::SHA256
+ when :sha512
+ Digest::SHA512
+ end
+ digest_class.hexdigest(content)
+ end
+ end
+ end
+ end
+end