Skip to content

Commit 2a05a29

Browse files
committed
refatoring and start rainlab support
1 parent a59aca7 commit 2a05a29

28 files changed

+554
-119
lines changed

Plugin.php

+33-8
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,18 @@
2020
use ReaZzon\JWTAuth\Classes\Events\UserModelHandler;
2121

2222
use System\Classes\PluginManager;
23-
use Tymon\JWTAuth\Providers\LaravelServiceProvider;
23+
use PHPOpenSourceSaver\JWTAuth\Providers\LaravelServiceProvider;
2424

2525
/**
2626
* JWTAuth Plugin Information File
2727
*/
2828
class Plugin extends PluginBase
2929
{
30+
/**
31+
*
32+
*/
33+
public const PLUGIN_NAME = 'ReaZzon.JWTAuth';
34+
3035
/**
3136
* Returns information about this plugin.
3237
*
@@ -53,11 +58,9 @@ public function register()
5358

5459
$this->app->singleton(
5560
UserPluginResolverContract::class,
56-
static fn() => UserPluginResolver::instance()
61+
static fn() => UserPluginResolver::instance(),
5762
);
5863

59-
$this->registerGates();
60-
$this->registerJWT();
6164
}
6265

6366
/**
@@ -67,6 +70,17 @@ public function register()
6770
*/
6871
public function boot()
6972
{
73+
if (!$this->getResolver()->isRequiredResolve()) {
74+
PluginManager::instance()->disablePlugin(static::PLUGIN_NAME);
75+
if (method_exists($this->getResolver(), 'forgetInstance')) {
76+
$this->getResolver()::forgetInstance();
77+
}
78+
79+
return;
80+
}
81+
82+
$this->registerGates();
83+
$this->registerJWT();
7084
$this->registerConfigs();
7185
$this->addEventListeners();
7286
}
@@ -105,7 +119,7 @@ private function registerConfigs()
105119
/**
106120
*
107121
*/
108-
private function addEventListeners()
122+
private function addEventListeners(): void
109123
{
110124
Event::subscribe(UserModelHandler::class);
111125
}
@@ -120,7 +134,7 @@ private function registerGates(): void
120134

121135
$this->app->singleton(GateContract::class, function ($app): Gate {
122136
return new Gate($app, function () use ($app): ?User {
123-
return app(UserPluginResolverContract::class)->getProvider()->user();
137+
return $this->getResolver()->getProvider()->user();
124138
});
125139
});
126140
}
@@ -132,10 +146,10 @@ private function registerJWT(): void
132146
{
133147
(new LaravelServiceProvider($this->app))->register();
134148

135-
$this->app->singleton('JWTGuard', static function ($app): Guard {
149+
$this->app->singleton('JWTGuard', function ($app): Guard {
136150
$guard = new JWTGuard(
137151
$app['tymon.jwt'],
138-
new UserProvider(app(UserPluginResolverContract::class)->getModel()),
152+
new UserProvider($this->getResolver()->getModel()),
139153
$app['request']
140154
);
141155

@@ -144,6 +158,9 @@ private function registerJWT(): void
144158
});
145159
}
146160

161+
/**
162+
* @return array[]
163+
*/
147164
public function registerSettings(): array
148165
{
149166
return [
@@ -159,4 +176,12 @@ public function registerSettings(): array
159176
]
160177
];
161178
}
179+
180+
/**
181+
* @return UserPluginResolverContract
182+
*/
183+
private function getResolver(): UserPluginResolverContract
184+
{
185+
return app(UserPluginResolverContract::class);
186+
}
162187
}

classes/UserPluginResolver.php

+42-21
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44
namespace ReaZzon\JWTAuth\Classes;
55

6-
use Model;
6+
use PHPOpenSourceSaver\JWTAuth\JWTGuard;
77
use ReaZzon\JWTAuth\Classes\Contracts\Plugin;
8+
use ReaZzon\JWTAuth\Classes\Dto\PluginDto;
89
use System\Classes\PluginManager;
9-
use Tymon\JWTAuth\Contracts\JWTSubject;
10+
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
1011
use October\Rain\Support\Traits\Singleton;
1112
use October\Rain\Auth\Manager as AuthManager;
1213
use ReaZzon\JWTAuth\Classes\Contracts\UserPluginResolver as UserPluginResolverContract;
@@ -18,7 +19,10 @@ final class UserPluginResolver implements UserPluginResolverContract
1819
{
1920
use Singleton;
2021

21-
private array $plugin;
22+
/**
23+
* @var PluginDto|null
24+
*/
25+
private ?PluginDto $plugin = null;
2226

2327
/**
2428
* Boot resolver
@@ -28,54 +32,71 @@ final class UserPluginResolver implements UserPluginResolverContract
2832
*/
2933
public function init(): void
3034
{
31-
$plugins = $this->getSupportPlugins();
32-
foreach($plugins as $plugin) {
33-
if (PluginManager::instance()->hasPlugin($plugin['name'])) {
34-
$this->plugin = $plugin;
35-
break;
35+
$this->plugin = \Arr::first($this->getSupportPlugins(), static function (PluginDto $plugin): ?PluginDto {
36+
if (!PluginManager::instance()->hasPlugin($plugin->name)) {
37+
return null;
3638
}
37-
}
3839

39-
if (empty($this->plugin)) {
40-
throw new \SystemException('No required plugins found in system');
41-
}
40+
return $plugin;
41+
});
4242
}
4343

4444
/**
45-
* @return string
45+
* @inheritDoc
4646
*/
4747
public function getModel(): string
4848
{
49-
return $this->plugin['model'];
49+
return $this->plugin->model;
5050
}
5151

52+
/**
53+
* @inheritDoc
54+
*/
5255
public function getResolver(): Plugin
5356
{
54-
return app($this->plugin['resolver']);
57+
return app($this->plugin->resolver);
5558
}
5659

5760
/**
58-
* @param $model
59-
* @return JWTSubject
61+
* @inheritDoc
6062
*/
6163
public function resolveModel($model): JWTSubject
6264
{
6365
return $this->getResolver()->resolve($model);
6466
}
6567

6668
/**
67-
* @return AuthManager
69+
* @inheritDoc
6870
*/
6971
public function getProvider(): AuthManager
7072
{
71-
return app($this->plugin['provider']);
73+
return app($this->plugin->provider);
7274
}
7375

7476
/**
75-
* @return array
77+
* @inheritDoc
7678
*/
7779
public function getSupportPlugins(): array
7880
{
79-
return config('reazzon.jwtauth::plugins');
81+
return \array_map(
82+
static fn(array $plugin) => new PluginDto($plugin),
83+
config('reazzon.jwtauth::plugins')
84+
);
85+
}
86+
87+
/**
88+
* @inheritDoc
89+
*/
90+
public function getGuard(): JWTGuard
91+
{
92+
return app('JWTGuard');
93+
}
94+
95+
/**
96+
* @inheritDoc
97+
*/
98+
public function isRequiredResolve(): bool
99+
{
100+
return $this->plugin !== null;
80101
}
81102
}

classes/behaviors/UserSubjectBehavior.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace ReaZzon\JWTAuth\Classes\Behaviors;
44

55
use October\Rain\Database\ModelBehavior;
6-
use Tymon\JWTAuth\Contracts\JWTSubject;
6+
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
77

88
/**
99
* Class UserSubjectBehavior

classes/contracts/Plugin.php

+23-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace ReaZzon\JWTAuth\Classes\Contracts;
55

6-
use Tymon\JWTAuth\Contracts\JWTSubject;
6+
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
77
use Model;
88

99
/**
@@ -17,6 +17,28 @@ interface Plugin
1717
*/
1818
public function resolve(Model $model): JWTSubject;
1919

20+
/**
21+
* @param $model
22+
* @return string
23+
*/
24+
public function initActivation($model): string;
25+
26+
/**
27+
* @param $code
28+
* @return mixed
29+
*/
30+
public function activateByCode($code);
31+
32+
/**
33+
* @return array
34+
*/
35+
public function registrationValidationExtend(): array;
36+
37+
/**
38+
* @return array
39+
*/
40+
public function loginValidationExtend(): array;
41+
2042
public function initActivation($model): string;
2143

2244
public function activateByCode($code);

classes/contracts/UserPluginResolver.php

+17-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
namespace ReaZzon\JWTAuth\Classes\Contracts;
55

66
use October\Rain\Auth\Manager as AuthManager;
7-
use Tymon\JWTAuth\Contracts\JWTSubject;
7+
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
88
use Model;
9+
use PHPOpenSourceSaver\JWTAuth\JWTGuard;
910

1011
/**
1112
*
@@ -19,6 +20,11 @@ public function getModel(): string;
1920

2021
public function getResolver(): Plugin;
2122

23+
/**
24+
* @return Plugin
25+
*/
26+
public function getResolver(): Plugin;
27+
2228
/**
2329
* @param Model $model
2430
* @return JWTSubject
@@ -34,4 +40,14 @@ public function getProvider(): AuthManager;
3440
* @return array
3541
*/
3642
public function getSupportPlugins(): array;
43+
44+
/**
45+
* @return JWTGuard
46+
*/
47+
public function getGuard(): JWTGuard;
48+
49+
/**
50+
* @return bool
51+
*/
52+
public function isRequiredResolve(): bool;
3753
}

classes/dto/PluginDto.php

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace ReaZzon\JWTAuth\Classes\Dto;
5+
6+
use October\Rain\Argon\Argon;
7+
use October\Rain\Auth\Models\User;
8+
use Spatie\DataTransferObject\DataTransferObject;
9+
10+
/**
11+
*
12+
*/
13+
final class PluginDto extends DataTransferObject
14+
{
15+
/**
16+
* @var string
17+
*/
18+
public string $name;
19+
20+
/**
21+
* @var string
22+
*/
23+
public string $model;
24+
25+
/**
26+
* @var string
27+
*/
28+
public string $resolver;
29+
30+
/**
31+
* @var string
32+
*/
33+
public string $provider;
34+
}

classes/dto/TokenDto.php

+2-20
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55

66
use October\Rain\Argon\Argon;
77
use October\Rain\Auth\Models\User;
8+
use Spatie\DataTransferObject\DataTransferObject;
89

910
/**
1011
*
1112
*/
12-
class TokenDto
13+
final class TokenDto extends DataTransferObject
1314
{
1415
/**
1516
* @var string
@@ -25,23 +26,4 @@ class TokenDto
2526
* @var User
2627
*/
2728
public User $user;
28-
29-
/**
30-
* @param $data
31-
*/
32-
public function __construct($data)
33-
{
34-
foreach($data as $name => $value) {
35-
$this->{$name} = $value;
36-
}
37-
}
38-
39-
public function toArray(): array
40-
{
41-
return [
42-
'token' => $this->token,
43-
'expires' => $this->expires,
44-
'user' => $this->user
45-
];
46-
}
4729
}

0 commit comments

Comments
 (0)