class Shrine::Storage::Uploadcare

Constants

Error

Attributes

api[R]

Public Class Methods

new(**options) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 14
def initialize(**options)
  @api = ::Uploadcare::Api.new(**options)
end

Public Instance Methods

clear!() click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 70
def clear!
  api.file_list(limit: 1000).each_slice(100) do |file_batch|
    api.delete_files(file_batch)
  end
end
delete(id) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 42
def delete(id)
  file = api.file(id)
  file.delete
end
exists?(id) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 34
def exists?(id)
  file = api.file(id)
  file.load_data
  !!file.datetime_stored
rescue ::Uploadcare::Error::RequestError::NotFound
  false
end
open(id, **options) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 28
def open(id, **options)
  Down::Http.open(url(id), **options)
rescue Down::NotFound
  raise Shrine::FileNotFound, "file #{id.inspect} not found on storage"
end
presign(id = nil, **options) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 53
def presign(id = nil, **options)
  expire = Time.now.to_i + (options[:expires_in] || 60*60)
  secret_key = api.options[:private_key]

  signature = Digest::MD5.hexdigest(secret_key + expire.to_s)

  fields = {
    UPLOADCARE_PUB_KEY: api.options[:public_key],
    signature: signature,
    expire: expire,
  }

  url = URI.join(api.options[:upload_url_base], "base/").to_s

  { method: :post, url: url, fields: fields }
end
upload(io, id, shrine_metadata: {}, **upload_options) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 18
def upload(io, id, shrine_metadata: {}, **upload_options)
  file = _upload(io, id, shrine_metadata: shrine_metadata, **upload_options)
  file.load_data

  update_metadata!(shrine_metadata, file)
  update_id!(id, file)

  file
end
url(id, **options) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 47
def url(id, **options)
  file = api.file(id)
  file.operations = options.map { |operation| operation.flatten.join("/") }
  file.cdn_url(true)
end

Private Instance Methods

_upload(io, id, shrine_metadata: {}, **upload_options) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 78
def _upload(io, id, shrine_metadata: {}, **upload_options)
  options = { store: true }
  options.merge!(upload_options)

  if remote_file?(io)
    api.upload_from_url(io.url, options)
  else
    Shrine.with_file(io) do |file|
      api.upload(file, options)
    end
  end
end
remote_file?(io) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 100
def remote_file?(io)
  io.is_a?(UploadedFile) && io.url.to_s =~ /^ftp:|^https?:/
end
update_id!(id, file) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 96
def update_id!(id, file)
  id.replace(file.uuid)
end
update_metadata!(metadata, file) click to toggle source
# File lib/shrine/storage/uploadcare.rb, line 91
def update_metadata!(metadata, file)
  metadata.merge!(file.image_info.to_h)
  metadata.merge!("mime_type" => file.mime_type, "size" => file.size)
end