mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-30 18:47:51 +00:00
feat: add custom roles seeding to account seeder (#11623)
Introduce custom roles in account seed data to support testing of realistic role-based access scenarios. Includes six distinct roles with varied permission sets and assigns them to multiple users for comprehensive test coverage.
This commit is contained in:
@@ -19,6 +19,7 @@ class Seeders::AccountSeeder
|
||||
def perform!
|
||||
set_up_account
|
||||
seed_teams
|
||||
seed_custom_roles
|
||||
set_up_users
|
||||
seed_labels
|
||||
seed_canned_responses
|
||||
@@ -32,6 +33,7 @@ class Seeders::AccountSeeder
|
||||
@account.labels.destroy_all
|
||||
@account.inboxes.destroy_all
|
||||
@account.contacts.destroy_all
|
||||
@account.custom_roles.destroy_all if @account.respond_to?(:custom_roles)
|
||||
end
|
||||
|
||||
def seed_teams
|
||||
@@ -40,6 +42,18 @@ class Seeders::AccountSeeder
|
||||
end
|
||||
end
|
||||
|
||||
def seed_custom_roles
|
||||
return unless @account_data['custom_roles'].present? && @account.respond_to?(:custom_roles)
|
||||
|
||||
@account_data['custom_roles'].each do |role_data|
|
||||
@account.custom_roles.create!(
|
||||
name: role_data['name'],
|
||||
description: role_data['description'],
|
||||
permissions: role_data['permissions']
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def seed_labels
|
||||
@account_data['labels'].each do |label|
|
||||
@account.labels.create!(label)
|
||||
@@ -48,17 +62,34 @@ class Seeders::AccountSeeder
|
||||
|
||||
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'])
|
||||
user_record = create_user_record(user)
|
||||
create_account_user(user_record, user)
|
||||
add_user_to_teams(user: user_record, teams: user['team']) if user['team'].present?
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_user_record(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']}")
|
||||
user_record
|
||||
end
|
||||
|
||||
def create_account_user(user_record, user)
|
||||
account_user_attrs = build_account_user_attrs(user)
|
||||
AccountUser.create_with(account_user_attrs).find_or_create_by!(account_id: @account.id, user_id: user_record.id)
|
||||
end
|
||||
|
||||
def build_account_user_attrs(user)
|
||||
attrs = { role: (user['role'] || 'agent') }
|
||||
custom_role = find_custom_role(user['custom_role']) if user['custom_role'].present?
|
||||
attrs[:custom_role] = custom_role if custom_role
|
||||
attrs
|
||||
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?
|
||||
@@ -66,6 +97,12 @@ class Seeders::AccountSeeder
|
||||
end
|
||||
end
|
||||
|
||||
def find_custom_role(role_name)
|
||||
return nil unless @account.respond_to?(:custom_roles)
|
||||
|
||||
@account.custom_roles.find_by(name: role_name)
|
||||
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))
|
||||
|
||||
@@ -61,41 +61,49 @@ users:
|
||||
email: 'karn@paperlayer.test'
|
||||
team:
|
||||
- 'Sales'
|
||||
custom_role: 'Sales Representative'
|
||||
- name: 'Danny Cordray'
|
||||
gender: female
|
||||
email: 'danny@paperlayer.test'
|
||||
team:
|
||||
- 'Sales'
|
||||
custom_role: 'Customer Support Lead'
|
||||
- name: 'Ben Nugent'
|
||||
gender: male
|
||||
email: 'ben@paperlayer.test'
|
||||
team:
|
||||
- 'Sales'
|
||||
custom_role: 'Junior Agent'
|
||||
- name: 'Todd Packer'
|
||||
gender: male
|
||||
email: 'todd@paperlayer.test'
|
||||
team:
|
||||
- 'Sales'
|
||||
custom_role: 'Sales Representative'
|
||||
- name: 'Cathy Simms'
|
||||
gender: female
|
||||
email: 'cathy@paperlayer.test'
|
||||
team:
|
||||
- 'Administration'
|
||||
custom_role: 'Knowledge Manager'
|
||||
- name: 'Hunter Jo'
|
||||
gender: male
|
||||
email: 'hunter@paperlayer.test'
|
||||
team:
|
||||
- 'Administration'
|
||||
custom_role: 'Analytics Specialist'
|
||||
- name: 'Rolando Silva'
|
||||
gender: male
|
||||
email: 'rolando@paperlayer.test'
|
||||
team:
|
||||
- 'Administration'
|
||||
custom_role: 'Junior Agent'
|
||||
- name: 'Stephanie Wilson'
|
||||
gender: female
|
||||
email: 'stephanie@paperlayer.test'
|
||||
team:
|
||||
- 'Administration'
|
||||
custom_role: 'Escalation Handler'
|
||||
- name: 'Jordan Garfield'
|
||||
gender: male
|
||||
email: 'jorodan@paperlayer.test'
|
||||
@@ -111,6 +119,7 @@ users:
|
||||
email: 'lonny@paperlayer.test'
|
||||
team:
|
||||
- 'Warehouse'
|
||||
custom_role: 'Customer Support Lead'
|
||||
- name: 'Madge Madsen'
|
||||
gender: female
|
||||
email: 'madge@paperlayer.test'
|
||||
@@ -162,6 +171,7 @@ users:
|
||||
- name: 'Devon White'
|
||||
gender: male
|
||||
email: 'devon@paperlayer.test'
|
||||
custom_role: 'Escalation Handler'
|
||||
- name: 'Kendall'
|
||||
gender: male
|
||||
email: 'kendall@paperlayer.test'
|
||||
@@ -173,6 +183,39 @@ teams:
|
||||
- '💼 Management'
|
||||
- '👩💼 Administration'
|
||||
- '🚛 Warehouse'
|
||||
custom_roles:
|
||||
- name: 'Customer Support Lead'
|
||||
description: 'Lead support agent with full conversation and contact management'
|
||||
permissions:
|
||||
- 'conversation_manage'
|
||||
- 'contact_manage'
|
||||
- 'report_manage'
|
||||
- name: 'Sales Representative'
|
||||
description: 'Sales team member with conversation and contact access'
|
||||
permissions:
|
||||
- 'conversation_unassigned_manage'
|
||||
- 'conversation_participating_manage'
|
||||
- 'contact_manage'
|
||||
- name: 'Knowledge Manager'
|
||||
description: 'Manages knowledge base and participates in conversations'
|
||||
permissions:
|
||||
- 'knowledge_base_manage'
|
||||
- 'conversation_participating_manage'
|
||||
- name: 'Junior Agent'
|
||||
description: 'Entry-level agent with basic conversation access'
|
||||
permissions:
|
||||
- 'conversation_participating_manage'
|
||||
- name: 'Analytics Specialist'
|
||||
description: 'Focused on reports and data analysis'
|
||||
permissions:
|
||||
- 'report_manage'
|
||||
- 'conversation_participating_manage'
|
||||
- name: 'Escalation Handler'
|
||||
description: 'Handles unassigned conversations and escalations'
|
||||
permissions:
|
||||
- 'conversation_unassigned_manage'
|
||||
- 'conversation_participating_manage'
|
||||
- 'contact_manage'
|
||||
labels:
|
||||
- title: 'billing'
|
||||
color: '#28AD21'
|
||||
|
||||
Reference in New Issue
Block a user