aboutsummaryrefslogtreecommitdiffstats
path: root/lib/active_text/attachable.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/active_text/attachable.rb')
-rw-r--r--lib/active_text/attachable.rb42
1 files changed, 41 insertions, 1 deletions
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