diff options
author | George Claghorn <george.claghorn@gmail.com> | 2019-01-04 23:09:12 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-04 23:09:12 -0500 |
commit | df8ee09ce71338cdf9816225df1bdebc707f3560 (patch) | |
tree | 5b2d265cdaca5c5859205389088b2bdc2327d935 /actiontext/lib/action_text/attachable.rb | |
parent | 88349cee3cb8f7bba662232fbc444eeebc8bb227 (diff) | |
parent | 0decd2ddc4a94cf522fc8ea8e6c73b9deedfdd93 (diff) | |
download | rails-df8ee09ce71338cdf9816225df1bdebc707f3560.tar.gz rails-df8ee09ce71338cdf9816225df1bdebc707f3560.tar.bz2 rails-df8ee09ce71338cdf9816225df1bdebc707f3560.zip |
Merge pull request #34873 from georgeclaghorn/actiontext
Import Action Text
Diffstat (limited to 'actiontext/lib/action_text/attachable.rb')
-rw-r--r-- | actiontext/lib/action_text/attachable.rb | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/actiontext/lib/action_text/attachable.rb b/actiontext/lib/action_text/attachable.rb new file mode 100644 index 0000000000..38cd24aa8d --- /dev/null +++ b/actiontext/lib/action_text/attachable.rb @@ -0,0 +1,82 @@ +# frozen_string_literal: true + +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 || 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 attachable_filename + filename.to_s if respond_to?(:filename) + end + + def attachable_filesize + try(:byte_size) || try(:filesize) + end + + def attachable_metadata + try(:metadata) || {} + 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 |attrs| + attrs[:sgid] = attachable_sgid + attrs[:content_type] = attachable_content_type + attrs[:previewable] = true if previewable_attachable? + attrs[:filename] = attachable_filename + attrs[:filesize] = attachable_filesize + attrs[:width] = attachable_metadata[:width] + attrs[:height] = attachable_metadata[:height] + end.compact + end + end +end |