80 lines
2.3 KiB
Ruby
80 lines
2.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Packages
|
|
module Debian
|
|
class UpdateDistributionService
|
|
def initialize(distribution, params)
|
|
@distribution, @params = distribution, params
|
|
|
|
@components = params.delete(:components)
|
|
|
|
@architectures = params.delete(:architectures)
|
|
@architectures += ['all'] unless @architectures.nil?
|
|
|
|
@errors = []
|
|
end
|
|
|
|
def execute
|
|
update_distribution
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :distribution, :params, :components, :architectures, :errors
|
|
|
|
def append_errors(record, prefix = '')
|
|
return if record.valid?
|
|
|
|
prefix = "#{prefix} " unless prefix.empty?
|
|
@errors += record.errors.full_messages.map { |message| "#{prefix}#{message}" }
|
|
end
|
|
|
|
def update_distribution
|
|
distribution.transaction do
|
|
if distribution.update(params)
|
|
update_components if components
|
|
update_architectures if architectures
|
|
|
|
success
|
|
else
|
|
append_errors(distribution)
|
|
error
|
|
end
|
|
end || error
|
|
end
|
|
|
|
def update_components
|
|
update_objects(distribution.components, components, error_label: 'Component')
|
|
end
|
|
|
|
def update_architectures
|
|
update_objects(distribution.architectures, architectures, error_label: 'Architecture')
|
|
end
|
|
|
|
def update_objects(objects, object_names_from_params, error_label: )
|
|
current_object_names = objects.map(&:name)
|
|
missing_object_names = object_names_from_params - current_object_names
|
|
extra_object_names = current_object_names - object_names_from_params
|
|
|
|
missing_object_names.each do |name|
|
|
new_object = objects.create(name: name)
|
|
append_errors(new_object, error_label)
|
|
raise ActiveRecord::Rollback unless new_object.persisted?
|
|
end
|
|
|
|
extra_object_names.each do |name|
|
|
object = objects.with_name(name).first
|
|
raise ActiveRecord::Rollback unless object.destroy
|
|
end
|
|
end
|
|
|
|
def success
|
|
ServiceResponse.success(payload: { distribution: distribution })
|
|
end
|
|
|
|
def error
|
|
ServiceResponse.error(message: errors.to_sentence, payload: { distribution: distribution })
|
|
end
|
|
end
|
|
end
|
|
end
|