diff --git a/src/Database/Document.php b/src/Database/Document.php index 2c3531e76..93416243f 100644 --- a/src/Database/Document.php +++ b/src/Database/Document.php @@ -79,7 +79,7 @@ public function getCollection(): string */ public function getPermissions(): array { - return \array_unique($this->getAttribute('$permissions', [])); + return \array_values(\array_unique($this->getAttribute('$permissions', []))); } /** diff --git a/src/Database/Helpers/Permission.php b/src/Database/Helpers/Permission.php index bb850cc6a..82113223b 100644 --- a/src/Database/Helpers/Permission.php +++ b/src/Database/Helpers/Permission.php @@ -170,7 +170,7 @@ public static function aggregate(?array $permissions, array $allowed = Database: } } } - return $mutated; + return \array_values(\array_unique($mutated)); } /** diff --git a/tests/Database/PermissionTest.php b/tests/Database/PermissionTest.php index 531002bed..a69b2a604 100644 --- a/tests/Database/PermissionTest.php +++ b/tests/Database/PermissionTest.php @@ -284,5 +284,23 @@ public function testAggregation(): void $parsed = Permission::aggregate($permissions, [Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE]); $this->assertEquals(['update("any")', 'delete("any")'], $parsed); + + $permissions = [ + 'read("any")', + 'read("user:123")', + 'read("user:123")', + 'write("user:123")', + 'update("user:123")', + 'delete("user:123")' + ]; + + $parsed = Permission::aggregate($permissions, Database::PERMISSIONS); + $this->assertEquals([ + 'read("any")', + 'read("user:123")', + 'create("user:123")', + 'update("user:123")', + 'delete("user:123")', + ], $parsed); } } diff --git a/tests/Database/Validator/PermissionsTest.php b/tests/Database/Validator/PermissionsTest.php index a42b10910..c981b92fe 100644 --- a/tests/Database/Validator/PermissionsTest.php +++ b/tests/Database/Validator/PermissionsTest.php @@ -297,4 +297,46 @@ public function testInvalidPermissions(): void $this->assertFalse($object->isValid($permissions)); $this->assertEquals('You can only provide up to 100 permissions.', $object->getDescription()); } + + /* + * Test for checking duplicate methods input. The getPermissions should return an a list array + */ + public function testDuplicateMethods(): void + { + $validator = new Permissions(); + + $user = ID::unique(); + + $document = new Document([ + '$id' => uniqid(), + '$collection' => uniqid(), + '$permissions' => [ + Permission::read(Role::any()), + Permission::read(Role::user($user)), + Permission::read(Role::user($user)), + Permission::write(Role::user($user)), + Permission::update(Role::user($user)), + Permission::delete(Role::user($user)), + ], + 'title' => 'This is a test.', + 'list' => [ + 'one' + ], + 'children' => [ + new Document(['name' => 'x']), + new Document(['name' => 'y']), + new Document(['name' => 'z']), + ] + ]); + $this->assertTrue($validator->isValid($document->getPermissions())); + $permissions = $document->getPermissions(); + $this->assertEquals(5, count($permissions)); + $this->assertEquals([ + 'read("any")', + 'read("user:' . $user . '")', + 'write("user:' . $user . '")', + 'update("user:' . $user . '")', + 'delete("user:' . $user . '")', + ], $permissions); + } }