# frozen_string_literal: true module Templates module SerializeForApi SERIALIZE_PARAMS = { only: %w[ id archived_at fields name preferences schema slug source submitters created_at updated_at author_id external_id folder_id ], methods: %i[application_key folder_name], include: { author: { only: %i[id email first_name last_name] } } }.freeze module_function def call(template, schema_documents = template.schema_documents.preload(:blob), preview_image_attachments = nil) json = template.as_json(SERIALIZE_PARAMS) preview_image_attachments ||= ActiveStorage::Attachment.joins(:blob) .where(blob: { filename: ['0.jpg', '0.png'] }) .where(record_id: schema_documents.map(&:id), record_type: 'ActiveStorage::Attachment', name: :preview_images) .preload(:blob) json[:documents] = template.schema.filter_map do |item| attachment = schema_documents.find { |e| e.uuid == item['attachment_uuid'] } unless attachment Rollbar.error("Documents missing: #{template.id}") if defined?(Rollbar) next end first_page_blob = preview_image_attachments.find { |e| e.record_id == attachment.id }&.blob first_page_blob ||= attachment.preview_images.joins(:blob).find_by(blob: { filename: ['0.jpg', '0.png'] })&.blob { id: attachment.id, uuid: attachment.uuid, url: ActiveStorage::Blob.proxy_url(attachment.blob), preview_image_url: first_page_blob && ActiveStorage::Blob.proxy_url(first_page_blob), filename: attachment.filename } end json end end end