Skip to content

Commit 31497ad

Browse files
authored
chore: auth improvements (#646)
1 parent 972595c commit 31497ad

File tree

13 files changed

+98
-41
lines changed

13 files changed

+98
-41
lines changed

src/Tempest/Auth/src/AuthConfig.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Tempest\Auth;
66

7+
use Tempest\Auth\Install\User;
8+
79
final class AuthConfig
810
{
911
public function __construct(

src/Tempest/Auth/src/AuthInstaller.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ public function getName(): string
2020
public function install(): void
2121
{
2222
$publishFiles = [
23-
__DIR__ . '/User.php' => src_path('User.php'),
24-
__DIR__ . '/UserMigration.php' => src_path('UserMigration.php'),
25-
__DIR__ . '/Permission.php' => src_path('Permission.php'),
26-
__DIR__ . '/PermissionMigration.php' => src_path('PermissionMigration.php'),
27-
__DIR__ . '/UserPermission.php' => src_path('UserPermission.php'),
28-
__DIR__ . '/UserPermissionMigration.php' => src_path('UserPermissionMigration.php'),
23+
__DIR__ . '/Install/User.php' => src_path('Auth/User.php'),
24+
__DIR__ . '/Install/UserMigration.php' => src_path('Auth/UserMigration.php'),
25+
__DIR__ . '/Install/Permission.php' => src_path('Auth/Permission.php'),
26+
__DIR__ . '/Install/PermissionMigration.php' => src_path('Auth/PermissionMigration.php'),
27+
__DIR__ . '/Install/UserPermission.php' => src_path('Auth/UserPermission.php'),
28+
__DIR__ . '/Install/UserPermissionMigration.php' => src_path('Auth/UserPermissionMigration.php'),
2929
];
3030

3131
foreach ($publishFiles as $source => $destination) {

src/Tempest/Auth/src/Permission.php renamed to src/Tempest/Auth/src/Install/Permission.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace Tempest\Auth;
5+
namespace Tempest\Auth\Install;
66

77
use BackedEnum;
88
use Tempest\Database\DatabaseModel;
@@ -18,12 +18,13 @@ public function __construct(
1818
) {
1919
}
2020

21-
public function matches(string|UnitEnum $match): bool
21+
public function matches(string|UnitEnum|Permission $match): bool
2222
{
2323
$match = match(true) {
2424
is_string($match) => $match,
2525
$match instanceof BackedEnum => $match->value,
2626
$match instanceof UnitEnum => $match->name,
27+
default => $match->name,
2728
};
2829

2930
return $this->name === $match;

src/Tempest/Auth/src/PermissionMigration.php renamed to src/Tempest/Auth/src/Install/PermissionMigration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace Tempest\Auth;
5+
namespace Tempest\Auth\Install;
66

77
use Tempest\Core\DoNotDiscover;
88
use Tempest\Database\Migration;
Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
declare(strict_types=1);
44

5-
namespace Tempest\Auth;
5+
namespace Tempest\Auth\Install;
66

77
use BackedEnum;
88
use SensitiveParameter;
9+
use Tempest\Auth\CanAuthenticate;
10+
use Tempest\Auth\CanAuthorize;
911
use Tempest\Database\DatabaseModel;
1012
use Tempest\Database\IsDatabaseModel;
1113
use function Tempest\Support\arr;
@@ -20,7 +22,7 @@ final class User implements DatabaseModel, CanAuthenticate, CanAuthorize
2022
public function __construct(
2123
public string $name,
2224
public string $email,
23-
/** @var \Tempest\Auth\UserPermission[] $userPermissions */
25+
/** @var \Tempest\Auth\Install\UserPermission[] $userPermissions */
2426
public array $userPermissions = [],
2527
) {
2628
}
@@ -35,37 +37,54 @@ public function setPassword(#[SensitiveParameter] string $password): self
3537
return $this;
3638
}
3739

38-
public function grantPermission(string|UnitEnum $permission): self
40+
public function grantPermission(string|UnitEnum|Permission $permission): self
3941
{
40-
$permission = match(true) {
41-
is_string($permission) => $permission,
42-
$permission instanceof BackedEnum => $permission->value,
43-
$permission instanceof UnitEnum => $permission->name,
44-
};
42+
$permission = $this->resolvePermission($permission);
4543

4644
(new UserPermission(
4745
user: $this,
48-
permission: new Permission($permission)
46+
permission: $permission,
4947
))->save();
5048

5149
return $this->load('userPermissions.permission');
5250
}
5351

54-
public function revokePermission(string|UnitEnum $permission): self
52+
public function revokePermission(string|UnitEnum|Permission $permission): self
5553
{
5654
$this->getPermission($permission)?->delete();
5755

5856
return $this->load('userPermissions.permission');
5957
}
6058

61-
public function hasPermission(UnitEnum|string $permission): bool
59+
public function hasPermission(string|UnitEnum|Permission $permission): bool
6260
{
6361
return $this->getPermission($permission) !== null;
6462
}
6563

66-
public function getPermission(UnitEnum|string $permission): ?UserPermission
64+
public function getPermission(string|UnitEnum|Permission $permission): ?UserPermission
6765
{
6866
return arr($this->userPermissions)
6967
->first(fn (UserPermission $userPermission) => $userPermission->permission->matches($permission));
7068
}
69+
70+
private function resolvePermission(string|UnitEnum|Permission $permission): Permission
71+
{
72+
if ($permission instanceof Permission) {
73+
return $permission;
74+
}
75+
76+
$name = match (true) {
77+
is_string($permission) => $permission,
78+
$permission instanceof BackedEnum => $permission->value,
79+
$permission instanceof UnitEnum => $permission->name,
80+
};
81+
82+
$permission = Permission::query()->whereField('name', $name)->first();
83+
84+
if ($permission === null) {
85+
return (new Permission($name))->save();
86+
}
87+
88+
return $permission;
89+
}
7190
}

src/Tempest/Auth/src/UserMigration.php renamed to src/Tempest/Auth/src/Install/UserMigration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace Tempest\Auth;
5+
namespace Tempest\Auth\Install;
66

77
use Tempest\Core\DoNotDiscover;
88
use Tempest\Database\Migration;

src/Tempest/Auth/src/UserPermission.php renamed to src/Tempest/Auth/src/Install/UserPermission.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace Tempest\Auth;
5+
namespace Tempest\Auth\Install;
66

77
use Tempest\Database\DatabaseModel;
88
use Tempest\Database\IsDatabaseModel;

src/Tempest/Auth/src/UserPermissionMigration.php renamed to src/Tempest/Auth/src/Install/UserPermissionMigration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
declare(strict_types=1);
44

5-
namespace Tempest\Auth;
5+
namespace Tempest\Auth\Install;
66

77
use Tempest\Core\DoNotDiscover;
88
use Tempest\Database\Migration;

tests/Integration/Auth/AuthInstallerTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,17 @@ public function test_install_auth(): void
4343
];
4444

4545
foreach ($publishItems as $publishItem) {
46-
$path = "App/{$publishItem}.php";
46+
$path = "App/Auth/{$publishItem}.php";
4747

4848
$this->installer
4949
->assertFileExists($path)
50-
->assertFileContains($path, 'namespace App;')
50+
->assertFileContains($path, 'namespace App\Auth;')
5151
->assertFileNotContains($path, 'DoNotDiscover');
5252
}
5353

5454
$this->installer->assertFileContains(
55-
'App/User.php',
56-
'use App\UserPermission',
55+
'App/Auth/User.php',
56+
'use App\Auth\UserPermission',
5757
);
5858
}
5959
}

tests/Integration/Auth/AuthorizerTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
namespace Tests\Tempest\Integration\Auth;
66

77
use Tempest\Auth\Authenticator;
8-
use Tempest\Auth\PermissionMigration;
9-
use Tempest\Auth\User;
10-
use Tempest\Auth\UserMigration;
11-
use Tempest\Auth\UserPermissionMigration;
8+
use Tempest\Auth\Install\PermissionMigration;
9+
use Tempest\Auth\Install\User;
10+
use Tempest\Auth\Install\UserMigration;
11+
use Tempest\Auth\Install\UserPermissionMigration;
1212
use Tempest\Clock\Clock;
1313
use Tempest\Database\Migrations\CreateMigrationsTable;
1414
use Tempest\Http\Session\Managers\FileSessionManager;

0 commit comments

Comments
 (0)