Skip to content

Commit 87d41c1

Browse files
committed
Add task to import current permissions
This commit introduces a simple rake task that imports the Permission Sets to the DB, then iterates over the defined permissions on AppConfiguration to create the RolePermissions.
1 parent b929912 commit 87d41c1

2 files changed

Lines changed: 86 additions & 0 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# frozen_string_literal: true
2+
3+
namespace :solidus do
4+
desc "Import existing permission sets to role permissions table"
5+
task import_existing_permission_sets: :environment do
6+
Zeitwerk::Loader.eager_load_all unless Rails.env.test?
7+
8+
ActiveRecord::Base.transaction do
9+
Spree::PermissionSets::Base.descendants.each do |permission|
10+
Spree::PermissionSet.find_or_create_by(name: permission.to_s, group: permission.to_s.split("PermissionSets::").last.gsub(/Display|Management/i, ""))
11+
end
12+
13+
Spree::AppConfiguration.new.roles.roles.each do |role_name, role_config|
14+
role_config.permission_sets.each do |set|
15+
role = Spree::Role.find_or_create_by(name: role_name)
16+
permission_set = Spree::PermissionSet.find_by(name: set.name)
17+
18+
if permission_set
19+
Spree::RolePermission.find_or_create_by!(
20+
role: role,
21+
permission_set: permission_set
22+
)
23+
else
24+
puts "#{set} was not found."
25+
end
26+
end
27+
end
28+
end
29+
end
30+
end
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
path = Spree::Core::Engine.root.join('lib/tasks/solidus/import_existing_permission_sets.rake')
6+
7+
RSpec.describe 'solidus' do
8+
describe 'import_existing_permission_sets' do
9+
include_context(
10+
'rake',
11+
task_path: path,
12+
task_name: 'solidus:import_existing_permission_sets'
13+
)
14+
15+
it 'creates permission sets' do
16+
expect(Spree::PermissionSet.pluck(:name)).to eq([])
17+
18+
task.invoke
19+
20+
expect(Spree::PermissionSet.pluck(:name)).to eq(Spree::PermissionSets::Base.subclasses.map(&:to_s))
21+
end
22+
23+
context 'when there is a custom role' do
24+
let(:role_name) { :customer_service }
25+
let(:permissions) { ['Spree::PermissionSets::OrderDisplay', 'Spree::PermissionSets::UserDisplay', 'Spree::PermissionSets::ProductDisplay'] }
26+
27+
before do
28+
roles = Spree::RoleConfiguration.new.tap do |role|
29+
role.assign_permissions :default, ['Spree::PermissionSets::DefaultCustomer']
30+
role.assign_permissions :admin, ['Spree::PermissionSets::SuperUser']
31+
role.assign_permissions role_name, permissions
32+
end
33+
34+
allow_any_instance_of(Spree::AppConfiguration).to receive(:roles).and_return(roles)
35+
end
36+
37+
it 'creates the new role with permissions' do
38+
expect(Spree::Role.find_by(name: role_name.to_s)).not_to be_present
39+
40+
task.invoke
41+
42+
role = Spree::Role.find_by(name: role_name.to_s)
43+
expect(role).to be_present
44+
expect(role.permission_sets.pluck(:name)).to match_array(permissions)
45+
end
46+
end
47+
48+
context 'when permission set is not found' do
49+
it 'prints out the missing permission set' do
50+
allow(Spree::PermissionSet).to receive(:find_by).and_return(nil)
51+
52+
expect { task.invoke }.to output(a_string_including('Spree::PermissionSets::DefaultCustomer')).to_stdout
53+
end
54+
end
55+
end
56+
end

0 commit comments

Comments
 (0)