scinote-web/app/models/tiny_mce_asset.rb

153 lines
4.6 KiB
Ruby
Raw Normal View History

2019-03-11 20:43:50 +08:00
# frozen_string_literal: true
2017-06-23 21:19:08 +08:00
class TinyMceAsset < ApplicationRecord
2017-04-21 22:09:04 +08:00
attr_accessor :reference
2017-06-28 21:21:32 +08:00
before_create :set_reference, optional: true
2019-03-20 21:40:18 +08:00
after_create :update_estimated_size, :self_destruct
2017-04-25 19:44:31 +08:00
after_destroy :release_team_space
2019-03-11 20:43:50 +08:00
after_save :update_description
2017-04-21 22:09:04 +08:00
2017-06-28 21:21:32 +08:00
belongs_to :team, inverse_of: :tiny_mce_assets, optional: true
belongs_to :step, inverse_of: :tiny_mce_assets, touch: true, optional: true
belongs_to :result_text,
inverse_of: :tiny_mce_assets,
touch: true,
optional: true
2019-03-11 20:43:50 +08:00
2019-03-20 21:40:18 +08:00
belongs_to :object, polymorphic: true,
optional: true,
inverse_of: :tiny_mce_assets
2017-04-21 22:09:04 +08:00
has_attached_file :image,
2017-04-24 22:22:25 +08:00
styles: { large: [Constants::LARGE_PIC_FORMAT, :jpg] },
convert_options: { large: '-quality 100 -strip' }
2017-04-21 22:09:04 +08:00
validates_attachment_content_type :image,
content_type: %r{^image/#{ Regexp.union(
Constants::WHITELISTED_IMAGE_TYPES
) }}
2017-04-24 22:22:25 +08:00
validates_attachment :image,
presence: true,
size: {
2019-03-20 21:40:18 +08:00
less_than: Rails.configuration.x\
.file_max_size_mb.megabytes
2017-04-24 22:22:25 +08:00
}
validates :estimated_size, presence: true
2019-03-11 20:43:50 +08:00
def self.update_images(object, images)
images = JSON.parse(images)
current_images = object.tiny_mce_assets.pluck(:id)
2019-03-20 21:40:18 +08:00
images_to_delete = current_images.reject do |x|
(images.include? Base62.encode(x))
end
2019-03-11 20:43:50 +08:00
images.each do |image|
image_to_update = find_by_id(Base62.decode(image))
image_to_update&.update(object: object, saved: true)
end
where(id: images_to_delete).destroy_all
2019-03-20 21:40:18 +08:00
rescue StandardError => e
Rails.logger.error e.message
2019-03-11 20:43:50 +08:00
end
def self.reload_images(images = [])
images.each do |image|
old_id = image.class == Array ? image[0] : image
new_id = image.class == Array ? image[1] : image
image_to_update = find_by_id(new_id)
next unless image_to_update
object_field = data_fields[image_to_update.object_type]
next unless image_to_update.object
old_description = Nokogiri::HTML(image_to_update.object[object_field])
2019-03-20 21:40:18 +08:00
descirption_image = old_description.css(
"img[data-token=\"#{Base62.encode(old_id)}\"]"
)
2019-03-11 20:43:50 +08:00
descirption_image.attr('src').value = image_to_update.url
descirption_image.attr('data-token').value = Base62.encode(new_id)
descirption_image[0]['class'] = 'img-responsive'
new_descirption = old_description.css('body').inner_html.to_s
image_to_update.object.update(object_field => new_descirption)
end
end
2017-04-24 22:22:25 +08:00
def presigned_url(style = :large,
2017-04-21 22:09:04 +08:00
download: false,
timeout: Constants::URL_LONG_EXPIRE_TIME)
2017-04-21 22:09:04 +08:00
if stored_on_s3?
2019-03-11 20:43:50 +08:00
download_arg = if download
2019-03-20 21:40:18 +08:00
'attachment; filename=' + CGI.escape(image_file_name)
2019-03-11 20:43:50 +08:00
end
2017-04-21 22:09:04 +08:00
signer = Aws::S3::Presigner.new(client: S3_BUCKET.client)
signer.presigned_url(:get_object,
bucket: S3_BUCKET.name,
key: image.path(style)[1..-1],
expires_in: timeout,
response_content_disposition: download_arg)
end
end
def stored_on_s3?
image.options[:storage].to_sym == :s3
end
def url(style = :large, timeout: Constants::URL_LONG_EXPIRE_TIME)
2017-04-21 22:09:04 +08:00
if image.is_stored_on_s3?
presigned_url(style, timeout: timeout)
else
image.url(style)
end
end
def open
if image.is_stored_on_s3?
Kernel.open(presigned_url, 'rb')
else
2017-11-24 22:19:58 +08:00
File.open(image.path, 'rb')
end
end
2019-03-20 21:40:18 +08:00
def self.delete_unsaved_image(id)
asset = find_by_id(id)
asset.destroy if asset && !asset.saved
end
def self.data_fields
{
'Step' => :description,
'ResultText' => :text
}
2019-03-11 20:43:50 +08:00
end
private
2019-03-11 20:43:50 +08:00
def update_description
TinyMceAsset.reload_images([id]) if object
end
2019-03-20 21:40:18 +08:00
def self_destruct
delay(queue: :assets, run_at: 1.days.from_now).delete_unsaved_image(id)
2019-03-11 20:43:50 +08:00
end
def update_estimated_size
return if image_file_size.blank?
2019-03-11 20:43:50 +08:00
es = image_file_size * Constants::ASSET_ESTIMATED_SIZE_FACTOR
update(estimated_size: es)
Rails.logger.info "Asset #{id}: Estimated size successfully calculated"
2017-04-25 19:44:31 +08:00
# update team space taken
2019-03-11 20:43:50 +08:00
team.take_space(es)
team.save
2017-04-25 19:44:31 +08:00
end
def release_team_space
2019-03-11 20:43:50 +08:00
team.release_space(estimated_size)
team.save
end
2017-04-21 22:09:04 +08:00
def set_reference
obj_type = "#{@reference.class.to_s.underscore}=".to_sym
2017-04-24 22:22:25 +08:00
public_send(obj_type, @reference) if @reference
2017-04-21 22:09:04 +08:00
end
end