class Lt::Google::Api::Drive

Constants

FOLDER_RE
MIME_FILE
MIME_FOLDER

Attributes

service[R]

Public Class Methods

build(credentials) click to toggle source
# File lib/lt/google/api/drive.rb, line 14
def build(credentials)
  new(credentials).service
end
file_url_for(file_id) click to toggle source
# File lib/lt/google/api/drive.rb, line 18
def file_url_for(file_id)
  "https://drive.google.com/open?id=#{file_id}"
end
folder_id_for(url) click to toggle source
# File lib/lt/google/api/drive.rb, line 22
def folder_id_for(url)
  url.match(FOLDER_RE)[2]
end
new(credentials) click to toggle source
# File lib/lt/google/api/drive.rb, line 27
def initialize(credentials)
  @service = ::Google::Apis::DriveV3::DriveService.new
  @service.authorization = credentials
end

Public Instance Methods

copy(file_ids, folder_id) click to toggle source
# File lib/lt/google/api/drive.rb, line 32
def copy(file_ids, folder_id)
  file_ids.each do |id|
    service.get_file(id, fields: 'name', supports_all_drives: true) do |f, err|
      if err.present?
        Rails.logger.error "Failed to get file with #{id}, #{err.message}"
      else
        service.copy_file(
          id,
          ::Google::Apis::DriveV3::File.new(name: f.name, parents: [folder_id]),
          supports_all_drives: true
        )
      end
    end
  end
  folder_id
end
copy_files(folder_id, target_id) click to toggle source
# File lib/lt/google/api/drive.rb, line 49
def copy_files(folder_id, target_id)
  new_files = list folder_id
  current_files = list target_id

  # delete old files not present on new version
  current_files.each do |file|
    next if new_files.detect { |f| f.name == file.name }

    service.delete_file(file.id, supports_all_drives: true)
  end

  new_files.each do |file|
    # skip if the file already exists
    next if current_files.detect { |f| f.name == file.name }

    # copy if it's a new file
    new_file = ::Google::Apis::DriveV3::File.new(name: file.name, parents: [target_id])
    service.copy_file(file.id, new_file, supports_all_drives: true)
  end
end
create_folder(name, parent_id = nil) click to toggle source
# File lib/lt/google/api/drive.rb, line 70
def create_folder(name, parent_id = nil)
  if parent_id.present? && (folders = fetch_folders(name, parent_id)).any?
    return folders.first.id
  end

  metadata = ::Google::Apis::DriveV3::File.new(
    name: name,
    mime_type: MIME_FOLDER,
    parents: [parent_id]
  )
  service.create_file(metadata, supports_all_drives: true)&.id
end
fetch_folders(name, folder_id) click to toggle source
# File lib/lt/google/api/drive.rb, line 110
def fetch_folders(name, folder_id)
  service.list_files(
    q: %("#{folder_id}" in parents and name = "#{name}" and mimeType = "#{MIME_FOLDER}" and trashed = false),
    fields: 'files(id)',
    include_items_from_all_drives: true,
    supports_all_drives: true
  )&.files
end
list_file_ids_in(folder_id, mime_type: MIME_FILE, with_subfolders: true) click to toggle source
# File lib/lt/google/api/drive.rb, line 83
def list_file_ids_in(folder_id, mime_type: MIME_FILE, with_subfolders: true)
  [].tap do |result|
    page_token = nil
    loop do
      response = service.list_files(
        q: %("#{folder_id}" in parents and trashed = false),
        fields: 'files(id, mime_type), nextPageToken',
        page_token: page_token.to_s,
        include_items_from_all_drives: true,
        supports_all_drives: true
      )
      break if response.nil?

      response.files.each do |f|
        case f.mime_type
        when mime_type then result << f.id
        when MIME_FOLDER
          result.concat(list_file_ids_in f.id, mime_type: mime_type) if with_subfolders
        end
      end

      page_token = response.next_page_token
      break if page_token.nil?
    end
  end.flatten
end

Private Instance Methods

list(folder_id) click to toggle source
# File lib/lt/google/api/drive.rb, line 121
def list(folder_id)
  service.list_files(
    q: %("#{folder_id}" in parents and mimeType = "#{MIME_FILE}" and trashed = false),
    fields: 'files(id, name)',
    include_items_from_all_drives: true,
    supports_all_drives: true
  )&.files
end