From b79bf62196f1032d4a6f95799ced79cbbadad856 Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Mon, 12 Feb 2018 18:21:49 -0500 Subject: [PATCH] Add sgid support --- app/javascript/activetext/index.js | 7 ++--- lib/active_text/attachable.rb | 42 +++++++++++++++++++++++++++++- lib/active_text/engine.rb | 12 +++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/app/javascript/activetext/index.js b/app/javascript/activetext/index.js index 03cb9960cb..cdcd1d311f 100644 --- a/app/javascript/activetext/index.js +++ b/app/javascript/activetext/index.js @@ -25,9 +25,10 @@ addEventListener("trix-attachment-add", event => { console.warn("Failed to store file for attachment", attachment, error) } else { console.log("Created blob for attachment", attributes, attachment) - const { signed_id } = attributes - const url = `${blobsURL}/${signed_id}/${encodeURIComponent(attachment.file.name)}` - attachment.setAttributes({ url, signed_id }) + attachment.setAttributes({ + url: `${blobsURL}/${attributes.signed_id}/${encodeURIComponent(attachment.file.name)}`, + sgid: attributes.attachable_sgid + }) } }) }) diff --git a/lib/active_text/attachable.rb b/lib/active_text/attachable.rb index 445ee30605..3a6648331e 100644 --- a/lib/active_text/attachable.rb +++ b/lib/active_text/attachable.rb @@ -1,5 +1,9 @@ module ActiveText module Attachable + extend ActiveSupport::Concern + + LOCATOR_NAME = "attachable" + class << self def from_node(node) if attachable = attachable_from_sgid(node["sgid"]) @@ -13,12 +17,48 @@ module ActiveText end end + def from_attachable_sgid(sgid, options = {}) + method = sgid.is_a?(Array) ? :locate_many_signed : :locate_signed + record = GlobalID::Locator.public_send(method, sgid, options.merge(for: LOCATOR_NAME)) + record or raise ActiveRecord::RecordNotFound + end + private def attachable_from_sgid(sgid) - ::Attachable.from_attachable_sgid(sgid) + from_attachable_sgid(sgid) rescue ActiveRecord::RecordNotFound nil end end + + class_methods do + def from_attachable_sgid(sgid) + ActiveText::Attachable.from_attachable_sgid(sgid, only: self) + end + end + + def attachable_sgid + to_sgid(expires_in: nil, for: LOCATOR_NAME).to_s + end + + def attachable_content_type + try(:content_type) || "application/octet-stream" + end + + def previewable_attachable? + false + end + + def as_json(*) + super.merge(attachable_sgid: attachable_sgid) + end + + def to_active_text_attributes(attributes = {}) + attributes.dup.tap do |attributes| + attributes[:sgid] = attachable_sgid + attributes[:content_type] = attachable_content_type + attributes[:previewable] = true if previewable_attachable? + end + end end end diff --git a/lib/active_text/engine.rb b/lib/active_text/engine.rb index 5b16acab04..9a1d08e1ad 100644 --- a/lib/active_text/engine.rb +++ b/lib/active_text/engine.rb @@ -11,6 +11,18 @@ module ActiveText end end + initializer "active_text.active_storage_extension" do + require "active_storage/blob" + + class ActiveStorage::Blob + include ActiveText::Attachable + + def previewable_attachable? + representable? + end + end + end + # FIXME: Aren't helpers supposed to load automatically? # https://github.com/rails/rails/issues/26627 ? initializer "active_text.helper" do