From 23b9aabbc889102a31aca82fdead2b3c979df864 Mon Sep 17 00:00:00 2001 From: rtcoder Date: Tue, 16 Jun 2026 20:36:58 +0200 Subject: [PATCH 1/6] Refactor `Response` and `ResponseEmitter` classes into `Engine\Response` namespace and update references --- Engine/App.php | 2 ++ Engine/Controller.php | 1 + Engine/JsonResponse.php | 1 + Engine/{ => Response}/Response.php | 2 +- Engine/{ => Response}/ResponseEmitter.php | 2 +- tests/ApiCoreTest.php | 8 ++++---- 6 files changed, 10 insertions(+), 6 deletions(-) rename Engine/{ => Response}/Response.php (94%) rename Engine/{ => Response}/ResponseEmitter.php (91%) diff --git a/Engine/App.php b/Engine/App.php index d6246bc..a1676c8 100755 --- a/Engine/App.php +++ b/Engine/App.php @@ -3,6 +3,8 @@ namespace Engine; use Engine\Error\HttpError; +use Engine\Response\Response; +use Engine\Response\ResponseEmitter; use Engine\Routing\Attributes\Body; use Engine\Routing\Attributes\Header; use Engine\Routing\Attributes\PathParam; diff --git a/Engine/Controller.php b/Engine/Controller.php index d986efd..bc0db89 100755 --- a/Engine/Controller.php +++ b/Engine/Controller.php @@ -2,6 +2,7 @@ namespace Engine; +use Engine\Response\Response; use JsonException; /** diff --git a/Engine/JsonResponse.php b/Engine/JsonResponse.php index 08d91d8..55298a2 100644 --- a/Engine/JsonResponse.php +++ b/Engine/JsonResponse.php @@ -2,6 +2,7 @@ namespace Engine; +use Engine\Response\Response; use JsonException; class JsonResponse extends Response diff --git a/Engine/Response.php b/Engine/Response/Response.php similarity index 94% rename from Engine/Response.php rename to Engine/Response/Response.php index ccd8747..d9d2e77 100644 --- a/Engine/Response.php +++ b/Engine/Response/Response.php @@ -1,6 +1,6 @@ statusCode = $response->getStatusCode(); $this->headers = $response->getHeaders(); From 28325f97210e7a82c463acdff11ae6631b3f073d Mon Sep 17 00:00:00 2001 From: rtcoder Date: Tue, 16 Jun 2026 20:38:22 +0200 Subject: [PATCH 2/6] Move `JsonResponse` to `Engine\Response` namespace and update all references --- Engine/App.php | 1 + Engine/Controller.php | 1 + Engine/{ => Response}/JsonResponse.php | 3 +-- README.md | 4 ++-- application/modules/Health/Controllers/HealthController.php | 2 +- tests/ApiCoreTest.php | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) rename Engine/{ => Response}/JsonResponse.php (95%) diff --git a/Engine/App.php b/Engine/App.php index a1676c8..089a00e 100755 --- a/Engine/App.php +++ b/Engine/App.php @@ -3,6 +3,7 @@ namespace Engine; use Engine\Error\HttpError; +use Engine\Response\JsonResponse; use Engine\Response\Response; use Engine\Response\ResponseEmitter; use Engine\Routing\Attributes\Body; diff --git a/Engine/Controller.php b/Engine/Controller.php index bc0db89..d1fba27 100755 --- a/Engine/Controller.php +++ b/Engine/Controller.php @@ -2,6 +2,7 @@ namespace Engine; +use Engine\Response\JsonResponse; use Engine\Response\Response; use JsonException; diff --git a/Engine/JsonResponse.php b/Engine/Response/JsonResponse.php similarity index 95% rename from Engine/JsonResponse.php rename to Engine/Response/JsonResponse.php index 55298a2..706e3a2 100644 --- a/Engine/JsonResponse.php +++ b/Engine/Response/JsonResponse.php @@ -1,8 +1,7 @@ Date: Tue, 16 Jun 2026 20:40:40 +0200 Subject: [PATCH 3/6] Refactor: Move `ServiceContainer` and `ServiceInterface` to `Engine\Service` namespace and update references --- Engine/App.php | 1 + Engine/Controller.php | 1 + Engine/Modules/AbstractModule.php | 2 +- Engine/Modules/ModuleInterface.php | 2 +- Engine/Modules/ModuleLoader.php | 2 +- Engine/{ => Service}/ServiceContainer.php | 4 ++-- Engine/{ => Service}/ServiceInterface.php | 4 ++-- README.md | 7 +------ application/modules/Health/Module.php | 2 +- tests/ApiCoreTest.php | 2 +- 10 files changed, 12 insertions(+), 15 deletions(-) rename Engine/{ => Service}/ServiceContainer.php (98%) rename Engine/{ => Service}/ServiceInterface.php (92%) diff --git a/Engine/App.php b/Engine/App.php index 089a00e..4a8d0e4 100755 --- a/Engine/App.php +++ b/Engine/App.php @@ -11,6 +11,7 @@ use Engine\Routing\Attributes\PathParam; use Engine\Routing\Attributes\QueryParam; use Engine\Routing\Attributes\Status; +use Engine\Service\ServiceContainer; use JsonException; use ReflectionClass; use ReflectionException; diff --git a/Engine/Controller.php b/Engine/Controller.php index d1fba27..76fa991 100755 --- a/Engine/Controller.php +++ b/Engine/Controller.php @@ -4,6 +4,7 @@ use Engine\Response\JsonResponse; use Engine\Response\Response; +use Engine\Service\ServiceContainer; use JsonException; /** diff --git a/Engine/Modules/AbstractModule.php b/Engine/Modules/AbstractModule.php index 37d530f..fcab3e9 100644 --- a/Engine/Modules/AbstractModule.php +++ b/Engine/Modules/AbstractModule.php @@ -3,7 +3,7 @@ namespace Engine\Modules; use Engine\Router; -use Engine\ServiceContainer; +use Engine\Service\ServiceContainer; abstract class AbstractModule implements ModuleInterface { diff --git a/Engine/Modules/ModuleInterface.php b/Engine/Modules/ModuleInterface.php index b006d94..03efe8d 100644 --- a/Engine/Modules/ModuleInterface.php +++ b/Engine/Modules/ModuleInterface.php @@ -3,7 +3,7 @@ namespace Engine\Modules; use Engine\Router; -use Engine\ServiceContainer; +use Engine\Service\ServiceContainer; interface ModuleInterface { diff --git a/Engine/Modules/ModuleLoader.php b/Engine/Modules/ModuleLoader.php index 39b2bc6..9c9ec7e 100644 --- a/Engine/Modules/ModuleLoader.php +++ b/Engine/Modules/ModuleLoader.php @@ -3,7 +3,7 @@ namespace Engine\Modules; use Engine\Router; -use Engine\ServiceContainer; +use Engine\Service\ServiceContainer; class ModuleLoader { diff --git a/Engine/ServiceContainer.php b/Engine/Service/ServiceContainer.php similarity index 98% rename from Engine/ServiceContainer.php rename to Engine/Service/ServiceContainer.php index 91ff3e1..36ac3eb 100644 --- a/Engine/ServiceContainer.php +++ b/Engine/Service/ServiceContainer.php @@ -1,6 +1,6 @@ singletons); } -} \ No newline at end of file +} diff --git a/Engine/ServiceInterface.php b/Engine/Service/ServiceInterface.php similarity index 92% rename from Engine/ServiceInterface.php rename to Engine/Service/ServiceInterface.php index ab55e72..6ce20cf 100644 --- a/Engine/ServiceInterface.php +++ b/Engine/Service/ServiceInterface.php @@ -1,6 +1,6 @@ Date: Tue, 16 Jun 2026 20:42:17 +0200 Subject: [PATCH 4/6] Refactor: Move `Router` and related classes to `Engine\Routing\Router` namespace and update references --- Engine/App.php | 1 + Engine/Console/Commands/RouteList.php | 2 +- Engine/Modules/AbstractModule.php | 2 +- Engine/Modules/ModuleInterface.php | 2 +- Engine/Modules/ModuleLoader.php | 2 +- Engine/Routing/AttributeRouteLoader.php | 4 ++-- Engine/{ => Routing/Router}/Route.php | 4 +++- Engine/{ => Routing/Router}/RouteMatch.php | 2 +- Engine/{ => Routing/Router}/Router.php | 3 ++- README.md | 7 ++----- application/modules/Health/Module.php | 2 +- tests/ApiCoreTest.php | 6 +++--- 12 files changed, 19 insertions(+), 18 deletions(-) rename Engine/{ => Routing/Router}/Route.php (97%) rename Engine/{ => Routing/Router}/RouteMatch.php (92%) rename Engine/{ => Routing/Router}/Router.php (97%) diff --git a/Engine/App.php b/Engine/App.php index 4a8d0e4..9647609 100755 --- a/Engine/App.php +++ b/Engine/App.php @@ -11,6 +11,7 @@ use Engine\Routing\Attributes\PathParam; use Engine\Routing\Attributes\QueryParam; use Engine\Routing\Attributes\Status; +use Engine\Routing\Router\Router; use Engine\Service\ServiceContainer; use JsonException; use ReflectionClass; diff --git a/Engine/Console/Commands/RouteList.php b/Engine/Console/Commands/RouteList.php index 5d33409..05048c8 100644 --- a/Engine/Console/Commands/RouteList.php +++ b/Engine/Console/Commands/RouteList.php @@ -5,7 +5,7 @@ use Engine\Console\Cli; use Engine\Console\CommandInterface; use Engine\Modules\ModuleLoader; -use Engine\Router; +use Engine\Routing\Router\Router; class RouteList implements CommandInterface { diff --git a/Engine/Modules/AbstractModule.php b/Engine/Modules/AbstractModule.php index fcab3e9..40f763a 100644 --- a/Engine/Modules/AbstractModule.php +++ b/Engine/Modules/AbstractModule.php @@ -2,7 +2,7 @@ namespace Engine\Modules; -use Engine\Router; +use Engine\Routing\Router\Router; use Engine\Service\ServiceContainer; abstract class AbstractModule implements ModuleInterface diff --git a/Engine/Modules/ModuleInterface.php b/Engine/Modules/ModuleInterface.php index 03efe8d..012be35 100644 --- a/Engine/Modules/ModuleInterface.php +++ b/Engine/Modules/ModuleInterface.php @@ -2,7 +2,7 @@ namespace Engine\Modules; -use Engine\Router; +use Engine\Routing\Router\Router; use Engine\Service\ServiceContainer; interface ModuleInterface diff --git a/Engine/Modules/ModuleLoader.php b/Engine/Modules/ModuleLoader.php index 9c9ec7e..acfb2d0 100644 --- a/Engine/Modules/ModuleLoader.php +++ b/Engine/Modules/ModuleLoader.php @@ -2,7 +2,7 @@ namespace Engine\Modules; -use Engine\Router; +use Engine\Routing\Router\Router; use Engine\Service\ServiceContainer; class ModuleLoader diff --git a/Engine/Routing/AttributeRouteLoader.php b/Engine/Routing/AttributeRouteLoader.php index 0317647..40f046c 100644 --- a/Engine/Routing/AttributeRouteLoader.php +++ b/Engine/Routing/AttributeRouteLoader.php @@ -2,9 +2,9 @@ namespace Engine\Routing; -use Engine\Router; use Engine\Routing\Attributes\Route; use Engine\Routing\Attributes\RoutePrefix; +use Engine\Routing\Router\Router; use ReflectionClass; class AttributeRouteLoader @@ -33,7 +33,7 @@ private function loadControllerRoutes(Router $router, string $controllerClass): foreach ($reflectionClass->getMethods() as $method) { foreach ($method->getAttributes(Route::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) { - /** @var Route $route */ + /** @var \Engine\Routing\Router\Route $route */ $route = $attribute->newInstance(); $router->add( diff --git a/Engine/Route.php b/Engine/Routing/Router/Route.php similarity index 97% rename from Engine/Route.php rename to Engine/Routing/Router/Route.php index 0cb9b61..e71036c 100644 --- a/Engine/Route.php +++ b/Engine/Routing/Router/Route.php @@ -1,6 +1,8 @@ load($router, [TestAttributeController::class]); $routes = array_map( - static fn (\Engine\Route $route): string => $route->getMethod() . ' ' . $route->getPath(), + static fn (Router\Route $route): string => $route->getMethod() . ' ' . $route->getPath(), $router->getRoutes() ); @@ -224,7 +224,7 @@ function makeRequest(string $method, string $uri, string $body = '', array $quer assertSameValue(true, $container->has(HealthService::class), 'Health module service should be registered.'); $routes = array_map( - static fn (\Engine\Route $route): string => $route->getMethod() . ' ' . $route->getPath(), + static fn (Router\Route $route): string => $route->getMethod() . ' ' . $route->getPath(), $router->getRoutes() ); From 19f3c752a657dd9ddfd41b5784d9eb9a38c4707e Mon Sep 17 00:00:00 2001 From: rtcoder Date: Tue, 16 Jun 2026 21:14:59 +0200 Subject: [PATCH 5/6] Fix route type imports after namespace refactor --- Engine/Routing/AttributeRouteLoader.php | 2 +- tests/ApiCoreTest.php | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Engine/Routing/AttributeRouteLoader.php b/Engine/Routing/AttributeRouteLoader.php index 40f046c..8a3e0db 100644 --- a/Engine/Routing/AttributeRouteLoader.php +++ b/Engine/Routing/AttributeRouteLoader.php @@ -33,7 +33,7 @@ private function loadControllerRoutes(Router $router, string $controllerClass): foreach ($reflectionClass->getMethods() as $method) { foreach ($method->getAttributes(Route::class, \ReflectionAttribute::IS_INSTANCEOF) as $attribute) { - /** @var \Engine\Routing\Router\Route $route */ + /** @var Route $route */ $route = $attribute->newInstance(); $router->add( diff --git a/tests/ApiCoreTest.php b/tests/ApiCoreTest.php index e3ef76e..da4503a 100644 --- a/tests/ApiCoreTest.php +++ b/tests/ApiCoreTest.php @@ -16,6 +16,7 @@ use Engine\Routing\Attributes\QueryParam; use Engine\Routing\Attributes\RoutePrefix; use Engine\Routing\Attributes\Status; +use Engine\Routing\Router\Route; use Engine\Routing\Router\Router; use Engine\Service\ServiceContainer; use Modules\Health\Services\HealthService; @@ -112,7 +113,7 @@ function makeRequest(string $method, string $uri, string $body = '', array $quer (new AttributeRouteLoader())->load($router, [TestAttributeController::class]); $routes = array_map( - static fn (Router\Route $route): string => $route->getMethod() . ' ' . $route->getPath(), + static fn (Route $route): string => $route->getMethod() . ' ' . $route->getPath(), $router->getRoutes() ); @@ -224,7 +225,7 @@ function makeRequest(string $method, string $uri, string $body = '', array $quer assertSameValue(true, $container->has(HealthService::class), 'Health module service should be registered.'); $routes = array_map( - static fn (Router\Route $route): string => $route->getMethod() . ' ' . $route->getPath(), + static fn (Route $route): string => $route->getMethod() . ' ' . $route->getPath(), $router->getRoutes() ); From 0b8eb67bec694b8e495efc24df6bac7c7c6531f9 Mon Sep 17 00:00:00 2001 From: rtcoder Date: Tue, 16 Jun 2026 21:19:41 +0200 Subject: [PATCH 6/6] Read live PR labels in version check --- .github/workflows/api.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/api.yml b/.github/workflows/api.yml index 9c562c0..224ea88 100644 --- a/.github/workflows/api.yml +++ b/.github/workflows/api.yml @@ -53,8 +53,15 @@ jobs: uses: actions/github-script@v7 with: script: | - const labels = context.payload.pull_request.labels.map((label) => label.name); - const versionLabels = labels.filter((name) => /^v\d+\.\d+(\.\d+)?$/.test(name)); + const {owner, repo} = context.repo; + const pull_number = context.payload.pull_request.number; + const {data: labels} = await github.rest.issues.listLabelsOnIssue({ + owner, + repo, + issue_number: pull_number, + }); + const labelNames = labels.map((label) => label.name); + const versionLabels = labelNames.filter((name) => /^v\d+\.\d+(\.\d+)?$/.test(name)); if (versionLabels.length !== 1) { core.setFailed(`Pull request must have exactly one version label like v0.6. Found: ${versionLabels.join(', ') || 'none'}`);