aboutsummaryrefslogtreecommitdiffstats
path: root/lib/action_text/attachable.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/action_text/attachable.rb')
-rw-r--r--lib/action_text/attachable.rb64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/action_text/attachable.rb b/lib/action_text/attachable.rb
new file mode 100644
index 0000000000..83a6cf0c17
--- /dev/null
+++ b/lib/action_text/attachable.rb
@@ -0,0 +1,64 @@
+module ActionText
+ module Attachable
+ extend ActiveSupport::Concern
+
+ LOCATOR_NAME = "attachable"
+
+ class << self
+ def from_node(node)
+ if attachable = attachable_from_sgid(node["sgid"])
+ attachable
+ elsif attachable = ActionText::Attachables::ContentAttachment.from_node(node)
+ attachable
+ elsif attachable = ActionText::Attachables::RemoteImage.from_node(node)
+ attachable
+ else
+ ActionText::Attachables::MissingAttachable
+ 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)
+ from_attachable_sgid(sgid)
+ rescue ActiveRecord::RecordNotFound
+ nil
+ end
+ end
+
+ class_methods do
+ def from_attachable_sgid(sgid)
+ ActionText::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_rich_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