diff --git a/src/Async/Consumer.php b/src/Async/Consumer.php index 0dc834e..ed7723e 100644 --- a/src/Async/Consumer.php +++ b/src/Async/Consumer.php @@ -4,7 +4,7 @@ declare(ticks=1); namespace Siteworxpro\App\Async; -use Siteworxpro\App\Annotations\Async\HandlesMessage; +use Siteworxpro\App\Attributes\Async\HandlesMessage; use Siteworxpro\App\Async\Messages\Message; use Siteworxpro\App\Async\Queues\Queue; use Siteworxpro\App\Services\Facades\Broker; diff --git a/src/Async/Handlers/SayHelloHandler.php b/src/Async/Handlers/SayHelloHandler.php index b3ae98c..5c30514 100644 --- a/src/Async/Handlers/SayHelloHandler.php +++ b/src/Async/Handlers/SayHelloHandler.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace Siteworxpro\App\Async\Handlers; -use Siteworxpro\App\Annotations\Async\HandlesMessage; +use Siteworxpro\App\Attributes\Async\HandlesMessage; use Siteworxpro\App\Async\Messages\Message; use Siteworxpro\App\Async\Messages\SayHelloMessage; use Siteworxpro\App\Services\Facades\Logger; diff --git a/src/Annotations/Async/HandlesMessage.php b/src/Attributes/Async/HandlesMessage.php similarity index 94% rename from src/Annotations/Async/HandlesMessage.php rename to src/Attributes/Async/HandlesMessage.php index 2c9ec09..110ded3 100644 --- a/src/Annotations/Async/HandlesMessage.php +++ b/src/Attributes/Async/HandlesMessage.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Siteworxpro\App\Annotations\Async; +namespace Siteworxpro\App\Attributes\Async; use Attribute; diff --git a/src/Annotations/Events/ListensFor.php b/src/Attributes/Events/ListensFor.php similarity index 93% rename from src/Annotations/Events/ListensFor.php rename to src/Attributes/Events/ListensFor.php index 1f85665..2b09e51 100644 --- a/src/Annotations/Events/ListensFor.php +++ b/src/Attributes/Events/ListensFor.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Siteworxpro\App\Annotations\Events; +namespace Siteworxpro\App\Attributes\Events; use Attribute; diff --git a/src/Annotations/Guards/Jwt.php b/src/Attributes/Guards/Jwt.php similarity index 84% rename from src/Annotations/Guards/Jwt.php rename to src/Attributes/Guards/Jwt.php index 8d35e7d..aaa3d0c 100644 --- a/src/Annotations/Guards/Jwt.php +++ b/src/Attributes/Guards/Jwt.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Siteworxpro\App\Annotations\Guards; +namespace Siteworxpro\App\Attributes\Guards; use Attribute; use Siteworxpro\App\Services\Facades\Config; @@ -32,16 +32,6 @@ readonly class Jwt ) { } - /** - * Get the required audience from configuration, ignoring any local override. - * - * @return string The globally configured audience or an empty string if not set. - */ - public function getRequiredAudience(): string - { - return Config::get('jwt.audience') ?? ''; - } - /** * Get the expected audience for validation. * diff --git a/src/Annotations/Guards/Scope.php b/src/Attributes/Guards/Scope.php similarity index 86% rename from src/Annotations/Guards/Scope.php rename to src/Attributes/Guards/Scope.php index 2fdd8c5..9ee76a5 100644 --- a/src/Annotations/Guards/Scope.php +++ b/src/Attributes/Guards/Scope.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Siteworxpro\App\Annotations\Guards; +namespace Siteworxpro\App\Attributes\Guards; use Attribute; diff --git a/src/Controllers/IndexController.php b/src/Controllers/IndexController.php index 40a5f25..c0a8e57 100644 --- a/src/Controllers/IndexController.php +++ b/src/Controllers/IndexController.php @@ -6,7 +6,7 @@ namespace Siteworxpro\App\Controllers; use Nyholm\Psr7\ServerRequest; use Psr\Http\Message\ResponseInterface; -use Siteworxpro\App\Annotations\Guards; +use Siteworxpro\App\Attributes\Guards; use Siteworxpro\App\Http\JsonResponseFactory; /** diff --git a/src/Events/Dispatcher.php b/src/Events/Dispatcher.php index 5f0c790..e5b561c 100644 --- a/src/Events/Dispatcher.php +++ b/src/Events/Dispatcher.php @@ -7,7 +7,7 @@ namespace Siteworxpro\App\Events; use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Support\Collection; -use Siteworxpro\App\Annotations\Events\ListensFor; +use Siteworxpro\App\Attributes\Events\ListensFor; /** * Class Dispatcher diff --git a/src/Events/Listeners/Database/Connected.php b/src/Events/Listeners/Database/Connected.php index 10f2388..94915cc 100644 --- a/src/Events/Listeners/Database/Connected.php +++ b/src/Events/Listeners/Database/Connected.php @@ -6,7 +6,7 @@ namespace Siteworxpro\App\Events\Listeners\Database; use Illuminate\Database\Events\ConnectionEstablished; use Illuminate\Database\Events\ConnectionEvent; -use Siteworxpro\App\Annotations\Events\ListensFor; +use Siteworxpro\App\Attributes\Events\ListensFor; use Siteworxpro\App\Events\Listeners\Listener; use Siteworxpro\App\Services\Facades\Logger; diff --git a/src/Http/Middleware/JwtMiddleware.php b/src/Http/Middleware/JwtMiddleware.php index ed15165..f5d8e7f 100644 --- a/src/Http/Middleware/JwtMiddleware.php +++ b/src/Http/Middleware/JwtMiddleware.php @@ -21,7 +21,7 @@ use League\Route\Dispatcher; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use Siteworxpro\App\Annotations\Guards\Jwt; +use Siteworxpro\App\Attributes\Guards\Jwt; use Siteworxpro\App\Controllers\Controller; use Siteworxpro\App\Http\JsonResponseFactory; use Siteworxpro\App\Services\Facades\Config; @@ -103,7 +103,7 @@ class JwtMiddleware extends Middleware /** @var Jwt $jwtInstance */ $jwtInstance = $attribute->newInstance(); - if ($jwtInstance->getRequiredAudience() !== '') { + if ($jwtInstance->getAudience() !== '') { $requiredAudience = $jwtInstance->getAudience(); } diff --git a/src/Http/Middleware/ScopeMiddleware.php b/src/Http/Middleware/ScopeMiddleware.php index cb4a7b8..fb9d5d0 100644 --- a/src/Http/Middleware/ScopeMiddleware.php +++ b/src/Http/Middleware/ScopeMiddleware.php @@ -8,7 +8,7 @@ use League\Route\Dispatcher; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; -use Siteworxpro\App\Annotations\Guards\Scope; +use Siteworxpro\App\Attributes\Guards\Scope; use Siteworxpro\App\Controllers\Controller; use Siteworxpro\App\Http\JsonResponseFactory; use Siteworxpro\HttpStatus\CodesEnum; diff --git a/src/Services/Facades/Config.php b/src/Services/Facades/Config.php index c01251c..2c791f5 100644 --- a/src/Services/Facades/Config.php +++ b/src/Services/Facades/Config.php @@ -14,6 +14,7 @@ use Siteworxpro\App\Services\Facade; * It extends the Facade class from the Illuminate\Support\Facades namespace. * * @method static array | bool | string | int | null get(string $key) Retrieve the configuration value for the given key. // @codingStandardsIgnoreStart + * @method static void set(string $key, mixed $value) Set the configuration value for the given key. // @codingStandardsIgnoreEnd * * @package Siteworx\App\Facades */ diff --git a/tests/Attributes/Guards/JwtTest.php b/tests/Attributes/Guards/JwtTest.php new file mode 100644 index 0000000..b4f426a --- /dev/null +++ b/tests/Attributes/Guards/JwtTest.php @@ -0,0 +1,49 @@ +getAttributes(Jwt::class); + $this->assertCount(1, $attributes); + + /** @var Jwt $instance */ + $instance = $attributes[0]->newInstance(); + $this->assertEquals('default-audience', $instance->getAudience()); + $this->assertEquals('default-issuer', $instance->getIssuer()); + } + + public function testGetsClassFromCustom(): void + { + $reflection = new \ReflectionClass(TestClassSpecific::class); + $attributes = $reflection->getAttributes(Jwt::class); + $this->assertCount(1, $attributes); + + /** @var Jwt $instance */ + $instance = $attributes[0]->newInstance(); + $this->assertEquals('custom-audience', $instance->getAudience()); + $this->assertEquals('custom-issuer', $instance->getIssuer()); + } +} + +#[Jwt] +class TestClass // @codingStandardsIgnoreLine +{ +} + +#[Jwt('custom-issuer', 'custom-audience')] +class TestClassSpecific // @codingStandardsIgnoreLine +{ +} diff --git a/tests/Attributes/Guards/ScopeTest.php b/tests/Attributes/Guards/ScopeTest.php new file mode 100644 index 0000000..638d477 --- /dev/null +++ b/tests/Attributes/Guards/ScopeTest.php @@ -0,0 +1,43 @@ +getAttributes(Scope::class); + $this->assertCount(1, $attributes); + + /** @var Scope $instance */ + $instance = $attributes[0]->newInstance(); + $this->assertEquals(['read:users'], $instance->getScopes()); + } + + public function testGetsClassFromCustom(): void + { + $reflection = new \ReflectionClass(TestClassMultiple::class); + $attributes = $reflection->getAttributes(Scope::class); + $this->assertCount(1, $attributes); + + /** @var Scope $instance */ + $instance = $attributes[0]->newInstance(); + $this->assertEquals(['read:users', 'write:users'], $instance->getScopes()); + } +} + +#[Scope(['read:users', 'write:users'])] +class TestClassMultiple // @codingStandardsIgnoreLine +{ +} + +#[Scope(['read:users'])] +class TestClassSingle // @codingStandardsIgnoreLine +{ +} diff --git a/tests/Attributes/HandlesMessageTest.php b/tests/Attributes/HandlesMessageTest.php new file mode 100644 index 0000000..7bc8c08 --- /dev/null +++ b/tests/Attributes/HandlesMessageTest.php @@ -0,0 +1,27 @@ +getAttributes(HandlesMessage::class); + $this->assertCount(1, $attributes); + + /** @var HandlesMessage $instance */ + $instance = $attributes[0]->newInstance(); + $this->assertEquals('Siteworxpro\Tests\Attributes\TestClass', $instance->getMessageClass()); + } +} + +#[HandlesMessage('Siteworxpro\Tests\Attributes\TestClass')] +class TestClass // @codingStandardsIgnoreLine +{ +}