summaryrefslogtreecommitdiff
path: root/app/services/packages/maven/metadata/sync_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/packages/maven/metadata/sync_service.rb')
-rw-r--r--app/services/packages/maven/metadata/sync_service.rb78
1 files changed, 78 insertions, 0 deletions
diff --git a/app/services/packages/maven/metadata/sync_service.rb b/app/services/packages/maven/metadata/sync_service.rb
new file mode 100644
index 00000000000..ab45e30c4f7
--- /dev/null
+++ b/app/services/packages/maven/metadata/sync_service.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+module Packages
+ module Maven
+ module Metadata
+ class SyncService < BaseContainerService
+ include Gitlab::Utils::StrongMemoize
+
+ alias_method :project, :container
+
+ MAX_FILE_SIZE = 10.megabytes.freeze
+
+ def execute
+ return error('Blank package name') unless package_name
+ return error('Not allowed') unless Ability.allowed?(current_user, :destroy_package, project)
+ return error('Non existing versionless package') unless versionless_package_for_versions
+ return error('Non existing metadata file for versions') unless metadata_package_file_for_versions
+
+ update_versions_xml
+ end
+
+ private
+
+ def update_versions_xml
+ return error('Metadata file for versions is too big') if metadata_package_file_for_versions.size > MAX_FILE_SIZE
+
+ metadata_package_file_for_versions.file.use_open_file do |file|
+ result = CreateVersionsXmlService.new(metadata_content: file, package: versionless_package_for_versions)
+ .execute
+
+ next result unless result.success?
+ next success('No changes for versions xml') unless result.payload[:changes_exist]
+
+ if result.payload[:empty_versions]
+ versionless_package_for_versions.destroy!
+ success('Versionless package for versions destroyed')
+ else
+ AppendPackageFileService.new(metadata_content: result.payload[:metadata_content], package: versionless_package_for_versions)
+ .execute
+ end
+ end
+ end
+
+ def metadata_package_file_for_versions
+ strong_memoize(:metadata_file_for_versions) do
+ versionless_package_for_versions.package_files
+ .with_file_name(Metadata.filename)
+ .recent
+ .first
+ end
+ end
+
+ def versionless_package_for_versions
+ strong_memoize(:versionless_package_for_versions) do
+ project.packages
+ .maven
+ .displayable
+ .with_name(package_name)
+ .with_version(nil)
+ .first
+ end
+ end
+
+ def package_name
+ params[:package_name]
+ end
+
+ def error(message)
+ ServiceResponse.error(message: message)
+ end
+
+ def success(message)
+ ServiceResponse.success(message: message)
+ end
+ end
+ end
+ end
+end