2013-06-05 00:34:53 +02:00
module S3
2013-06-17 22:16:14 +02:00
def self . store_file ( file , sha1 , image_info , upload_id )
2013-06-19 21:51:41 +02:00
S3 . check_missing_site_settings
directory = S3 . get_or_create_directory ( SiteSetting . s3_upload_bucket )
remote_filename = " #{ upload_id } #{ sha1 } . #{ image_info . type } "
# if this fails, it will throw an exception
file = S3 . upload ( file , remote_filename , directory )
2013-06-22 13:38:42 +02:00
" #{ S3 . base_url } / #{ remote_filename } "
end
def self . base_url
" // #{ SiteSetting . s3_upload_bucket } .s3.amazonaws.com "
2013-06-19 21:51:41 +02:00
end
def self . remove_file ( url )
S3 . check_missing_site_settings
directory = S3 . get_or_create_directory ( SiteSetting . s3_upload_bucket )
file = S3 . destroy ( url , directory )
end
def self . check_missing_site_settings
2013-06-05 00:34:53 +02:00
raise Discourse :: SiteSettingMissing . new ( " s3_upload_bucket " ) if SiteSetting . s3_upload_bucket . blank?
raise Discourse :: SiteSettingMissing . new ( " s3_access_key_id " ) if SiteSetting . s3_access_key_id . blank?
raise Discourse :: SiteSettingMissing . new ( " s3_secret_access_key " ) if SiteSetting . s3_secret_access_key . blank?
2013-06-19 21:51:41 +02:00
end
2013-06-05 00:34:53 +02:00
2013-06-19 21:51:41 +02:00
def self . get_or_create_directory ( name )
2013-06-05 00:34:53 +02:00
@fog_loaded = require 'fog' unless @fog_loaded
options = S3 . generate_options
2013-06-19 21:51:41 +02:00
fog = Fog :: Storage . new ( options )
directory = fog . directories . get ( name )
directory = fog . directories . create ( key : name ) unless directory
directory
2013-06-05 00:34:53 +02:00
end
def self . generate_options
options = {
provider : 'AWS' ,
aws_access_key_id : SiteSetting . s3_access_key_id ,
aws_secret_access_key : SiteSetting . s3_secret_access_key
}
options [ :region ] = SiteSetting . s3_region unless SiteSetting . s3_region . empty?
options
end
def self . upload ( file , name , directory )
directory . files . create (
key : name ,
public : true ,
body : file . tempfile ,
content_type : file . content_type
)
end
2013-06-19 21:51:41 +02:00
def self . destroy ( name , directory )
directory . files . destroy ( key : name )
end
2013-06-05 00:34:53 +02:00
end