Class: Backup::GoogleDriveTransfer

Inherits:
Object
  • Object
show all
Includes:
Config::Helpers
Defined in:
lib/backup/storage/google/google_drive_transfer.rb

Instance Method Summary collapse

Methods included from Config::Helpers

included

Constructor Details

#initialize(client, drive) ⇒ GoogleDriveTransfer

Returns a new instance of GoogleDriveTransfer.



5
6
7
8
9
10
# File 'lib/backup/storage/google/google_drive_transfer.rb', line 5

def initialize(client, drive)
  @client = client
  @drive = drive

  get_info
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Backup::Config::Helpers

Instance Method Details

#create_folder(title, parent_folder_id) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/backup/storage/google/google_drive_transfer.rb', line 30

def create_folder(title, parent_folder_id)
  parent_folder_id ||= @about.root_folder_id

  folder = @drive.files.insert.request_schema.new({
    "title" => title,
    "mimeType" => "application/vnd.google-apps.folder",
    "parents" => [{
      "id" => parent_folder_id
    }],
  })
  result = @client.execute!(
    api_method: @drive.files.insert,
    body_object: folder
  )

  result.status == 200 ? result.data : nil
end

#delete(package, folder_id = nil) ⇒ Object

Delete file



78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/backup/storage/google/google_drive_transfer.rb', line 78

def delete(package, folder_id = nil)
  folder_id ||= @about.root_folder_id

  del_folder = find_files({
    "folderId" => folder_id,
    "q" => "title = '#{package.time}'",
    "maxResults" => 1
  })[0]

  delete_folder(folder_id, del_folder.id)

  nil
end

#delete_folder(parent_folder_id, del_folder_id) ⇒ Object



115
116
117
118
119
120
121
122
123
# File 'lib/backup/storage/google/google_drive_transfer.rb', line 115

def delete_folder(parent_folder_id, del_folder_id)
  @client.execute!(
    api_method: @drive.children.delete,
    parameters: {
      "folderId" => parent_folder_id,
      "childId" => del_folder_id
    }
  )
end

#find_files(params = {}) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/backup/storage/google/google_drive_transfer.rb', line 92

def find_files(params = {})
  page_token = nil

  begin
    params["pageToken"] = page_token if page_token.to_s != ""

    result = @client.execute(
      api_method: @drive.children.list,
      parameters: params
    )

    if result.status == 200
      children = result.data
      page_token = children.next_page_token

      return children.items
    else
      puts "An error occurred: #{result.data['error']['message']}"
      page_token = nil
    end
  end while page_token.to_s != ""
end

#get_infoObject



12
13
14
15
# File 'lib/backup/storage/google/google_drive_transfer.rb', line 12

def get_info
  list = @client.execute(api_method: @drive.about.get)
  @about = list.data
end

#insert_file(filename, src, folder_id) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/backup/storage/google/google_drive_transfer.rb', line 48

def insert_file(filename, src, folder_id)
  folder_id ||= @about.root_folder_id

  File.open(src, "r") do |file|
    file_options = {
      "title" => filename,
      "parents" => [{
        "id" => folder_id
      }]
    }

    file = @drive.files.insert.request_schema.new(file_options)

    media = Google::APIClient::UploadIO.new(src, MIME::Types.type_for(filename))
    result = @client.execute(
      api_method: @drive.files.insert,
      body_object: file,
      media: media,
      parameters: {
        "uploadType" => "multipart"
      }
    )

    result
  end
end

#upload(package, folder_id = nil) ⇒ Object

File upload



19
20
21
22
23
24
25
26
27
28
# File 'lib/backup/storage/google/google_drive_transfer.rb', line 19

def upload(package, folder_id = nil)
  package.filenames.each do |filename|
    src = File.join(Config.tmp_path, filename)

    Logger.info "Storing '#{ src }'..."

    file_folder = create_folder(package.time, folder_id)
    insert_file(filename, src, file_folder.id)
  end
end