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