Compare commits
7 commits
develop
...
script/mig
Author | SHA1 | Date | |
---|---|---|---|
|
32011212e5 | ||
|
93314501b0 | ||
|
9abf461cab | ||
|
48ceb1d872 | ||
|
a00fda47a5 | ||
|
55967a84eb | ||
|
5276784cee |
2 changed files with 305 additions and 0 deletions
295
lib/migrate_to_cloud/import_to_cloud.rb
Normal file
295
lib/migrate_to_cloud/import_to_cloud.rb
Normal file
|
@ -0,0 +1,295 @@
|
||||||
|
class MigrateToCloud::ImportToCloud
|
||||||
|
pattr_initialize [:account_id!, :inbox_id, :password]
|
||||||
|
|
||||||
|
def perform(type)
|
||||||
|
case type
|
||||||
|
when 'user'
|
||||||
|
# prepare_user_map
|
||||||
|
import_users_to_account
|
||||||
|
when 'contact'
|
||||||
|
import_contacts_to_account
|
||||||
|
when 'label'
|
||||||
|
import_labels_to_account
|
||||||
|
when 'conversation'
|
||||||
|
import_conversations_to_account
|
||||||
|
when 'message'
|
||||||
|
import_messages_to_account
|
||||||
|
when 'tag'
|
||||||
|
import_tags_to_account
|
||||||
|
when 'all'
|
||||||
|
import_users_to_account
|
||||||
|
import_contacts_to_account
|
||||||
|
import_conversations_to_account
|
||||||
|
import_messages_to_account
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def import_users_to_account
|
||||||
|
filename = 'export/users.csv'
|
||||||
|
data = []
|
||||||
|
CSV.foreach(filename, headers: true) do |row|
|
||||||
|
user = row.to_hash
|
||||||
|
new_user = {}
|
||||||
|
new_user['created_at'] = user['created_at']
|
||||||
|
new_user['custom_attributes'] = user['custom_attributes']
|
||||||
|
new_user['display_name'] = user['display_name']
|
||||||
|
new_user['email'] = user['email']
|
||||||
|
new_user['name'] = user['name']
|
||||||
|
new_user['password'] = password
|
||||||
|
new_user['updated_at'] = user['updated_at']
|
||||||
|
new_user['confirmed_at'] = Time.now
|
||||||
|
new_user['custom_attributes'] = append_migrated_id(new_user['custom_attributes'], user['id'])
|
||||||
|
user = User.create!(new_user)
|
||||||
|
account.account_users.create(
|
||||||
|
user_id: user.id,
|
||||||
|
role: :agent
|
||||||
|
)
|
||||||
|
data.push(new_user)
|
||||||
|
end
|
||||||
|
log_to_console('INSERT_USER', data.last['custom_attributes'][:migrated_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_contacts_to_account
|
||||||
|
filename = 'export/contacts.csv'
|
||||||
|
iterator = 1
|
||||||
|
data = []
|
||||||
|
CSV.foreach(filename, headers: true) do |row|
|
||||||
|
if iterator > 1000
|
||||||
|
iterator = 1
|
||||||
|
account.contacts.insert_all(data)
|
||||||
|
log_to_console('INSERT_CONTACT', data.last['additional_attributes'][:migrated_id])
|
||||||
|
data = []
|
||||||
|
end
|
||||||
|
|
||||||
|
contact = row.to_hash
|
||||||
|
|
||||||
|
new_contact = {}
|
||||||
|
new_contact['additional_attributes'] = contact['additional_attributes']
|
||||||
|
new_contact['custom_attributes'] = contact['custom_attributes']
|
||||||
|
new_contact['email'] = contact['email']
|
||||||
|
new_contact['identifier'] = contact['identifier']
|
||||||
|
new_contact['last_activity_at'] = contact['last_activity_at']
|
||||||
|
new_contact['name'] = contact['name']
|
||||||
|
new_contact['phone_number'] = contact['phone_number']
|
||||||
|
new_contact['created_at'] = contact['created_at']
|
||||||
|
new_contact['updated_at'] = contact['updated_at']
|
||||||
|
|
||||||
|
new_contact['additional_attributes'] = append_migrated_id(new_contact['additional_attributes'], contact['id'])
|
||||||
|
new_contact['custom_attributes'] = preprare_json(new_contact['custom_attributes'])
|
||||||
|
|
||||||
|
data.push(new_contact)
|
||||||
|
iterator += 1
|
||||||
|
end
|
||||||
|
account.contacts.insert_all(data)
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_labels_to_account
|
||||||
|
filename = 'export/labels.csv'
|
||||||
|
data = []
|
||||||
|
CSV.foreach(filename, headers: true) do |row|
|
||||||
|
label = row.to_hash
|
||||||
|
new_label = {}
|
||||||
|
new_label['title'] = label['title']
|
||||||
|
new_label['description'] = label['description']
|
||||||
|
new_label['color'] = label['color']
|
||||||
|
new_label['show_on_sidebar'] = label['show_on_sidebar']
|
||||||
|
new_label['created_at'] = label['created_at']
|
||||||
|
new_label['updated_at'] = label['updated_at']
|
||||||
|
data.push(new_label)
|
||||||
|
end
|
||||||
|
log_to_console('INSERT_LABEL', '')
|
||||||
|
account.labels.insert_all(data)
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_tags_to_account
|
||||||
|
filename = 'export/tags.csv'
|
||||||
|
data = {}
|
||||||
|
CSV.foreach(filename, headers: true) do |row|
|
||||||
|
label = row.to_hash
|
||||||
|
data[label['id']] = label['name']
|
||||||
|
end
|
||||||
|
|
||||||
|
contact_map = prepare_contact_map
|
||||||
|
conversation_map = prepare_conversation_map
|
||||||
|
|
||||||
|
filename = 'export/taggings.csv'
|
||||||
|
CSV.foreach(filename, headers: true) do |row|
|
||||||
|
tags = row.to_hash
|
||||||
|
model = nil
|
||||||
|
|
||||||
|
if tags['taggable_type'] == 'Conversation'
|
||||||
|
if conversation_map[tags['taggable_id']]
|
||||||
|
conversation = account.conversations.find(conversation_map[tags['taggable_id']])
|
||||||
|
conversation.add_labels([data[tags['tag_id']]])
|
||||||
|
end
|
||||||
|
elsif tags['taggable_type'] == 'Contact'
|
||||||
|
contact = account.contacts.find(contact_map[tags['taggable_id']])
|
||||||
|
contact.add_labels([data[tags['tag_id']]])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_conversations_to_account
|
||||||
|
filename = 'export/conversations.csv'
|
||||||
|
iterator = 1
|
||||||
|
data = []
|
||||||
|
contact_map = prepare_contact_map
|
||||||
|
user_map = prepare_user_map
|
||||||
|
|
||||||
|
CSV.foreach(filename, headers: true) do |row|
|
||||||
|
if iterator > 100
|
||||||
|
iterator = 1
|
||||||
|
account.conversations.insert_all(data)
|
||||||
|
log_to_console('INSERT_CONVERSATIONS', data.last['additional_attributes'][:migrated_id])
|
||||||
|
data = []
|
||||||
|
end
|
||||||
|
conversation = row.to_hash
|
||||||
|
new_conversation = {}
|
||||||
|
contact_id = contact_map[conversation['contact_id']]
|
||||||
|
user_id = user_map[conversation['assignee_id']]
|
||||||
|
return if contact_id.blank?
|
||||||
|
|
||||||
|
contact_inbox = ContactInbox.create!(contact_id: contact_id, inbox_id: inbox_id, source_id: SecureRandom.uuid)
|
||||||
|
|
||||||
|
new_conversation['additional_attributes'] = conversation['additional_attributes']
|
||||||
|
new_conversation['agent_last_seen_at'] = conversation['agent_last_seen_at']
|
||||||
|
new_conversation['assignee_last_seen_at'] = conversation['assignee_last_seen_at']
|
||||||
|
new_conversation['contact_last_seen_at'] = conversation['contact_last_seen_at']
|
||||||
|
new_conversation['custom_attributes'] = conversation['custom_attributes']
|
||||||
|
new_conversation['first_reply_created_at'] = conversation['first_reply_created_at']
|
||||||
|
new_conversation['identifier'] = conversation['identifier']
|
||||||
|
new_conversation['last_activity_at'] = conversation['last_activity_at']
|
||||||
|
new_conversation['snoozed_until'] = conversation['snoozed_until']
|
||||||
|
new_conversation['status'] = conversation['status']
|
||||||
|
new_conversation['uuid'] = SecureRandom.uuid
|
||||||
|
new_conversation['created_at'] = conversation['created_at']
|
||||||
|
new_conversation['updated_at'] = conversation['updated_at']
|
||||||
|
new_conversation['account_id'] = conversation['account_id']
|
||||||
|
new_conversation['assignee_id'] = user_id
|
||||||
|
new_conversation['campaign_id'] = nil
|
||||||
|
new_conversation['contact_id'] = contact_id
|
||||||
|
new_conversation['inbox_id'] = inbox_id
|
||||||
|
new_conversation['team_id'] = nil
|
||||||
|
|
||||||
|
new_conversation['additional_attributes'] = append_migrated_id(new_conversation['additional_attributes'], conversation['id'])
|
||||||
|
new_conversation['custom_attributes'] = preprare_json(new_conversation['custom_attributes'])
|
||||||
|
data.push(new_conversation)
|
||||||
|
iterator += 1
|
||||||
|
end
|
||||||
|
account.conversations.insert_all(data)
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_messages_to_account
|
||||||
|
contact_map = prepare_contact_map
|
||||||
|
conversation_map = prepare_conversation_map
|
||||||
|
user_map = prepare_user_map
|
||||||
|
|
||||||
|
filename = 'export/messages.csv'
|
||||||
|
iterator = 1
|
||||||
|
data = []
|
||||||
|
CSV.foreach(filename, headers: true) do |row|
|
||||||
|
if iterator > 1000
|
||||||
|
iterator = 1
|
||||||
|
account.messages.insert_all(data)
|
||||||
|
log_to_console('INSERT_MESSAGES', data.last['additional_attributes'][:migrated_id])
|
||||||
|
data = []
|
||||||
|
end
|
||||||
|
message = row.to_hash
|
||||||
|
# log_to_console('PREPARING_MESSAGE', message["id"])
|
||||||
|
conversation_id = conversation_map[message['conversation_id']]
|
||||||
|
|
||||||
|
next if conversation_id.blank?
|
||||||
|
|
||||||
|
new_message = {}
|
||||||
|
new_message['content'] = message['content']
|
||||||
|
new_message['content_attributes'] = message['content_attributes']
|
||||||
|
new_message['content_type'] = message['content_type']
|
||||||
|
new_message['external_source_ids'] = message['external_source_ids']
|
||||||
|
new_message['message_type'] = message['message_type']
|
||||||
|
new_message['private'] = message['private']
|
||||||
|
new_message['sender_type'] = message['sender_type']
|
||||||
|
new_message['status'] = message['status']
|
||||||
|
new_message['created_at'] = message['created_at']
|
||||||
|
new_message['updated_at'] = message['updated_at']
|
||||||
|
new_message['inbox_id'] = inbox_id
|
||||||
|
new_message['source_id'] = message['source_id']
|
||||||
|
new_message['conversation_id'] = conversation_id
|
||||||
|
|
||||||
|
sender_id = nil
|
||||||
|
if new_message['sender_type'] == 'Contact' && contact_map[message['sender_id']]
|
||||||
|
sender_id = contact_map[message['sender_id']]
|
||||||
|
elsif new_message['sender_type'] == 'User' && user_map[message['sender_id']]
|
||||||
|
sender_id = user_map[message['sender_id']]
|
||||||
|
end
|
||||||
|
|
||||||
|
new_message['sender_id'] = sender_id
|
||||||
|
new_message['additional_attributes'] = append_migrated_id(new_message['additional_attributes'], message['id'])
|
||||||
|
new_message['content_attributes'] = preprare_json(new_message['content_attributes'])
|
||||||
|
new_message['external_source_ids'] = preprare_json(new_message['external_source_ids'])
|
||||||
|
|
||||||
|
data.push(new_message)
|
||||||
|
iterator += 1
|
||||||
|
end
|
||||||
|
account.messages.insert_all(data)
|
||||||
|
end
|
||||||
|
|
||||||
|
def preprare_json(content)
|
||||||
|
if content
|
||||||
|
JSON.parse(content)
|
||||||
|
else
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def append_migrated_id(content, migrated_id)
|
||||||
|
if content
|
||||||
|
additional_attributes = JSON.parse(content)
|
||||||
|
additional_attributes.merge({ migrated_id: migrated_id })
|
||||||
|
else
|
||||||
|
{ migrated_id: migrated_id }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def log_to_console(type, id)
|
||||||
|
print "#{Time.now} [#{type}]: #{id}\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_contact_map
|
||||||
|
contact_map = {}
|
||||||
|
account.contacts.find_in_batches do |contact_batch|
|
||||||
|
contact_batch.each do |contact|
|
||||||
|
contact_map[contact.additional_attributes['migrated_id']] = contact.id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
log_to_console('PREPARE_CONTACT_MAP', '')
|
||||||
|
contact_map
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_user_map
|
||||||
|
user_map = {}
|
||||||
|
account.users.find_in_batches do |user_batch|
|
||||||
|
user_batch.each do |user|
|
||||||
|
user_map[user.custom_attributes['migrated_id']] = user.id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
log_to_console('PREPARE_USER_MAP', user_map)
|
||||||
|
user_map
|
||||||
|
end
|
||||||
|
|
||||||
|
def prepare_conversation_map
|
||||||
|
conversation_map = {}
|
||||||
|
account.conversations.find_in_batches do |conversation_batch|
|
||||||
|
conversation_batch.each do |conversation|
|
||||||
|
conversation_map[conversation.additional_attributes['migrated_id']] = conversation.id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
log_to_console('PREPARE_CONVERSATION_MAP', '')
|
||||||
|
conversation_map
|
||||||
|
end
|
||||||
|
|
||||||
|
def account
|
||||||
|
@account ||= Account.find(account_id)
|
||||||
|
end
|
||||||
|
end
|
10
lib/tasks/import_to_cloud.rake
Normal file
10
lib/tasks/import_to_cloud.rake
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
namespace :import do
|
||||||
|
desc 'import to cloud with account_id inbox_id'
|
||||||
|
task :build, [:account_id, :inbox_id, :type, :password] => :environment do |_t, args|
|
||||||
|
MigrateToCloud::ImportToCloud.new(
|
||||||
|
account_id: args.account_id,
|
||||||
|
inbox_id: args.inbox_id,
|
||||||
|
password: args.password
|
||||||
|
).perform(args.type)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue