diff --git a/app/controllers/api/templates_clone_controller.rb b/app/controllers/api/templates_clone_controller.rb index 2c040782..52c0c30b 100644 --- a/app/controllers/api/templates_clone_controller.rb +++ b/app/controllers/api/templates_clone_controller.rb @@ -7,6 +7,11 @@ module Api def create authorize!(:manage, @template) + ActiveRecord::Associations::Preloader.new( + records: [@template], + associations: [schema_documents: :preview_images_attachments] + ).call + cloned_template = Templates::Clone.call( @template, author: current_user, @@ -18,11 +23,11 @@ module Api cloned_template.source = :api cloned_template.save! - Templates::CloneAttachments.call(template: cloned_template, original_template: @template) + schema_documents = Templates::CloneAttachments.call(template: cloned_template, original_template: @template) SendTemplateCreatedWebhookRequestJob.perform_async('template_id' => cloned_template.id) - render json: Templates::SerializeForApi.call(cloned_template) + render json: Templates::SerializeForApi.call(cloned_template, schema_documents) end end end diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb index ef91a005..0d45f22a 100644 --- a/app/controllers/templates_controller.rb +++ b/app/controllers/templates_controller.rb @@ -27,7 +27,7 @@ class TemplatesController < ApplicationController def edit ActiveRecord::Associations::Preloader.new( records: [@template], - associations: [schema_documents: { preview_images_attachments: :blob }] + associations: [schema_documents: [:blob, { preview_images_attachments: :blob }]] ).call @template_data = @@ -43,6 +43,11 @@ class TemplatesController < ApplicationController def create if @base_template + ActiveRecord::Associations::Preloader.new( + records: [@base_template], + associations: [schema_documents: :preview_images_attachments] + ).call + @template = Templates::Clone.call(@base_template, author: current_user, name: params.dig(:template, :name), folder_name: params[:folder_name]) diff --git a/lib/templates/clone.rb b/lib/templates/clone.rb index ba8ca2c6..b8bd253f 100644 --- a/lib/templates/clone.rb +++ b/lib/templates/clone.rb @@ -4,7 +4,6 @@ module Templates module Clone module_function - # rubocop:disable Metrics def call(original_template, author:, external_id: nil, name: nil, folder_name: nil) template = original_template.account.templates.new @@ -17,6 +16,12 @@ module Templates template.folder = TemplateFolders.find_or_create_by_name(author, folder_name) if folder_name.present? + template.submitters, template.fields = clone_submitters_and_fields(original_template) + + template + end + + def clone_submitters_and_fields(original_template) submitter_uuids_replacements = {} field_uuids_replacements = {} @@ -52,10 +57,7 @@ module Templates end end - template.assign_attributes(fields: cloned_fields, submitters: cloned_submitters) - - template + [cloned_submitters, cloned_fields] end - # rubocop:enable Metrics end end diff --git a/lib/templates/clone_attachments.rb b/lib/templates/clone_attachments.rb index efe060d5..970214b3 100644 --- a/lib/templates/clone_attachments.rb +++ b/lib/templates/clone_attachments.rb @@ -7,8 +7,8 @@ module Templates def call(template:, original_template:) schema_uuids_replacements = {} - cloned_schema = original_template['schema'].deep_dup - cloned_fields = template['fields'].deep_dup + cloned_schema = original_template.schema.deep_dup + cloned_fields = template.fields.deep_dup cloned_schema.each do |schema_item| new_schema_item_uuid = SecureRandom.uuid @@ -27,26 +27,25 @@ module Templates template.update!(schema: cloned_schema, fields: cloned_fields) - original_template.schema_documents.preload(:preview_images_attachments).each do |document| - new_document = ActiveStorage::Attachment.create!( - uuid: schema_uuids_replacements[document.uuid], - blob_id: document.blob_id, - name: 'documents', - record: template - ) + original_template.schema_documents.map do |document| + new_document = + ApplicationRecord.no_touching do + template.documents_attachments.create!( + uuid: schema_uuids_replacements[document.uuid], + blob_id: document.blob_id + ) + end clone_document_preview_images_attachments(document:, new_document:) + + new_document end end def clone_document_preview_images_attachments(document:, new_document:) ApplicationRecord.no_touching do document.preview_images_attachments.each do |preview_image| - ActiveStorage::Attachment.create!( - blob_id: preview_image.blob_id, - name: 'preview_images', - record: new_document - ) + new_document.preview_images_attachments.create!(blob_id: preview_image.blob_id) end end end