diff --git a/src/Adapters/DatabaseAdapter.php b/src/Adapters/DatabaseAdapter.php index 9c8a1be..a5bf8a5 100755 --- a/src/Adapters/DatabaseAdapter.php +++ b/src/Adapters/DatabaseAdapter.php @@ -224,6 +224,24 @@ class DatabaseAdapter implements DatabaseAdapterContract, BatchDatabaseAdapterCo Rule::fireModelEvent('saved'); } + /** + * UpdatePolicies updates some policy rules to storage, like db, redis. + * + * @param string $sec + * @param string $ptype + * @param string[][] $oldRules + * @param string[][] $newRules + * @return void + */ + public function updatePolicies(string $sec, string $ptype, array $oldRules, array $newRules): void + { + DB::transaction(function () use ($sec, $ptype, $oldRules, $newRules) { + foreach ($oldRules as $i => $oldRule) { + $this->updatePolicy($sec, $ptype, $oldRule, $newRules[$i]); + } + }); + } + /** * Loads only policy rules that match the filter. * diff --git a/tests/DatabaseAdapterTest.php b/tests/DatabaseAdapterTest.php index 9fe0459..6e1ce7e 100644 --- a/tests/DatabaseAdapterTest.php +++ b/tests/DatabaseAdapterTest.php @@ -131,6 +131,34 @@ class DatabaseAdapterTest extends TestCase ], Enforcer::getPolicy()); } + public function testUpdatePolicies() + { + $this->assertEquals([ + ['alice', 'data1', 'read'], + ['bob', 'data2', 'write'], + ['data2_admin', 'data2', 'read'], + ['data2_admin', 'data2', 'write'], + ], Enforcer::getPolicy()); + + $oldPolicies = [ + ['alice', 'data1', 'read'], + ['bob', 'data2', 'write'] + ]; + $newPolicies = [ + ['alice', 'data1', 'write'], + ['bob', 'data2', 'read'] + ]; + + Enforcer::updatePolicies($oldPolicies, $newPolicies); + + $this->assertEquals([ + ['alice', 'data1', 'write'], + ['bob', 'data2', 'read'], + ['data2_admin', 'data2', 'read'], + ['data2_admin', 'data2', 'write'], + ], Enforcer::getPolicy()); + } + public function testLoadFilteredPolicy() { $this->initTable();