mirror of https://github.com/docusealco/docuseal
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.
70 lines
2.7 KiB
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
|