class Dug::GmailServicer

@private

Constants

APPLICATION_NAME
OOB_URI
SCOPE

Public Class Methods

new() click to toggle source
# File lib/dug/gmail_servicer.rb, line 21
def initialize
  @gmail = Google::Apis::GmailV1::GmailService.new
  @gmail.client_options.application_name = APPLICATION_NAME
end

Public Instance Methods

add_labels_by_name(*args) click to toggle source
# File lib/dug/gmail_servicer.rb, line 33
def add_labels_by_name(*args)
  modification_request(*args) do |request, ids|
    request.add_label_ids = ids
  end
end
authorize!() click to toggle source

TODO: break some of this code down, prolly into a separate Authorizer class or something

# File lib/dug/gmail_servicer.rb, line 46
def authorize!
  token_store_path = Dug.configuration.token_store
  FileUtils.mkdir_p(File.dirname(token_store_path))

  client_id = begin
                if Dug.configuration.client_id
                  Google::Auth::ClientId.new(Dug.configuration.client_id,
                                             Dug.configuration.client_secret)
                else
                  Google::Auth::ClientId.from_file(Dug.configuration.application_credentials_file)
                end
              end
  token_store = Google::Auth::Stores::FileTokenStore.new(file: token_store_path)
  authorizer = Google::Auth::UserAuthorizer.new(client_id, SCOPE, token_store)
  user_id = 'default'

  credentials = authorizer.get_credentials(user_id)
  if credentials.nil?
    url = authorizer.get_authorization_url(
      base_url: OOB_URI)
    puts "Open the following URL in the browser and enter the " +
      "resulting code after authorization"
    puts url
    code = gets
    credentials = authorizer.get_and_store_credentials_from_code(
      user_id: user_id, code: code, base_url: OOB_URI)
  end
  @gmail.authorization = credentials
end
labels(use_cache: true) click to toggle source
# File lib/dug/gmail_servicer.rb, line 26
def labels(use_cache: true)
  @labels = nil unless use_cache
  @labels ||= @gmail.list_user_labels('me').labels.reduce({}) do |hash, label|
    hash.tap { |h| h[label.name] = label }
  end
end
remove_labels_by_name(*args) click to toggle source
# File lib/dug/gmail_servicer.rb, line 39
def remove_labels_by_name(*args)
  modification_request(*args) do |request, ids|
    request.remove_label_ids = ids
  end
end

Private Instance Methods

modification_request(message, label_names, entire_thread: false) { |request, ids| ... } click to toggle source
# File lib/dug/gmail_servicer.rb, line 78
def modification_request(message, label_names, entire_thread: false)
  ids = []
  label_names.each do |name|
    unless labels[name] && id = labels[name].id
      raise MissingLabel, "The label '#{name}' does not exist. Please add the label in Gmail first."
    end
    ids << id
  end
  request =
    if entire_thread
      Google::Apis::GmailV1::ModifyThreadRequest.new
    else
      Google::Apis::GmailV1::ModifyMessageRequest.new
    end

  yield request, ids

  if entire_thread
    modify_thread('me', message.thread_id, request)
  else
    modify_message('me', message.id, request)
  end
end