Skip to content

Commit add3148

Browse files
committed
Update dependencies and permissions handling
1 parent abbdfa2 commit add3148

29 files changed

+447
-172
lines changed

.php-cs-fixer.cache

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"php":"8.2.7","version":"3.17.0","indent":" ","lineEnding":"\n","rules":{"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_typehint":true,"curly_braces_position":{"allow_single_line_empty_anonymous_classes":true},"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_braces":true,"no_blank_lines_after_class_opening":true,"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"none"},"return_type_declaration":true,"short_scalar_cast":true,"single_blank_line_before_namespace":true,"single_import_per_statement":{"group_to_single_imports":false},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"on_multiline":"ensure_fully_multiline"},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_spaces_inside_parenthesis":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"workbench\/app\/Providers\/WorkbenchServiceProvider.php":"51d888d64251f27b21dc742900176529","src\/DefinedRole.php":"71113d4060a95d06d7d64406097189e2","src\/Actions\/StorePermission.php":"1ce86933a2586d1c914b4fb6033716d4","src\/RbacServiceProvider.php":"fe648a7d67e0abbe70c8bf62fc122ace","src\/Jobs\/ResetPermissions.php":"6d15e072f7995a2ae3918c9e61d239e9","src\/Jobs\/SyncDefinedRoles.php":"63e45566b000750caae57d0262e5dee7","src\/Jobs\/SyncDefinedRole.php":"a35d82845347a1a624d264b2cff0e7c7","src\/Jobs\/FlushPermissionCache.php":"7debb2c7438ca54691e0c80b411f4711","src\/Facades\/Rbac.php":"c6ae49d401c95f3548a578691c90fc49","src\/Commands\/AbilityMakeCommand.php":"e1cd4b78716621528c55f689ac418c34","src\/Commands\/DefinedRoleMakeCommand.php":"c905c1025929d3c7bab6ccec97612272","src\/Commands\/RbacResetCommand.php":"141dd7b73edaeb5c026d9080b8579533","src\/Contracts\/DefinedRole.php":"3affb28117a8d09dc1eca809aea53191","src\/Rbac.php":"0f1731d315fc0a3abe02917314e6c6d3","config\/rbac.php":"b1dbefb35ffd6e9e87461925f16d3fad","tests\/TestCase.php":"df7d551f35d646b7026bd85ae13d2793"}}
1+
{"php":"8.2.7","version":"3.17.0","indent":" ","lineEnding":"\n","rules":{"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_typehint":true,"curly_braces_position":{"allow_single_line_empty_anonymous_classes":true},"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_braces":true,"no_blank_lines_after_class_opening":true,"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"none"},"return_type_declaration":true,"short_scalar_cast":true,"single_blank_line_before_namespace":true,"single_import_per_statement":{"group_to_single_imports":false},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"on_multiline":"ensure_fully_multiline"},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_spaces_inside_parenthesis":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"workbench\/app\/Providers\/WorkbenchServiceProvider.php":"51d888d64251f27b21dc742900176529","src\/DefinedRole.php":"bc1398a6e80ed7f6d6499187021641b8","src\/Actions\/StorePermission.php":"46bdc50406bc2a5d8c5aa01155ed184b","src\/RbacServiceProvider.php":"fe648a7d67e0abbe70c8bf62fc122ace","src\/Jobs\/ResetPermissions.php":"5806994862d76870ddb7ce2cb7490f58","src\/Jobs\/SyncDefinedRoles.php":"63e45566b000750caae57d0262e5dee7","src\/Jobs\/SyncDefinedRole.php":"a35d82845347a1a624d264b2cff0e7c7","src\/Jobs\/FlushPermissionCache.php":"7debb2c7438ca54691e0c80b411f4711","src\/Facades\/Rbac.php":"c6ae49d401c95f3548a578691c90fc49","src\/Commands\/AbilityMakeCommand.php":"e1cd4b78716621528c55f689ac418c34","src\/Commands\/DefinedRoleMakeCommand.php":"c905c1025929d3c7bab6ccec97612272","src\/Commands\/RbacResetCommand.php":"141dd7b73edaeb5c026d9080b8579533","src\/Contracts\/DefinedRole.php":"3affb28117a8d09dc1eca809aea53191","src\/Rbac.php":"0f1731d315fc0a3abe02917314e6c6d3","config\/rbac.php":"b1dbefb35ffd6e9e87461925f16d3fad","tests\/TestCase.php":"df7d551f35d646b7026bd85ae13d2793","src\/Actions\/SyncDefinedRole.php":"b2dc3a548bfadc39128adaf40fe60a52"}}

composer.json

+5-27
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@
2020
"php": "^8.2",
2121
"illuminate/contracts": "^11.0",
2222
"lorisleiva/laravel-actions": "^2.8",
23-
"spatie/laravel-collection-macros": "*",
23+
"spatie/laravel-collection-macros": "^7.0",
2424
"spatie/laravel-package-tools": "^1.16",
2525
"spatie/laravel-permission": "^6.4"
2626
},
2727
"require-dev": {
2828
"laravel/pint": "^1.14",
2929
"nunomaduro/collision": "^8.1",
30-
"orchestra/testbench": "^9.0"
30+
"orchestra/testbench": "^9.0",
31+
"spatie/phpunit-snapshot-assertions": "^5.1"
3132
},
3233
"autoload": {
3334
"psr-4": {
@@ -37,34 +38,11 @@
3738
},
3839
"autoload-dev": {
3940
"psr-4": {
40-
"BinaryCats\\Rbac\\Tests\\": "tests/",
41-
"Workbench\\App\\": "workbench/app/"
41+
"BinaryCats\\Rbac\\Tests\\": "tests/"
4242
}
4343
},
44-
"scripts": {
45-
"post-autoload-dump": "@composer run prepare",
46-
"clear": "@php vendor/bin/testbench package:purge-rbac --ansi",
47-
"prepare": "@php vendor/bin/testbench package:discover --ansi",
48-
"build": [
49-
"@composer run prepare",
50-
"@php vendor/bin/testbench workbench:build --ansi"
51-
],
52-
"start": [
53-
"Composer\\Config::disableProcessTimeout",
54-
"@composer run build",
55-
"@php vendor/bin/testbench serve"
56-
],
57-
"analyse": "vendor/bin/phpstan analyse",
58-
"test": "vendor/bin/pest",
59-
"test-coverage": "vendor/bin/pest --coverage",
60-
"format": "vendor/bin/pint"
61-
},
6244
"config": {
63-
"sort-packages": true,
64-
"allow-plugins": {
65-
"pestphp/pest-plugin": true,
66-
"phpstan/extension-installer": true
67-
}
45+
"sort-packages": true
6846
},
6947
"extra": {
7048
"laravel": {

phpunit.xml.dist

+4
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,8 @@
3535
<directory suffix=".php">./src</directory>
3636
</include>
3737
</source>
38+
<php>
39+
<env name="CACHE_STORE" value="array"/>
40+
<env name="SESSION_DRIVER" value="array"/>
41+
</php>
3842
</phpunit>

src/Actions/StorePermission.php

+10-26
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,22 @@
22

33
namespace BinaryCats\Rbac\Actions;
44

5+
use BackedEnum;
6+
use Illuminate\Support\Facades\Artisan;
57
use Lorisleiva\Actions\Action;
6-
use Spatie\Permission\Contracts\Permission;
78

89
class StorePermission extends Action
910
{
1011
/**
11-
* @param \Spatie\Permission\Contracts\Permission $permission
12+
* @param \BackedEnum $permission
13+
* @param string $guard
14+
* @return void
1215
*/
13-
public function __construct(
14-
protected Permission $permission
15-
) {
16-
}
17-
18-
/**
19-
* @return array[]
20-
*/
21-
public function rules(): array
22-
{
23-
return [
24-
'name' => ['required', 'string', 'min:2', 'max:125'],
25-
'guard_name' => ['required', 'string', 'min:2', 'max:125'],
26-
];
27-
}
28-
29-
/**
30-
* @param array $attributes
31-
* @return \Spatie\Permission\Contracts\Permission
32-
*/
33-
public function handle(array $attributes): Permission
16+
public function handle(BackedEnum $permission, string $guard): void
3417
{
35-
$this->fill($attributes);
36-
37-
return $this->permission->firstOrCreate($this->validateAttributes());
18+
Artisan::call('permission:create-permission', [
19+
'name' => $permission->value,
20+
'guard' => $guard,
21+
]);
3822
}
3923
}

src/Actions/SyncDefinedRole.php

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace BinaryCats\Rbac\Actions;
4+
5+
use BackedEnum;
6+
use Illuminate\Support\Facades\Artisan;
7+
use Lorisleiva\Actions\Action;
8+
9+
class SyncDefinedRole extends Action
10+
{
11+
/**
12+
* @return void
13+
*/
14+
public function handle(string $name, string $guard, array $permissions): void
15+
{
16+
$permissions = collect($permissions)
17+
->map(fn ($permission) => match (true) {
18+
$permission instanceof BackedEnum => $permission->value,
19+
default => (string) $permission
20+
})->implode('|');
21+
22+
Artisan::call('permission:create-role', [
23+
'name' => $name,
24+
'guard' => $guard,
25+
'permissions' => $permissions,
26+
]);
27+
}
28+
}

src/Commands/AbilityMakeCommand.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class AbilityMakeCommand extends GeneratorCommand
2626
*/
2727
protected function getStub()
2828
{
29-
return __DIR__ . '/stubs/ability.stub';
29+
return __DIR__ . '/../../stubs/ability.stub';
3030
}
3131

3232
/**

src/Commands/DefinedRoleMakeCommand.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class DefinedRoleMakeCommand extends GeneratorCommand
2626
*/
2727
protected function getStub()
2828
{
29-
return __DIR__ . '/stubs/defined-role.stub';
29+
return __DIR__ . '/../../stubs/defined-role.stub';
3030
}
3131

3232
/**

src/DefinedRole.php

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace BinaryCats\Rbac;
44

5+
use BinaryCats\Rbac\Actions\SyncDefinedRole;
56
use BinaryCats\Rbac\Contracts\DefinedRole as DefinedRoleContract;
67
use Illuminate\Support\Str;
78
use ReflectionClass;
@@ -37,4 +38,12 @@ public function handle(): void
3738
SyncDefinedRole::run($this->name(), $guard, $this->{$guard}());
3839
}
3940
}
41+
42+
/**
43+
* @return array|string[]
44+
*/
45+
protected function guards(): array
46+
{
47+
return $this->guards;
48+
}
4049
}

src/DiscoverAbilities.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace BinaryCats\Rbac;
44

5+
use Illuminate\Support\Collection;
56
use Illuminate\Support\Str;
67
use ReflectionClass;
78
use ReflectionException;
@@ -22,15 +23,13 @@ class DiscoverAbilities
2223
*
2324
* @param string $abilitiesPath
2425
* @param string $basePath
25-
* @return \Illuminate\Support\Collection
26+
* @return \Illuminate\Support\Collection<\BackedEnum>
2627
*/
27-
public static function within(string $abilitiesPath, string $basePath)
28+
public static function within(string $abilitiesPath, string $basePath): Collection
2829
{
29-
$abilities = collect(static::getAbilities(
30+
return collect(static::getAbilities(
3031
Finder::create()->files()->in($abilitiesPath), $basePath
3132
));
32-
33-
return $abilities;
3433
}
3534

3635
protected static function getAbilities($abilities, $basePath)
@@ -43,7 +42,8 @@ protected static function getAbilities($abilities, $basePath)
4342
$ability = new ReflectionClass(
4443
static::classFromFile($ability, $basePath)
4544
);
46-
} catch (ReflectionException) {
45+
} catch (ReflectionException $e) {
46+
dd($e);
4747
continue;
4848
}
4949

src/Facades/Rbac.php

-16
This file was deleted.

src/Jobs/ResetPermissions.php

+2-5
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
namespace BinaryCats\Rbac\Jobs;
44

5+
use BinaryCats\Rbac\Actions\StorePermission;
56
use BinaryCats\Rbac\DiscoverAbilities;
67
use BackedEnum;
78
use Illuminate\Bus\Queueable;
89
use Illuminate\Foundation\Bus\Dispatchable;
910
use Illuminate\Queue\InteractsWithQueue;
1011
use Illuminate\Queue\SerializesModels;
1112
use Illuminate\Support\Collection;
12-
use Illuminate\Support\Facades\Artisan;
1313

1414
class ResetPermissions
1515
{
@@ -36,10 +36,7 @@ public function __construct(string $guard = null)
3636
public function handle(): void
3737
{
3838
$this->permissions()
39-
->each(fn (BackedEnum $ability) => Artisan::call('permission:create-permission', [
40-
'name' => $ability->value,
41-
'guard' => $this->guard,
42-
]));
39+
->each(fn (BackedEnum $ability) => StorePermission::run($ability, $this->guard));
4340
}
4441

4542
/**

src/Jobs/SyncDefinedRole.php

-48
This file was deleted.

src/Rbac.php

-7
This file was deleted.
File renamed without changes.
File renamed without changes.

tests/Actions/StorePermissionTest.php

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace BinaryCats\Rbac\Tests\Actions;
4+
5+
use BinaryCats\Rbac\Actions\StorePermission;
6+
use BinaryCats\Rbac\Tests\Fixtures\Abilities\FooAbility;
7+
use BinaryCats\Rbac\Tests\TestCase;
8+
use Illuminate\Support\Facades\Artisan;
9+
use PHPUnit\Framework\Attributes\Test;
10+
11+
class StorePermissionTest extends TestCase
12+
{
13+
#[Test]
14+
public function it_will_handle_creating_permission(): void
15+
{
16+
Artisan::expects('call')
17+
->once()
18+
->with(
19+
'permission:create-permission', [
20+
'name' => 'una',
21+
'guard' => 'web',
22+
]);
23+
24+
StorePermission::run(FooAbility::One, 'web');
25+
}
26+
}

tests/Actions/SyncDefinedRoleTest.php

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace BinaryCats\Rbac\Tests\Actions;
4+
5+
use BinaryCats\Rbac\Actions\SyncDefinedRole;
6+
use BinaryCats\Rbac\Tests\Fixtures\Abilities\FooAbility;
7+
use BinaryCats\Rbac\Tests\TestCase;
8+
use Illuminate\Support\Facades\Artisan;
9+
use PHPUnit\Framework\Attributes\Test;
10+
11+
class SyncDefinedRoleTest extends TestCase
12+
{
13+
#[Test]
14+
public function it_will_defer_syncing_defined_role_to_artisan(): void
15+
{
16+
Artisan::expects('call')
17+
->once()
18+
->with(
19+
'permission:create-role', [
20+
'name' => 'foo role',
21+
'guard' => 'web',
22+
'permissions' => 'bar|una'
23+
]);
24+
25+
SyncDefinedRole::run('foo role', 'web', [
26+
'bar',
27+
FooAbility::One
28+
]);
29+
}
30+
}

0 commit comments

Comments
 (0)