From 794c0093b1e0b062bd6d86cb9ff72cab232526a4 Mon Sep 17 00:00:00 2001 From: Mostafa Maklad Date: Thu, 5 Oct 2017 16:44:57 +0300 Subject: [PATCH 1/6] Assign permissions to role in commands --- src/Commands/CreateRole.php | 19 +++++++++++++++---- tests/CommandTest.php | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/Commands/CreateRole.php b/src/Commands/CreateRole.php index 8722765..62f0d55 100644 --- a/src/Commands/CreateRole.php +++ b/src/Commands/CreateRole.php @@ -4,6 +4,7 @@ namespace Maklad\Permission\Commands; use Illuminate\Console\Command; +use Maklad\Permission\Contracts\PermissionInterface as Permission; use Maklad\Permission\Contracts\RoleInterface as Role; /** @@ -14,19 +15,29 @@ class CreateRole extends Command { protected $signature = 'permission:create-role {name : The name of the role} - {guard? : The name of the guard}'; + {guard? : The name of the guard} + {--permission=* : The name of the permission}'; protected $description = 'Create a role'; public function handle() { - $roleClass = \app(Role::class); + $roleClass = \app(Role::class); + $permissionClass = \app(Permission::class); + + $name = $this->argument('name'); + $guard = $this->argument('guard'); + $permissions = $this->option('permission'); $role = $roleClass::create([ - 'name' => $this->argument('name'), - 'guard_name' => $this->argument('guard') + 'name' => $name, + 'guard_name' => $guard ]); $this->info("Role `{$role->name}` created"); + + $role->givePermissionTo($permissions); + $permissions_str = $role->permissions->implode('name', '`, `'); + $this->info("Permissions `{$permissions_str}` has been given to role `{$role->name}`"); } } diff --git a/tests/CommandTest.php b/tests/CommandTest.php index e249946..bf6f523 100644 --- a/tests/CommandTest.php +++ b/tests/CommandTest.php @@ -3,8 +3,8 @@ namespace Maklad\Permission\Test; use Artisan; -use Maklad\Permission\Models\Role; use Maklad\Permission\Models\Permission; +use Maklad\Permission\Models\Role; class CommandTest extends TestCase { @@ -49,4 +49,39 @@ public function it_can_create_a_permission_with_a_specific_guard() ->where('guard_name', 'api') ->get()); } + + /** @test */ + public function it_can_create_a_role_and_assign_permissions() + { + Artisan::call('permission:create-permission', ['name' => 'test1',]); + Artisan::call('permission:create-permission', ['name' => 'test2',]); + Artisan::call('permission:create-role', [ + 'name' => 'new-role', + '--permission' => ['test1', 'test2'] + ]); + + $role = Role::findByName('new-role'); + $this->assertCount(2, $role->permissions); + } + + /** @test */ + public function it_can_create_a_role_with_guard_and_assign_permissions() + { + Artisan::call('permission:create-permission', [ + 'name' => 'test1', + 'guard' => 'api', + ]); + Artisan::call('permission:create-permission', [ + 'name' => 'test2', + 'guard' => 'api', + ]); + Artisan::call('permission:create-role', [ + 'name' => 'new-role', + 'guard' => 'api', + '--permission' => ['test1', 'test2'] + ]); + + $role = Role::findByName('new-role', 'api'); + $this->assertCount(2, $role->permissions); + } } From 133217dece2e38e6e8d7fb37d18fcb6376f8a53c Mon Sep 17 00:00:00 2001 From: Mostafa Maklad Date: Wed, 18 Oct 2017 16:56:41 +0300 Subject: [PATCH 2/6] fix soft deleting --- CHANGELOG.md | 3 +++ README.md | 2 +- composer.json | 12 ++++++------ src/Traits/HasRoles.php | 3 +++ tests/HasPermissionsTest.php | 10 ++++++++++ tests/HasRolesTest.php | 14 ++++++++++++-- tests/SoftDeletingUser.php | 12 ++++++++++++ 7 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 tests/SoftDeletingUser.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 12abbf3..5e9533e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ All Notable changes to `laravel-permission-mongodb` will be documented in this file. +## 1.3.5 - 2017-10-18 + - Fixed a bug where `Role`s and `Permission`s got detached when soft deleting a model + ## 1.3.4 - 2017-09-28 ### added diff --git a/README.md b/README.md index a48cad4..bef3dca 100644 --- a/README.md +++ b/README.md @@ -529,7 +529,7 @@ Route::group(['middleware' => ['role:super-admin','permission:publish articles'] You can protect your controllers similarly, by setting desired middleware in the constructor: ```php -public function __construct +public function __construct() { $this->middleware(['role:super-admin','permission:publish articles|edit articles']); } diff --git a/composer.json b/composer.json index 039dd9d..e0e7984 100644 --- a/composer.json +++ b/composer.json @@ -31,16 +31,16 @@ ], "require": { "php": ">=7.0", - "illuminate/auth": "~5.2.0|~5.3.0|~5.4.0", - "illuminate/container": "~5.2.0|~5.3.0|~5.4.0", - "illuminate/contracts": "~5.2.0|~5.3.0|~5.4.0", - "jenssegers/mongodb": "3.0.*|3.1.*|3.2.*" + "illuminate/auth": "^5.2.0", + "illuminate/container": "^5.2.0", + "illuminate/contracts": "^5.2.0", + "jenssegers/mongodb": "^3.0|3.3.0-alpha" }, "require-dev": { "codeclimate/php-test-reporter": "^0.4.4", "monolog/monolog": "^1.23", - "orchestra/testbench": "~3.2.0|~3.3.0|~3.4.2", - "phpunit/phpunit": "^5.7|^6.3", + "orchestra/testbench": "^3.2.0", + "phpunit/phpunit": "^5.7|^6.0", "squizlabs/php_codesniffer": "^3.1" }, "autoload": { diff --git a/src/Traits/HasRoles.php b/src/Traits/HasRoles.php index bbfbb3b..e626f8f 100644 --- a/src/Traits/HasRoles.php +++ b/src/Traits/HasRoles.php @@ -21,6 +21,9 @@ trait HasRoles public static function bootHasRoles() { static::deleting(function (Model $model) { + if (method_exists($model, 'isForceDeleting') && ! $model->isForceDeleting()) { + return; + } foreach ($model->roles as $role) { $role->users()->detach($model); } diff --git a/tests/HasPermissionsTest.php b/tests/HasPermissionsTest.php index 1cb546d..6b84a3a 100644 --- a/tests/HasPermissionsTest.php +++ b/tests/HasPermissionsTest.php @@ -157,4 +157,14 @@ public function it_throws_an_exception_when_trying_to_scope_a_permission_from_an $this->expectException(GuardDoesNotMatch::class); User::permission($this->testAdminPermission)->get(); } + + /** @test */ + public function it_doesnt_detach_permissions_when_soft_deleting() + { + $user = SoftDeletingUser::create(['email' => 'test@example.com']); + $user->givePermissionTo(['edit-news']); + $user->delete(); + $user = SoftDeletingUser::withTrashed()->find($user->id); + $this->assertTrue($user->hasPermissionTo('edit-news')); + } } diff --git a/tests/HasRolesTest.php b/tests/HasRolesTest.php index 03a89a5..739053f 100644 --- a/tests/HasRolesTest.php +++ b/tests/HasRolesTest.php @@ -2,10 +2,10 @@ namespace Maklad\Permission\Test; -use Maklad\Permission\Models\Role; -use Maklad\Permission\Exceptions\RoleDoesNotExist; use Maklad\Permission\Exceptions\GuardDoesNotMatch; use Maklad\Permission\Exceptions\PermissionDoesNotExist; +use Maklad\Permission\Exceptions\RoleDoesNotExist; +use Maklad\Permission\Models\Role; use Monolog\Logger; class HasRolesTest extends TestCase @@ -485,4 +485,14 @@ public function it_can_retrieve_permission_names() $this->testUser->getPermissionNames() ); } + + /** @test */ + public function it_does_not_detach_roles_when_soft_deleting() + { + $user = SoftDeletingUser::create(['email' => 'test@example.com']); + $user->assignRole('testRole'); + $user->delete(); + $user = SoftDeletingUser::withTrashed()->find($user->id); + $this->assertTrue($user->hasRole('testRole')); + } } diff --git a/tests/SoftDeletingUser.php b/tests/SoftDeletingUser.php new file mode 100644 index 0000000..aec02c9 --- /dev/null +++ b/tests/SoftDeletingUser.php @@ -0,0 +1,12 @@ + Date: Wed, 18 Oct 2017 17:10:43 +0300 Subject: [PATCH 3/6] fix changelog --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e9533e..5e7ba66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,16 +3,18 @@ All Notable changes to `laravel-permission-mongodb` will be documented in this file. ## 1.3.5 - 2017-10-18 + +### Fixed - Fixed a bug where `Role`s and `Permission`s got detached when soft deleting a model ## 1.3.4 - 2017-09-28 -### added +### Added - Add the support of `laravel 5.2` ## 1.3.3 - 2017-09-27 -### added +### Added - Add the support of `laravel 5.3` From aad7103e85472e137358dc17207c7ff94a3b10a1 Mon Sep 17 00:00:00 2001 From: Mostafa Maklad Date: Wed, 18 Oct 2017 22:09:41 +0300 Subject: [PATCH 4/6] fix codeclimate issues --- src/Commands/CreatePermission.php | 4 ++-- src/Commands/CreateRole.php | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Commands/CreatePermission.php b/src/Commands/CreatePermission.php index cdd5188..7c4e20a 100644 --- a/src/Commands/CreatePermission.php +++ b/src/Commands/CreatePermission.php @@ -20,9 +20,9 @@ class CreatePermission extends Command public function handle() { - $permissionClass = \app(Permission::class); + $permission_class = \app(Permission::class); - $permission = $permissionClass::create([ + $permission = $permission_class::create([ 'name' => $this->argument('name'), 'guard_name' => $this->argument('guard') ]); diff --git a/src/Commands/CreateRole.php b/src/Commands/CreateRole.php index 62f0d55..c205458 100644 --- a/src/Commands/CreateRole.php +++ b/src/Commands/CreateRole.php @@ -22,14 +22,13 @@ class CreateRole extends Command public function handle() { - $roleClass = \app(Role::class); - $permissionClass = \app(Permission::class); + $role_class = \app(Role::class); $name = $this->argument('name'); $guard = $this->argument('guard'); $permissions = $this->option('permission'); - $role = $roleClass::create([ + $role = $role_class::create([ 'name' => $name, 'guard_name' => $guard ]); From f9171993b06ffcabf179cff20658939fb33bf80a Mon Sep 17 00:00:00 2001 From: Mostafa Maklad Date: Wed, 18 Oct 2017 22:12:50 +0300 Subject: [PATCH 5/6] fix codeclimate issues --- src/Commands/CreatePermission.php | 4 ++-- src/Commands/CreateRole.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Commands/CreatePermission.php b/src/Commands/CreatePermission.php index 7c4e20a..cdd5188 100644 --- a/src/Commands/CreatePermission.php +++ b/src/Commands/CreatePermission.php @@ -20,9 +20,9 @@ class CreatePermission extends Command public function handle() { - $permission_class = \app(Permission::class); + $permissionClass = \app(Permission::class); - $permission = $permission_class::create([ + $permission = $permissionClass::create([ 'name' => $this->argument('name'), 'guard_name' => $this->argument('guard') ]); diff --git a/src/Commands/CreateRole.php b/src/Commands/CreateRole.php index c205458..410887b 100644 --- a/src/Commands/CreateRole.php +++ b/src/Commands/CreateRole.php @@ -22,13 +22,13 @@ class CreateRole extends Command public function handle() { - $role_class = \app(Role::class); + $roleClass = \app(Role::class); $name = $this->argument('name'); $guard = $this->argument('guard'); $permissions = $this->option('permission'); - $role = $role_class::create([ + $role = $roleClass::create([ 'name' => $name, 'guard_name' => $guard ]); @@ -36,7 +36,7 @@ public function handle() $this->info("Role `{$role->name}` created"); $role->givePermissionTo($permissions); - $permissions_str = $role->permissions->implode('name', '`, `'); - $this->info("Permissions `{$permissions_str}` has been given to role `{$role->name}`"); + $permissionsStr = $role->permissions->implode('name', '`, `'); + $this->info("Permissions `{$permissionsStr}` has been given to role `{$role->name}`"); } } From 6666dfcd3f12bacd506c28ae39abe755be22f32a Mon Sep 17 00:00:00 2001 From: Mostafa Maklad Date: Wed, 18 Oct 2017 22:26:20 +0300 Subject: [PATCH 6/6] fix coverage --- src/Traits/HasRoles.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Traits/HasRoles.php b/src/Traits/HasRoles.php index e626f8f..bbfbb3b 100644 --- a/src/Traits/HasRoles.php +++ b/src/Traits/HasRoles.php @@ -21,9 +21,6 @@ trait HasRoles public static function bootHasRoles() { static::deleting(function (Model $model) { - if (method_exists($model, 'isForceDeleting') && ! $model->isForceDeleting()) { - return; - } foreach ($model->roles as $role) { $role->users()->detach($model); }