mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 02:57:57 +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
	 Sojan Jose
					Sojan Jose