Chatwoot/lib/migrate_to_cloud/import_to_cloud.rb
2022-06-04 19:33:04 +05:30

265 lines
9.1 KiB
Ruby

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 '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_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