69 lines
1.8 KiB
Ruby
69 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'aws-sdk-s3'
|
|
|
|
class AwsService
|
|
attr_reader :s3_client, :bucket
|
|
|
|
class ConfigurationError < StandardError; end
|
|
|
|
def initialize
|
|
validate_credentials!
|
|
|
|
@s3_client = Aws::S3::Client.new(
|
|
region: Rails.application.credentials.dig(:aws, :region),
|
|
access_key_id: Rails.application.credentials.dig(:aws, :access_key_id),
|
|
secret_access_key: Rails.application.credentials.dig(:aws, :secret_access_key)
|
|
)
|
|
@bucket = Rails.application.credentials.dig(:aws, :bucket_name)
|
|
rescue KeyError => e
|
|
raise ConfigurationError, "Missing AWS credential: #{e.message}"
|
|
end
|
|
|
|
def upload_stream(io, key)
|
|
@s3_client.put_object(
|
|
bucket: @bucket,
|
|
key: key,
|
|
body: io
|
|
)
|
|
end
|
|
|
|
def file_exists?(key)
|
|
@s3_client.head_object(
|
|
bucket: @bucket,
|
|
key: key
|
|
)
|
|
true
|
|
rescue Aws::S3::Errors::NotFound
|
|
false
|
|
end
|
|
|
|
private
|
|
|
|
def credentials
|
|
@credentials ||= begin
|
|
creds = Rails.application.credentials[:aws]
|
|
raise ConfigurationError, 'AWS credentials not found' unless creds
|
|
|
|
{
|
|
region: creds[:region],
|
|
access_key_id: creds[:access_key_id],
|
|
secret_access_key: creds[:secret_access_key],
|
|
bucket_name: creds[:bucket_name]
|
|
}
|
|
end
|
|
end
|
|
|
|
def validate_credentials!
|
|
missing = []
|
|
creds = Rails.application.credentials[:aws]
|
|
|
|
%i[region access_key_id secret_access_key bucket_name].each do |key|
|
|
missing << key unless creds&.dig(key)
|
|
end
|
|
|
|
return unless missing.any?
|
|
|
|
raise ConfigurationError, "Missing AWS credentials: #{missing.join(', ')}"
|
|
end
|
|
end
|