Created
March 6, 2023 11:27
-
-
Save scmmishra/fbfa5519cd7407bd605864bedd794662 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## 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.' unless ENV.fetch('ENABLE_ACCOUNT_SEEDING', !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)) | |
15.times do | |
create_conversation(contact_inbox: contact_inbox, conversation_data: conversation_data) | |
end | |
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, created_at: Faker::Time.between(from: 8.days.ago, to: Time.zone.now)) | |
create_messages(conversation: conversation, messages: conversation_data['messages']) | |
conversation.update_labels(conversation_data[:labels]) if conversation_data[:labels].present? | |
end | |
def create_messages(conversation:, messages:) | |
# messages.each do |message_data| | |
# sender = find_message_sender(conversation, message_data) | |
# conversation.messages.create!(message_data.slice('content', 'message_type').merge(account: conversation.inbox.account, sender: sender, | |
# inbox: conversation.inbox)) | |
# end | |
3.times do | |
conversation.messages.create!(content: Faker::Quote.fortune_cookie, message_type: 'incoming', account: conversation.inbox.account, | |
sender: conversation.contact, inbox: conversation.inbox, created_at: Faker::Time.between(from: 8.days.ago, to: Time.zone.now)) | |
end | |
3.times do | |
conversation.messages.create!(content: Faker::Quote.fortune_cookie, message_type: 'outgoing', account: conversation.inbox.account, | |
sender: conversation.assignee_id, inbox: conversation.inbox, created_at: Faker::Time.between(from: 8.days.ago, to: Time.zone.now)) | |
end | |
end | |
def find_message_sender(conversation, message_data) | |
if message_data['message_type'] == 'incoming' | |
User.find_by(email: message_data['sender']) if message_data['sender'].present? | |
else | |
conversation.contact | |
end | |
end | |
def seed_inboxes | |
Seeders::InboxSeeder.new(account: @account, company_data: @account_data[:company]).perform! | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment