184 lines
6.4 KiB
Ruby
184 lines
6.4 KiB
Ruby
|
|
# rubocop:disable Metrics/BlockLength
|
|||
|
|
namespace :search do
|
|||
|
|
desc 'Create test messages for advanced search manual testing across multiple inboxes'
|
|||
|
|
task setup_test_data: :environment do
|
|||
|
|
puts '🔍 Setting up test data for advanced search...'
|
|||
|
|
|
|||
|
|
account = Account.first
|
|||
|
|
unless account
|
|||
|
|
puts '❌ No account found. Please create an account first.'
|
|||
|
|
exit 1
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
agents = account.users.to_a
|
|||
|
|
unless agents.any?
|
|||
|
|
puts '❌ No agents found. Please create users first.'
|
|||
|
|
exit 1
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
puts "✅ Using account: #{account.name} (ID: #{account.id})"
|
|||
|
|
puts "✅ Found #{agents.count} agent(s)"
|
|||
|
|
|
|||
|
|
# Create missing inbox types for comprehensive testing
|
|||
|
|
puts "\n📥 Checking and creating inboxes..."
|
|||
|
|
|
|||
|
|
# API inbox
|
|||
|
|
unless account.inboxes.exists?(channel_type: 'Channel::Api')
|
|||
|
|
puts ' Creating API inbox...'
|
|||
|
|
account.inboxes.create!(
|
|||
|
|
name: 'Search Test API',
|
|||
|
|
channel: Channel::Api.create!(account: account)
|
|||
|
|
)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
# Web Widget inbox
|
|||
|
|
unless account.inboxes.exists?(channel_type: 'Channel::WebWidget')
|
|||
|
|
puts ' Creating WebWidget inbox...'
|
|||
|
|
account.inboxes.create!(
|
|||
|
|
name: 'Search Test WebWidget',
|
|||
|
|
channel: Channel::WebWidget.create!(account: account, website_url: 'https://example.com')
|
|||
|
|
)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
# Email inbox
|
|||
|
|
unless account.inboxes.exists?(channel_type: 'Channel::Email')
|
|||
|
|
puts ' Creating Email inbox...'
|
|||
|
|
account.inboxes.create!(
|
|||
|
|
name: 'Search Test Email',
|
|||
|
|
channel: Channel::Email.create!(
|
|||
|
|
account: account,
|
|||
|
|
email: 'search-test@example.com',
|
|||
|
|
imap_enabled: false,
|
|||
|
|
smtp_enabled: false
|
|||
|
|
)
|
|||
|
|
)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
inboxes = account.inboxes.to_a
|
|||
|
|
puts "✅ Using #{inboxes.count} inbox(es):"
|
|||
|
|
inboxes.each { |i| puts " - #{i.name} (ID: #{i.id}, Type: #{i.channel_type})" }
|
|||
|
|
|
|||
|
|
# Create 10 test contacts
|
|||
|
|
contacts = []
|
|||
|
|
10.times do |i|
|
|||
|
|
contacts << account.contacts.find_or_create_by!(
|
|||
|
|
email: "test-customer-#{i}@example.com"
|
|||
|
|
) do |c|
|
|||
|
|
c.name = Faker::Name.name
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
puts "✅ Created/found #{contacts.count} test contacts"
|
|||
|
|
|
|||
|
|
target_messages = 50_000
|
|||
|
|
messages_per_conversation = 100
|
|||
|
|
total_conversations = target_messages / messages_per_conversation
|
|||
|
|
|
|||
|
|
puts "\n📝 Creating #{target_messages} messages across #{total_conversations} conversations..."
|
|||
|
|
puts " Distribution: #{inboxes.count} inboxes × #{total_conversations / inboxes.count} conversations each"
|
|||
|
|
|
|||
|
|
start_time = 2.years.ago
|
|||
|
|
end_time = Time.current
|
|||
|
|
time_range = end_time - start_time
|
|||
|
|
|
|||
|
|
created_count = 0
|
|||
|
|
failed_count = 0
|
|||
|
|
conversations_per_inbox = total_conversations / inboxes.count
|
|||
|
|
conversation_statuses = [:open, :resolved]
|
|||
|
|
|
|||
|
|
inboxes.each do |inbox|
|
|||
|
|
conversations_per_inbox.times do
|
|||
|
|
# Pick random contact and agent for this conversation
|
|||
|
|
contact = contacts.sample
|
|||
|
|
agent = agents.sample
|
|||
|
|
|
|||
|
|
# Create or find ContactInbox
|
|||
|
|
contact_inbox = ContactInbox.find_or_create_by!(
|
|||
|
|
contact: contact,
|
|||
|
|
inbox: inbox
|
|||
|
|
) do |ci|
|
|||
|
|
ci.source_id = "test_#{SecureRandom.hex(8)}"
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
# Create conversation
|
|||
|
|
conversation = inbox.conversations.create!(
|
|||
|
|
account: account,
|
|||
|
|
contact: contact,
|
|||
|
|
inbox: inbox,
|
|||
|
|
contact_inbox: contact_inbox,
|
|||
|
|
status: conversation_statuses.sample
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# Create messages for this conversation (50 incoming, 50 outgoing)
|
|||
|
|
50.times do
|
|||
|
|
random_time = start_time + (rand * time_range)
|
|||
|
|
|
|||
|
|
# Incoming message from contact
|
|||
|
|
begin
|
|||
|
|
Message.create!(
|
|||
|
|
content: Faker::Movie.quote,
|
|||
|
|
account: account,
|
|||
|
|
inbox: inbox,
|
|||
|
|
conversation: conversation,
|
|||
|
|
message_type: :incoming,
|
|||
|
|
sender: contact,
|
|||
|
|
created_at: random_time,
|
|||
|
|
updated_at: random_time
|
|||
|
|
)
|
|||
|
|
created_count += 1
|
|||
|
|
rescue StandardError => e
|
|||
|
|
failed_count += 1
|
|||
|
|
puts "❌ Failed to create message: #{e.message}" if failed_count <= 5
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
# Outgoing message from agent
|
|||
|
|
begin
|
|||
|
|
Message.create!(
|
|||
|
|
content: Faker::Movie.quote,
|
|||
|
|
account: account,
|
|||
|
|
inbox: inbox,
|
|||
|
|
conversation: conversation,
|
|||
|
|
message_type: :outgoing,
|
|||
|
|
sender: agent,
|
|||
|
|
created_at: random_time + rand(60..600),
|
|||
|
|
updated_at: random_time + rand(60..600)
|
|||
|
|
)
|
|||
|
|
created_count += 1
|
|||
|
|
rescue StandardError => e
|
|||
|
|
failed_count += 1
|
|||
|
|
puts "❌ Failed to create message: #{e.message}" if failed_count <= 5
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
print "\r🔄 Progress: #{created_count}/#{target_messages} messages created..." if (created_count % 500).zero?
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
puts "\n\n✅ Successfully created #{created_count} messages!"
|
|||
|
|
puts "❌ Failed: #{failed_count}" if failed_count.positive?
|
|||
|
|
|
|||
|
|
puts "\n📊 Summary:"
|
|||
|
|
puts " - Total messages: #{Message.where(account: account).count}"
|
|||
|
|
puts " - Total conversations: #{Conversation.where(account: account).count}"
|
|||
|
|
|
|||
|
|
min_date = Message.where(account: account).minimum(:created_at)&.strftime('%Y-%m-%d')
|
|||
|
|
max_date = Message.where(account: account).maximum(:created_at)&.strftime('%Y-%m-%d')
|
|||
|
|
puts " - Date range: #{min_date} to #{max_date}"
|
|||
|
|
puts "\nBreakdown by inbox:"
|
|||
|
|
inboxes.each do |inbox|
|
|||
|
|
msg_count = Message.where(inbox: inbox).count
|
|||
|
|
conv_count = Conversation.where(inbox: inbox).count
|
|||
|
|
puts " - #{inbox.name} (#{inbox.channel_type}): #{msg_count} messages, #{conv_count} conversations"
|
|||
|
|
end
|
|||
|
|
puts "\nBreakdown by sender type:"
|
|||
|
|
puts " - Incoming (from contacts): #{Message.where(account: account, message_type: :incoming).count}"
|
|||
|
|
puts " - Outgoing (from agents): #{Message.where(account: account, message_type: :outgoing).count}"
|
|||
|
|
|
|||
|
|
puts "\n🔧 Next steps:"
|
|||
|
|
puts ' 1. Ensure OpenSearch is running: mise elasticsearch-start'
|
|||
|
|
puts ' 2. Reindex messages: rails runner "Message.search_index.import Message.all"'
|
|||
|
|
puts " 3. Enable feature: rails runner \"Account.find(#{account.id}).enable_features('advanced_search')\""
|
|||
|
|
puts "\n💡 Then test the search with filters via API or Rails console!"
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
# rubocop:enable Metrics/BlockLength
|