mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 11:08:04 +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! |   def perform! | ||||||
|     set_up_account |     set_up_account | ||||||
|     seed_teams |     seed_teams | ||||||
|  |     seed_custom_roles | ||||||
|     set_up_users |     set_up_users | ||||||
|     seed_labels |     seed_labels | ||||||
|     seed_canned_responses |     seed_canned_responses | ||||||
| @@ -32,6 +33,7 @@ class Seeders::AccountSeeder | |||||||
|     @account.labels.destroy_all |     @account.labels.destroy_all | ||||||
|     @account.inboxes.destroy_all |     @account.inboxes.destroy_all | ||||||
|     @account.contacts.destroy_all |     @account.contacts.destroy_all | ||||||
|  |     @account.custom_roles.destroy_all if @account.respond_to?(:custom_roles) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def seed_teams |   def seed_teams | ||||||
| @@ -40,6 +42,18 @@ class Seeders::AccountSeeder | |||||||
|     end |     end | ||||||
|   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 |   def seed_labels | ||||||
|     @account_data['labels'].each do |label| |     @account_data['labels'].each do |label| | ||||||
|       @account.labels.create!(label) |       @account.labels.create!(label) | ||||||
| @@ -48,17 +62,34 @@ class Seeders::AccountSeeder | |||||||
|  |  | ||||||
|   def set_up_users |   def set_up_users | ||||||
|     @account_data['users'].each do |user| |     @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 = create_user_record(user) | ||||||
|       user_record.skip_confirmation! |       create_account_user(user_record, user) | ||||||
|       user_record.save! |       add_user_to_teams(user: user_record, teams: user['team']) if user['team'].present? | ||||||
|       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 | ||||||
|   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:) |   def add_user_to_teams(user:, teams:) | ||||||
|     teams.each do |team| |     teams.each do |team| | ||||||
|       team_record = @account.teams.where('name LIKE ?', "%#{team.downcase}%").first if team.present? |       team_record = @account.teams.where('name LIKE ?', "%#{team.downcase}%").first if team.present? | ||||||
| @@ -66,6 +97,12 @@ class Seeders::AccountSeeder | |||||||
|     end |     end | ||||||
|   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) |   def seed_canned_responses(count: 50) | ||||||
|     count.times do |     count.times do | ||||||
|       @account.canned_responses.create(content: Faker::Quote.fortune_cookie, short_code: Faker::Alphanumeric.alpha(number: 10)) |       @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' |     email: 'karn@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Sales' |       - 'Sales' | ||||||
|  |     custom_role: 'Sales Representative' | ||||||
|   - name: 'Danny Cordray' |   - name: 'Danny Cordray' | ||||||
|     gender: female |     gender: female | ||||||
|     email: 'danny@paperlayer.test' |     email: 'danny@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Sales' |       - 'Sales' | ||||||
|  |     custom_role: 'Customer Support Lead' | ||||||
|   - name: 'Ben Nugent' |   - name: 'Ben Nugent' | ||||||
|     gender: male |     gender: male | ||||||
|     email: 'ben@paperlayer.test' |     email: 'ben@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Sales' |       - 'Sales' | ||||||
|  |     custom_role: 'Junior Agent' | ||||||
|   - name: 'Todd Packer' |   - name: 'Todd Packer' | ||||||
|     gender: male |     gender: male | ||||||
|     email: 'todd@paperlayer.test' |     email: 'todd@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Sales' |       - 'Sales' | ||||||
|  |     custom_role: 'Sales Representative' | ||||||
|   - name: 'Cathy Simms' |   - name: 'Cathy Simms' | ||||||
|     gender: female |     gender: female | ||||||
|     email: 'cathy@paperlayer.test' |     email: 'cathy@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Administration' |       - 'Administration' | ||||||
|  |     custom_role: 'Knowledge Manager' | ||||||
|   - name: 'Hunter Jo' |   - name: 'Hunter Jo' | ||||||
|     gender: male |     gender: male | ||||||
|     email: 'hunter@paperlayer.test' |     email: 'hunter@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Administration' |       - 'Administration' | ||||||
|  |     custom_role: 'Analytics Specialist' | ||||||
|   - name: 'Rolando Silva' |   - name: 'Rolando Silva' | ||||||
|     gender: male |     gender: male | ||||||
|     email: 'rolando@paperlayer.test' |     email: 'rolando@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Administration' |       - 'Administration' | ||||||
|  |     custom_role: 'Junior Agent' | ||||||
|   - name: 'Stephanie Wilson' |   - name: 'Stephanie Wilson' | ||||||
|     gender: female |     gender: female | ||||||
|     email: 'stephanie@paperlayer.test' |     email: 'stephanie@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Administration' |       - 'Administration' | ||||||
|  |     custom_role: 'Escalation Handler' | ||||||
|   - name: 'Jordan Garfield' |   - name: 'Jordan Garfield' | ||||||
|     gender: male |     gender: male | ||||||
|     email: 'jorodan@paperlayer.test' |     email: 'jorodan@paperlayer.test' | ||||||
| @@ -111,6 +119,7 @@ users: | |||||||
|     email: 'lonny@paperlayer.test' |     email: 'lonny@paperlayer.test' | ||||||
|     team: |     team: | ||||||
|       - 'Warehouse' |       - 'Warehouse' | ||||||
|  |     custom_role: 'Customer Support Lead' | ||||||
|   - name: 'Madge Madsen' |   - name: 'Madge Madsen' | ||||||
|     gender: female |     gender: female | ||||||
|     email: 'madge@paperlayer.test' |     email: 'madge@paperlayer.test' | ||||||
| @@ -162,6 +171,7 @@ users: | |||||||
|   - name: 'Devon White' |   - name: 'Devon White' | ||||||
|     gender: male |     gender: male | ||||||
|     email: 'devon@paperlayer.test' |     email: 'devon@paperlayer.test' | ||||||
|  |     custom_role: 'Escalation Handler' | ||||||
|   - name: 'Kendall' |   - name: 'Kendall' | ||||||
|     gender: male |     gender: male | ||||||
|     email: 'kendall@paperlayer.test' |     email: 'kendall@paperlayer.test' | ||||||
| @@ -173,6 +183,39 @@ teams: | |||||||
|   - '💼 Management' |   - '💼 Management' | ||||||
|   - '👩💼 Administration' |   - '👩💼 Administration' | ||||||
|   - '🚛 Warehouse' |   - '🚛 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: | labels: | ||||||
|     - title: 'billing' |     - title: 'billing' | ||||||
|       color: '#28AD21' |       color: '#28AD21' | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sojan Jose
					Sojan Jose