From 4ab0b17e6eade028f56bbbe56cc3e7051414b4b6 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Thu, 29 May 2025 15:17:20 -0600 Subject: [PATCH] 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. --- lib/seeders/account_seeder.rb | 53 +++++++++++++++++++++++++++++------ lib/seeders/seed_data.yml | 43 ++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 8 deletions(-) diff --git a/lib/seeders/account_seeder.rb b/lib/seeders/account_seeder.rb index 802a02dbf..ba46638c5 100644 --- a/lib/seeders/account_seeder.rb +++ b/lib/seeders/account_seeder.rb @@ -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)) diff --git a/lib/seeders/seed_data.yml b/lib/seeders/seed_data.yml index 6ca79467f..08cb5549b 100644 --- a/lib/seeders/seed_data.yml +++ b/lib/seeders/seed_data.yml @@ -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'