53 lines
1.4 KiB
Ruby
53 lines
1.4 KiB
Ruby
require_dependency 'carto/storage'
|
|
|
|
module Carto
|
|
class AssetsService
|
|
def upload(namespace, resource)
|
|
file = fetch_file(resource)
|
|
storage = Storage.instance.for(location)
|
|
begin
|
|
identifier, url = storage.upload(namespace, file)
|
|
ensure
|
|
file.close
|
|
file.unlink
|
|
end
|
|
|
|
storage_info = {
|
|
type: storage.class.name.demodulize.downcase,
|
|
location: location,
|
|
identifier: identifier
|
|
}
|
|
|
|
[storage_info, url]
|
|
end
|
|
|
|
def remove(storage_info)
|
|
Storage.instance
|
|
.for(storage_info[:location], preferred_type: storage_info[:type])
|
|
.remove(storage_info[:identifier])
|
|
end
|
|
|
|
def fetch_file(resource)
|
|
raise NotImplementedError.new("This method should be implemented by children classes")
|
|
end
|
|
|
|
def location
|
|
raise NotImplementedError.new("This method should be implemented by children classes")
|
|
end
|
|
|
|
def max_size_in_bytes
|
|
raise NotImplementedError.new("This method should be implemented by children classes")
|
|
end
|
|
|
|
def resource_extension(resource)
|
|
# Resource can be a ActionDispatch::Http::UploadedFile or a URI string
|
|
filename = resource.respond_to?(:original_filename) ? resource.original_filename : resource
|
|
extension = File.extname(filename).downcase
|
|
|
|
raise UnprocesableEntityError.new("extension not accepted") unless VALID_EXTENSIONS.include?(extension)
|
|
extension
|
|
end
|
|
|
|
end
|
|
end
|