Class: NaviEmailSync::Cloud

Inherits:
Object
  • Object
show all
Includes:
Concurrent::Async
Defined in:
lib/cloud/navi_cloud_client.rb

Overview

This class represents the client for cloud version. In cloud version, all the content will be saved and also being used from the s3

Direct Known Subclasses

GmailCloudApi, ImapCloudApi

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sso_web_url = ENV['api_url'], env = Rails.env) ⇒ Cloud

Returns a new instance of Cloud.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/cloud/navi_cloud_client.rb', line 17

def initialize(sso_web_url = ENV['api_url'], env = Rails.env)
  super()

  # client-id used to track the process
  @id = SecureRandom.uuid

  # flag to print Ruby library debug info (very detailed)
  @net_imap_debug = false

  # flag to mark email as read after gets downloaded.
  @mark_as_read = false
  # flag to turn on/off debug mode.
  @debug = false

  @logger = nil

  # sso_web (authentication) config.
  @sso_web_url = sso_web_url
  # authentication token received from sso_web used to authenticate the request to database_api
  @token = nil

  # client_type
  @client_type = "cloud"

  @download_path = config[:s3_download_folder] + '/'

  # set email_address of current_user for s3 folder name
  @current_user_email = nil
  @env = env
end

Instance Attribute Details

#idObject (readonly)

Returns the value of attribute id.



15
16
17
# File 'lib/cloud/navi_cloud_client.rb', line 15

def id
  @id
end

Instance Method Details

#configObject



141
142
143
# File 'lib/cloud/navi_cloud_client.rb', line 141

def config
  YAML.load_file(Rails.root.join("config/navi_client.yml")).with_indifferent_access
end

#download(message, custom_uid) ⇒ Object

Downloads the email content from imap-server and save it to the download_path



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/cloud/navi_cloud_client.rb', line 87

def download(message, custom_uid)
  mime_type = message["mime_type"].nil? ? message.mime_type : message["mime_type"]

  if ['text/plain', 'text/html'].include? mime_type

    h = Hash.new
    out_file = @download_path + mime_type + "/"+custom_uid

    s3_filepath = upload_to_s3(out_file, encrypt(message["decoded"].nil? ? message.decoded : message["decoded"]))
    key = mime_type.split("/").join("_")

    h[key] = s3_filepath
    return h
  end
end

#getMessageUUIds(prefix) ⇒ Object



136
137
138
139
# File 'lib/cloud/navi_cloud_client.rb', line 136

def getMessageUUIds(prefix)
  files = s3_resource_files(config[:s3_bucket], prefix)
  files.empty? ? [] : files.map { |i| i.empty? ? 0 : i.split('/').last.split("_").first }
end

#login(session_token, client) ⇒ Object

login

login to the navi-cloud and get the authentication token



57
58
59
60
# File 'lib/cloud/navi_cloud_client.rb', line 57

def (session_token, client)
  @token = session_token
  @client = client
end

#override_logger(logger) ⇒ Object



48
49
50
# File 'lib/cloud/navi_cloud_client.rb', line 48

def override_logger(logger)
  @logger = logger
end

#s3_resource_files(bucket_name, prefix) ⇒ Object



126
127
128
129
130
131
132
133
134
# File 'lib/cloud/navi_cloud_client.rb', line 126

def s3_resource_files(bucket_name, prefix)
  files = []
  credentials = Aws::Credentials.new(config[:aws_key], config[:aws_secret])
  s3 = Aws::S3::Resource.new(credentials: credentials, region: config[:aws_region])
  s3.bucket(bucket_name).objects(prefix: prefix).each do |obj|
    files << obj.key
  end
  return files
end

#save(data = {}, filename) ⇒ Object

save data to download_path with file named by filename params. Input is hashmap, and it save the hashmap as yml format.



107
108
109
110
# File 'lib/cloud/navi_cloud_client.rb', line 107

def save(data={}, filename)
  filepath = @download_path + filename + ".yml"
  return upload_to_s3(filepath, data.to_yaml)
end

#send_request(in_filenames = [], is_last: false, email_count:) ⇒ Object

send bulk request to navi-ai service with list of input files downloaded from imap server.



75
76
77
78
79
80
81
82
# File 'lib/cloud/navi_cloud_client.rb', line 75

def send_request(in_filenames = [], is_last: false, email_count:)
  unless in_filenames.blank?
    filepath = @download_path + "inputs/" + (Time.now.to_f * 1000).to_s
    filename = upload_to_s3(filepath, in_filenames.join("\n"))

    HTTPService::NaviAI.start(filepath: filename, client_id: @id, client_type: @client_type, token: @token, client: @client, email: @current_user_email, is_last: is_last, email_count: email_count, total_emails: @total_emails)
  end
end

#set_current_user_email(email) ⇒ Object



62
63
64
65
# File 'lib/cloud/navi_cloud_client.rb', line 62

def set_current_user_email(email)
  @current_user_email = email
  @download_path = config[:s3_download_folder] + '/' + email + "/"
end

#set_user_details(email, identifier, method) ⇒ Object



67
68
69
70
# File 'lib/cloud/navi_cloud_client.rb', line 67

def set_user_details(email, identifier, method)
  @current_user_email = email
  @download_path = "#{config[:s3_download_folder]}/#{identifier}/#{method}/"
end

#upload_to_s3(file_path, content) ⇒ Object

Helper function to upload the content to the s3



114
115
116
117
118
119
120
121
122
123
124
# File 'lib/cloud/navi_cloud_client.rb', line 114

def upload_to_s3(file_path, content)
  credentials = Aws::Credentials.new(config[:aws_key], config[:aws_secret])
  s3 = Aws::S3::Client.new(credentials: credentials, region: config[:aws_region])
  obj = s3.put_object({
                        body: content,
                        bucket: config[:s3_bucket],
                        key: file_path
                      })
  return file_path if obj.successful?
  return ""
end