c8d01a84ce
Introduces the ability to seed sample data into accounts in development and staging. fixes: #3429
105 lines
4 KiB
Ruby
105 lines
4 KiB
Ruby
## Class to generate sample data for a chatwoot test @Account.
|
|
############################################################
|
|
### Usage #####
|
|
#
|
|
# # Seed an account with all data types in this class
|
|
# Seeders::AccountSeeder.new(account: @Account.find(1)).perform!
|
|
#
|
|
#
|
|
############################################################
|
|
|
|
class Seeders::AccountSeeder
|
|
def initialize(account:)
|
|
raise 'Account Seeding is not allowed in production.' if Rails.env.production?
|
|
|
|
@account_data = HashWithIndifferentAccess.new(YAML.safe_load(File.read(Rails.root.join('lib/seeders/seed_data.yml'))))
|
|
@account = account
|
|
end
|
|
|
|
def perform!
|
|
set_up_account
|
|
seed_teams
|
|
set_up_users
|
|
seed_labels
|
|
seed_canned_responses
|
|
seed_inboxes
|
|
seed_contacts
|
|
end
|
|
|
|
def set_up_account
|
|
@account.teams.destroy_all
|
|
@account.conversations.destroy_all
|
|
@account.labels.destroy_all
|
|
@account.inboxes.destroy_all
|
|
@account.contacts.destroy_all
|
|
end
|
|
|
|
def seed_teams
|
|
@account_data['teams'].each do |team_name|
|
|
@account.teams.create!(name: team_name)
|
|
end
|
|
end
|
|
|
|
def seed_labels
|
|
@account_data['labels'].each do |label|
|
|
@account.labels.create!(label)
|
|
end
|
|
end
|
|
|
|
def set_up_users
|
|
@account_data['users'].each do |user|
|
|
user_record = User.create_with(name: user['name'], password: 'Password1!.').find_or_create_by!(email: (user['email']).to_s)
|
|
user_record.skip_confirmation!
|
|
user_record.save!
|
|
Avatar::AvatarFromUrlJob.perform_later(user_record, "https://xsgames.co/randomusers/avatar.php?g=#{user['gender']}")
|
|
AccountUser.create_with(role: (user['role'] || 'agent')).find_or_create_by!(account_id: @account.id, user_id: user_record.id)
|
|
next if user['team'].blank?
|
|
|
|
add_user_to_teams(user: user_record, teams: user['team'])
|
|
end
|
|
end
|
|
|
|
def add_user_to_teams(user:, teams:)
|
|
teams.each do |team|
|
|
team_record = @account.teams.where('name LIKE ?', "%#{team.downcase}%").first if team.present?
|
|
TeamMember.find_or_create_by!(team_id: team_record.id, user_id: user.id) unless team_record.nil?
|
|
end
|
|
end
|
|
|
|
def seed_canned_responses(count: 50)
|
|
count.times do
|
|
@account.canned_responses.create(content: Faker::Quote.fortune_cookie, short_code: Faker::Alphanumeric.alpha(number: 10))
|
|
end
|
|
end
|
|
|
|
def seed_contacts
|
|
@account_data['contacts'].each do |contact_data|
|
|
contact = @account.contacts.create!(contact_data.slice('name', 'email'))
|
|
Avatar::AvatarFromUrlJob.perform_later(contact, "https://xsgames.co/randomusers/avatar.php?g=#{contact_data['gender']}")
|
|
contact_data['conversations'].each do |conversation_data|
|
|
inbox = @account.inboxes.find_by(channel_type: conversation_data['channel'])
|
|
contact_inbox = inbox.contact_inboxes.create!(contact: contact, source_id: (conversation_data['source_id'] || SecureRandom.hex))
|
|
create_conversation(contact_inbox: contact_inbox, conversation_data: conversation_data)
|
|
end
|
|
end
|
|
end
|
|
|
|
def create_conversation(contact_inbox:, conversation_data:)
|
|
assignee = User.find_by(email: conversation_data['assignee']) if conversation_data['assignee'].present?
|
|
conversation = contact_inbox.conversations.create!(account: contact_inbox.inbox.account, contact: contact_inbox.contact,
|
|
inbox: contact_inbox.inbox, assignee: assignee)
|
|
create_messages(conversation: conversation, messages: conversation_data['messages'])
|
|
end
|
|
|
|
def create_messages(conversation:, messages:)
|
|
messages.each do |message_data|
|
|
sender = User.find_by(email: message_data['sender']) if message_data['sender'].present?
|
|
conversation.messages.create!(message_data.slice('content', 'message_type').merge(account: conversation.inbox.account, sender: sender,
|
|
inbox: conversation.inbox))
|
|
end
|
|
end
|
|
|
|
def seed_inboxes
|
|
Seeders::InboxSeeder.new(account: @account, company_data: @account_data[:company]).perform!
|
|
end
|
|
end
|