class Shrine::Storage::GoogleDriveStorage
Public Class Methods
new(drive_public_folder_id: nil, google_drive_options: {})
click to toggle source
# File lib/shrine/storage/google_drive_storage.rb, line 12 def initialize(drive_public_folder_id: nil, google_drive_options: {}) @drive_public_folder_id = drive_public_folder_id || ENV["GOOGLE_PUBLIC_FOLDER_ID"] end
Public Instance Methods
delete(id)
click to toggle source
# File lib/shrine/storage/google_drive_storage.rb, line 62 def delete(id) google_api_client.delete_file(get_drive_file_id(id)) rescue nil end
exists?(id)
click to toggle source
# File lib/shrine/storage/google_drive_storage.rb, line 35 def exists?(id) get_drive_file_id(id) end
open(id)
click to toggle source
# File lib/shrine/storage/google_drive_storage.rb, line 39 def open(id) sio = StringIO.new google_api_client.get_file( get_drive_file_id(id), download_dest: sio ) sio.rewind sio end
upload(io, id, shrine_metadata: {}, **_options)
click to toggle source
# File lib/shrine/storage/google_drive_storage.rb, line 16 def upload(io, id, shrine_metadata: {}, **_options) mime_type = io.metadata['mime_type'] rescue 'image/jpeg' s = StringIO.new s.write(io.read) s.rewind google_api_client.create_file( { name: id, mime_type: mime_type, parents: [@drive_public_folder_id] }, fields: 'id, name', upload_source: s, content_type: shrine_metadata['mime_type'] ) message = "Uploaded file #{id}" end
url(id, **_options)
click to toggle source
# File lib/shrine/storage/google_drive_storage.rb, line 49 def url(id, **_options) begin metadata = google_api_client.get_file( get_drive_file_id(id), fields: 'webViewLink' ) metadata.web_view_link rescue Exception => e # p "URL ERR! #{e}" #TODO: something meaningful? end end
Private Instance Methods
get_drive_file_id(id)
click to toggle source
# File lib/shrine/storage/google_drive_storage.rb, line 68 def get_drive_file_id(id) google_api_client.list_files(q: "name contains '#{id}'").files[0].id rescue nil end
google_api_client()
click to toggle source
# File lib/shrine/storage/google_drive_storage.rb, line 72 def google_api_client if !@google_api_client || @google_api_client.authorization.expired? service = Google::Apis::DriveV3::DriveService.new service.client_options.application_name = ENV['APPLICATION_NAME'] service.authorization = Google::Auth::ServiceAccountCredentials.make_creds( json_key_io: File.open(ENV['GOOGLE_APPLICATION_CREDENTIALS']), scope: Google::Apis::DriveV3::AUTH_DRIVE) @google_api_client = service end @google_api_client end