Do not remove AccountRole completely
This commit is contained in:
parent
532c4dae2c
commit
bb54a03c2d
|
@ -12,7 +12,9 @@ class Account < ApplicationRecord
|
|||
|
||||
self.adapter = Rolify::Adapter::Base.create 'role_adapter', role_cname, name
|
||||
|
||||
has_many :account_roles, dependent: :restrict_with_exception
|
||||
has_many :account_roles,
|
||||
-> { where deleted_at: nil },
|
||||
dependent: :restrict_with_exception
|
||||
|
||||
has_many :roles, through: :account_roles
|
||||
|
||||
|
@ -64,6 +66,12 @@ class Account < ApplicationRecord
|
|||
super
|
||||
end
|
||||
|
||||
def remove_role(role_name, resource = nil)
|
||||
role = self.class.role_class.find_by name: role_name, resource: resource
|
||||
return if role.nil?
|
||||
account_roles.where(role: role).update_all(deleted_at: Time.zone.now)
|
||||
end
|
||||
|
||||
def can_access_sidekiq_web_interface?
|
||||
is_superuser?
|
||||
end
|
||||
|
|
|
@ -5,7 +5,9 @@ class Role < ApplicationRecord
|
|||
superuser
|
||||
].map(&:freeze).freeze
|
||||
|
||||
has_many :account_roles, dependent: :restrict_with_exception
|
||||
has_many :account_roles,
|
||||
-> { where deleted_at: nil },
|
||||
dependent: :restrict_with_exception
|
||||
|
||||
has_many :accounts, through: :account_roles
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddDeletedAtToAccountRoles < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
add_column :account_roles, :deleted_at, :datetime
|
||||
end
|
||||
end
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2019_02_01_214347) do
|
||||
ActiveRecord::Schema.define(version: 2019_02_02_041009) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
@ -20,6 +20,7 @@ ActiveRecord::Schema.define(version: 2019_02_01_214347) do
|
|||
t.datetime "updated_at", null: false
|
||||
t.bigint "account_id", null: false
|
||||
t.bigint "role_id", null: false
|
||||
t.datetime "deleted_at"
|
||||
t.index ["account_id", "role_id"], name: "index_account_roles_on_account_id_and_role_id", unique: true
|
||||
t.index ["account_id"], name: "index_account_roles_on_account_id"
|
||||
t.index ["role_id"], name: "index_account_roles_on_role_id"
|
||||
|
|
|
@ -131,9 +131,9 @@ RSpec.describe Account do
|
|||
describe '#remove_role' do
|
||||
subject { create :usual_account }
|
||||
|
||||
before do
|
||||
subject.add_role :superuser
|
||||
end
|
||||
let(:role) { subject.add_role :superuser }
|
||||
|
||||
let!(:account_role) { role.account_roles.last }
|
||||
|
||||
let(:result) { subject.remove_role :superuser }
|
||||
|
||||
|
@ -145,12 +145,34 @@ RSpec.describe Account do
|
|||
expect { result }.to change { subject.account_roles.reload.count }.by(-1)
|
||||
end
|
||||
|
||||
specify do
|
||||
expect { result }.to change { role.accounts.reload.count }.by(-1)
|
||||
end
|
||||
|
||||
specify do
|
||||
expect { result }.to change { role.account_roles.reload.count }.by(-1)
|
||||
end
|
||||
|
||||
specify do
|
||||
expect { result }.not_to change { Role.count }
|
||||
end
|
||||
|
||||
specify do
|
||||
expect { result }.to change { AccountRole.count }.by(-1)
|
||||
expect { result }.not_to change { AccountRole.count }
|
||||
end
|
||||
|
||||
specify do
|
||||
expect { result }.not_to \
|
||||
change { account_role.reload.account }.from(subject)
|
||||
end
|
||||
|
||||
specify do
|
||||
expect { result }.not_to change { account_role.reload.role }.from(role)
|
||||
end
|
||||
|
||||
specify do
|
||||
expect { result }.to change { account_role.reload.deleted_at }.from(nil)
|
||||
expect(account_role.deleted_at).to be_within(10).of(Time.zone.now)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Reference in New Issue