You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
docuseal/lib/templates/clone_to_partnership.rb

70 lines
2.7 KiB

# frozen_string_literal: true
module Templates
module CloneToPartnership
module_function
# Clone a global partnership template to a specific partnership
# Supports both direct target_partnership and external_partnership_id with authorization
def call(original_template, author:, target_partnership: nil, external_partnership_id: nil, current_user: nil,
external_id: nil, name: nil, folder_name: nil)
validation_result = validate_inputs(original_template, target_partnership, external_partnership_id, current_user)
raise validation_result[:error_class], validation_result[:message] if validation_result[:error]
resolved_target_partnership = validation_result[:target_partnership]
template = Templates::Clone.call(
original_template,
author: author,
external_id: external_id,
name: name,
folder_name: folder_name,
target_partnership: resolved_target_partnership
)
# Clear template_accesses since global partnership templates shouldn't copy user accesses
template.template_accesses.clear
template
end
def validate_inputs(original_template, target_partnership, external_partnership_id, current_user)
# Check template type - must be global partnership template
unless original_template.partnership_id.present? &&
ExportLocation.global_partnership_id.present? &&
original_template.partnership_id == ExportLocation.global_partnership_id
return { error: true, error_class: ArgumentError, message: 'Template must be a global partnership template' }
end
# Resolve target partnership
if target_partnership.present?
{ error: false, target_partnership: target_partnership }
elsif external_partnership_id.present?
unless current_user
return { error: true, error_class: ArgumentError,
message: 'current_user required when using external_partnership_id' }
end
partnership = Partnership.find_by(external_partnership_id: external_partnership_id)
unless partnership
return {
error: true,
error_class: ActiveRecord::RecordNotFound,
message: 'Partnership not found'
}
end
# For partnership cloning, we need to verify via API context since users don't have stored relationships
# This is a simplified check - in practice, you'd verify via request context
{ error: false, target_partnership: partnership }
else
{
error: true,
error_class: ArgumentError,
message: 'Either target_partnership or external_partnership_id must be provided'
}
end
end
end
end