scinote-web/app/models/tiny_mce_asset.rb

87 lines
2.7 KiB
Ruby

class TinyMceAsset < ApplicationRecord
attr_accessor :reference
before_create :set_reference, optional: true
after_create :update_estimated_size
after_destroy :release_team_space
belongs_to :team, inverse_of: :tiny_mce_assets, optional: true
belongs_to :step, inverse_of: :tiny_mce_assets, optional: true
belongs_to :result_text, inverse_of: :tiny_mce_assets, optional: true
has_attached_file :image,
styles: { large: [Constants::LARGE_PIC_FORMAT, :jpg] },
convert_options: { large: '-quality 100 -strip' }
validates_attachment_content_type :image,
content_type: %r{^image/#{ Regexp.union(
Constants::WHITELISTED_IMAGE_TYPES
) }}
validates_attachment :image,
presence: true,
size: {
less_than: Constants::FILE_MAX_SIZE_MB.megabytes
}
validates :estimated_size, presence: true
# When using S3 file upload, we can limit file accessibility with url signing
def presigned_url(style = :large,
download: false,
timeout: Constants::URL_LONG_EXPIRE_TIME)
if stored_on_s3?
if download
download_arg = 'attachment; filename=' + URI.escape(image_file_name)
else
download_arg = nil
end
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)
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
File.open(image.path, 'rb')
end
end
private
def update_estimated_size
return if image_file_size.blank?
es = image_file_size * Constants::ASSET_ESTIMATED_SIZE_FACTOR
update(estimated_size: es)
Rails.logger.info "Asset #{id}: Estimated size successfully calculated"
# update team space taken
self.team.take_space(es)
self.team.save
end
def release_team_space
self.team.release_space(estimated_size)
self.team.save
end
def set_reference
obj_type = "#{@reference.class.to_s.underscore}=".to_sym
public_send(obj_type, @reference) if @reference
end
end