# 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