class Shrine::Storage::Cloudinary

Constants

MIME_TYPES

Attributes

prefix[R]
resource_type[R]
type[R]
upload_options[R]

Public Class Methods

new(prefix: nil, resource_type: "image", type: "upload", store_data: nil, upload_options: {}, large: nil) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 10
def initialize(prefix: nil, resource_type: "image", type: "upload", store_data: nil, upload_options: {}, large: nil)
  @prefix = prefix
  @large = large
  @resource_type = resource_type
  @type = type
  @upload_options = upload_options
  @store_data = store_data
end

Public Instance Methods

clear!(**options) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 55
def clear!(**options)
  if prefix
    api.delete_resources_by_prefix(prefix, **options)
  else
    api.delete_all_resources(**options)
  end
end
delete(id) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 47
def delete(id)
  uploader.destroy(public_id(id))
end
exists?(id) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 42
def exists?(id)
  result = api.resources_by_ids([public_id(id)])
  result.fetch("resources").any?
end
open(id, **options) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 36
def open(id, **options)
  Down::Http.open(url(id, sign_url: true), **options)
rescue Down::NotFound
  raise Shrine::FileNotFound, "file #{id.inspect} not found on storage"
end
presign(id = nil, **presign_options) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 63
def presign(id = nil, **presign_options)
  options = id ? { public_id: public_id(id) } : { folder: prefix }
  options.merge!(@upload_options)
  options.merge!(presign_options)

  fields = ::Cloudinary::Uploader.build_upload_params(options)
  fields.reject! { |key, value| value.nil? || value == "" }
  fields[:signature] = ::Cloudinary::Utils.api_sign_request(fields, ::Cloudinary.config.api_secret)
  fields[:api_key]   = ::Cloudinary.config.api_key

  url = utils.cloudinary_api_url("upload")

  { method: :post, url: url, fields: fields }
end
update(id, **options) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 32
def update(id, **options)
  uploader.explicit(public_id(id), **options)
end
upload(io, id, shrine_metadata: {}, **upload_options) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 19
def upload(io, id, shrine_metadata: {}, **upload_options)
  options = { public_id: public_id(id) }
  options.merge!(@upload_options)
  options.merge!(upload_options)

  result = store(io, **options)

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

  result
end
url(id, **options) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 51
def url(id, **options)
  utils.cloudinary_url(path(id), secure: true, **options)
end

Protected Instance Methods

path(id) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 88
def path(id)
  [*prefix, id].join("/")
end
public_id(id) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 80
def public_id(id)
  if resource_type == "raw"
    path(id)
  else
    path(id).chomp(File.extname(id))
  end
end

Private Instance Methods

api() click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 109
def api;      Delegator.new(::Cloudinary::Api,      default_options); end
default_options() click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 120
def default_options
  { resource_type: resource_type, type: type }
end
large?(io) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 116
def large?(io)
  io.size >= @large if @large
end
remote?(io) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 112
def remote?(io)
  io.is_a?(UploadedFile) && io.url.to_s =~ /^ftp:|^https?:/
end
store(io, chunk_size: nil, **options) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 94
def store(io, chunk_size: nil, **options)
  if remote?(io)
    uploader.upload(io.url, **options)
  else
    Shrine.with_file(io) do |file|
      if large?(file)
        uploader.upload_large(file, chunk_size: chunk_size, **options)
      else
        uploader.upload(file, **options)
      end
    end
  end
end
update_id!(result, id) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 124
def update_id!(result, id)
  uploaded_id  = result.fetch("public_id")
  uploaded_id  = uploaded_id.match("#{prefix}/").post_match if prefix
  uploaded_id += ".#{result["format"]}" if result["format"]

  id.replace(uploaded_id)
end
update_metadata!(result, metadata) click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 132
def update_metadata!(result, metadata)
  retrieved_metadata = {
    "size"      => result["bytes"],
    "mime_type" => MIME_TYPES[result["format"]],
    "width"     => result["width"],
    "height"    => result["height"],
  }
  retrieved_metadata["cloudinary"] = result if @store_data
  retrieved_metadata.reject! { |key, value| value.nil? }

  metadata.update(retrieved_metadata)
end
uploader() click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 108
def uploader; Delegator.new(::Cloudinary::Uploader, default_options); end
utils() click to toggle source
# File lib/shrine/storage/cloudinary.rb, line 110
def utils;    Delegator.new(::Cloudinary::Utils,    default_options); end