50 lines
1.1 KiB
Ruby
50 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module StorageManager
|
|
class S3
|
|
attr_reader :base_url
|
|
|
|
def initialize(endpoint:, access_key_id:, secret_access_key:, bucket:, base_url:)
|
|
@s3 = Aws::S3::Resource.new(
|
|
region: "weur",
|
|
endpoint: endpoint,
|
|
credentials: Aws::Credentials.new(access_key_id, secret_access_key),
|
|
).bucket(bucket)
|
|
@base_url = base_url
|
|
end
|
|
|
|
def delete(path)
|
|
return unless exists?(path)
|
|
@s3.object(trim(path)).delete
|
|
end
|
|
|
|
def exists?(path)
|
|
@s3.object(trim(path)).exists?
|
|
end
|
|
|
|
def get(path, &block)
|
|
file = @s3.object(trim(path)).get.body
|
|
block&.call(file)
|
|
file
|
|
end
|
|
|
|
def put(path, io)
|
|
@s3.object(trim(path)).put(body: io, content_type: Marcel::MimeType.for(io))
|
|
end
|
|
|
|
def upload(path, body)
|
|
put(path, body)
|
|
"#{base_url}#{path}"
|
|
end
|
|
|
|
def url_for(entry)
|
|
"#{base_url}#{entry.path}"
|
|
end
|
|
|
|
def trim(path)
|
|
# R2 for some reason doesn't trim preceding slashes
|
|
path.sub(%r{^/}, "")
|
|
end
|
|
end
|
|
end
|