From 84c3b392bace70931c8365774ad3bb506b0289e7 Mon Sep 17 00:00:00 2001 From: Ron Rise Date: Wed, 10 Dec 2025 08:45:51 -0500 Subject: [PATCH] refactor: remove status_code from response classes and update related tests --- makefile | 5 +++++ src/Controllers/HealthcheckController.php | 15 +++++++++------ src/Docs/UnauthorizedResponse.php | 1 - src/Http/Responses/GenericResponse.php | 3 --- src/Http/Responses/NotFoundResponse.php | 2 -- src/Http/Responses/ServerErrorResponse.php | 6 +++--- tests/Controllers/IndexControllerTest.php | 4 ++-- tests/Http/Responses/NotFoundResponseTest.php | 1 - tests/Http/Responses/ServerErrorResponseTest.php | 12 ++++++++---- 9 files changed, 27 insertions(+), 22 deletions(-) diff --git a/makefile b/makefile index 6eb733f..693603f 100644 --- a/makefile +++ b/makefile @@ -82,6 +82,11 @@ composer-install: ## Install PHP dependencies in the composer runtime container @$(DOCKER) up $(COMPOSER_RUNTIME) -d --no-recreate $(COMPOSER) "composer install --no-interaction --prefer-dist --optimize-autoloader --ignore-platform-reqs" +composer-install-no-dev: ## Install PHP dependencies without dev packages in the composer runtime container + @printf "$(COMPOSE) $(GREEN)Installing PHP dependencies (no-dev) in $(COMPOSER_RUNTIME)$(RESET)\n" + @$(DOCKER) up $(COMPOSER_RUNTIME) -d --no-recreate + $(COMPOSER) "composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader --ignore-platform-reqs" + composer-require: ## Require a PHP package in the composer runtime container (usage: make composer-require package=vendor/package) ifndef package $(error package variable is required: make composer-require package=vendor/package) diff --git a/src/Controllers/HealthcheckController.php b/src/Controllers/HealthcheckController.php index ac93f20..7b5bfda 100644 --- a/src/Controllers/HealthcheckController.php +++ b/src/Controllers/HealthcheckController.php @@ -9,7 +9,9 @@ use Nyholm\Psr7\ServerRequest; use Psr\Http\Message\ResponseInterface; use Siteworxpro\App\Http\JsonResponseFactory; use Siteworxpro\App\Http\Responses\GenericResponse; +use Siteworxpro\App\Http\Responses\ServerErrorResponse; use Siteworxpro\App\Models\Model; +use Siteworxpro\App\Services\Facades\Logger; use Siteworxpro\App\Services\Facades\Redis; use Siteworxpro\HttpStatus\CodesEnum; use OpenApi\Attributes as OA; @@ -43,18 +45,19 @@ class HealthcheckController extends Controller throw new \Exception('Redis ping failed'); } } catch (\Exception $e) { + Logger::emergency( + 'Healthcheck failed: ' . $e->getMessage(), + ['exception' => $e] + ); + return JsonResponseFactory::createJsonResponse( - [ - 'status_code' => CodesEnum::SERVICE_UNAVAILABLE->value, - 'message' => 'Healthcheck Failed', - 'error' => $e->getMessage(), - ], + new ServerErrorResponse($e), CodesEnum::SERVICE_UNAVAILABLE ); } return JsonResponseFactory::createJsonResponse( - new GenericResponse('Healthcheck OK', CodesEnum::OK->value) + new GenericResponse('Healthcheck OK') ); } } diff --git a/src/Docs/UnauthorizedResponse.php b/src/Docs/UnauthorizedResponse.php index 742b27c..dc92acf 100644 --- a/src/Docs/UnauthorizedResponse.php +++ b/src/Docs/UnauthorizedResponse.php @@ -16,7 +16,6 @@ class UnauthorizedResponse extends OA\Response mediaType: 'application/json', schema: new OA\Schema( properties: [ - new OA\Property(property: 'status_code', type: 'integer', example: 401), new OA\Property(property: 'message', type: 'string', example: 'Unauthorized'), ] ) diff --git a/src/Http/Responses/GenericResponse.php b/src/Http/Responses/GenericResponse.php index 93d01e6..7755702 100644 --- a/src/Http/Responses/GenericResponse.php +++ b/src/Http/Responses/GenericResponse.php @@ -11,14 +11,12 @@ use OpenApi\Attributes as OA; schema: 'GenericResponse', properties: [ new OA\Property(property: 'message', type: 'string', example: 'Operation completed successfully.'), - new OA\Property(property: 'status_code', type: 'integer', example: 200), ] )] readonly class GenericResponse implements Arrayable { public function __construct( private string $message = '', - private int $statusCode = 200 ) { } @@ -26,7 +24,6 @@ readonly class GenericResponse implements Arrayable { return [ 'message' => $this->message, - 'status_code' => $this->statusCode, ]; } } diff --git a/src/Http/Responses/NotFoundResponse.php b/src/Http/Responses/NotFoundResponse.php index 4a62504..7a165bb 100644 --- a/src/Http/Responses/NotFoundResponse.php +++ b/src/Http/Responses/NotFoundResponse.php @@ -14,7 +14,6 @@ use OpenApi\Attributes as OA; type: 'string', example: 'The requested resource /api/resource was not found.' ), - new OA\Property(property: 'status_code', type: 'integer', example: 404), new OA\Property( property: 'context', description: 'Additional context about the not found error.', @@ -32,7 +31,6 @@ readonly class NotFoundResponse implements Arrayable public function toArray(): array { return [ - 'status_code' => CodesEnum::NOT_FOUND->value, 'message' => 'The requested resource ' . $this->uri . ' was not found.', 'context' => $this->context, ]; diff --git a/src/Http/Responses/ServerErrorResponse.php b/src/Http/Responses/ServerErrorResponse.php index 36e0ca3..7abe0a1 100644 --- a/src/Http/Responses/ServerErrorResponse.php +++ b/src/Http/Responses/ServerErrorResponse.php @@ -11,7 +11,7 @@ use OpenApi\Attributes as OA; schema: 'ServerErrorResponse', properties: array( new OA\Property(property: 'message', type: 'string', example: 'An internal server error occurred.'), - new OA\Property(property: 'status_code', type: 'integer', example: 500), + new OA\Property(property: 'code', type: 'integer', example: 500), new OA\Property( property: 'file', type: 'string', @@ -35,7 +35,7 @@ readonly class ServerErrorResponse implements Arrayable { if (Config::get('app.dev_mode')) { return [ - 'status_code' => $this->e->getCode() != 0 ? + 'code' => $this->e->getCode() != 0 ? $this->e->getCode() : CodesEnum::INTERNAL_SERVER_ERROR->value, 'message' => $this->e->getMessage(), @@ -47,7 +47,7 @@ readonly class ServerErrorResponse implements Arrayable } return [ - 'status_code' => $this->e->getCode() != 0 ? + 'code' => $this->e->getCode() != 0 ? $this->e->getCode() : CodesEnum::INTERNAL_SERVER_ERROR->value, 'message' => 'An internal server error occurred.', diff --git a/tests/Controllers/IndexControllerTest.php b/tests/Controllers/IndexControllerTest.php index 67cff2d..47d03b5 100644 --- a/tests/Controllers/IndexControllerTest.php +++ b/tests/Controllers/IndexControllerTest.php @@ -20,7 +20,7 @@ class IndexControllerTest extends AbstractController $response = $controller->get($this->getMockRequest()); $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('{"message":"Server is running","status_code":200}', (string)$response->getBody()); + $this->assertEquals('{"message":"Server is running"}', (string)$response->getBody()); } /** @@ -35,6 +35,6 @@ class IndexControllerTest extends AbstractController $response = $controller->post($this->getMockRequest()); $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('{"message":"POST request received","status_code":200}', (string)$response->getBody()); + $this->assertEquals('{"message":"POST request received"}', (string)$response->getBody()); } } diff --git a/tests/Http/Responses/NotFoundResponseTest.php b/tests/Http/Responses/NotFoundResponseTest.php index 23d1449..fcbd627 100644 --- a/tests/Http/Responses/NotFoundResponseTest.php +++ b/tests/Http/Responses/NotFoundResponseTest.php @@ -12,7 +12,6 @@ class NotFoundResponseTest extends Unit $response = new NotFoundResponse('/api/resource', ['key' => 'value']); $expected = [ - 'status_code' => 404, 'message' => 'The requested resource /api/resource was not found.', 'context' => ['key' => 'value'], ]; diff --git a/tests/Http/Responses/ServerErrorResponseTest.php b/tests/Http/Responses/ServerErrorResponseTest.php index 295fc75..f9ac467 100644 --- a/tests/Http/Responses/ServerErrorResponseTest.php +++ b/tests/Http/Responses/ServerErrorResponseTest.php @@ -19,7 +19,7 @@ class ServerErrorResponseTest extends Unit $response = new ServerErrorResponse($e, ['operation' => 'data_processing']); $expected = [ - 'status_code' => 500, + 'code' => 500, 'message' => 'A Test Error occurred.', 'context' => [ 'operation' => 'data_processing' @@ -35,13 +35,15 @@ class ServerErrorResponseTest extends Unit public function testToArrayNotInDevMode(): void { + Config::set('app.dev_mode', false); + try { throw new \Exception('A Test Error occurred.'); } catch (\Exception $exception) { $response = new ServerErrorResponse($exception); $expected = [ - 'status_code' => 500, + 'code' => 500, 'message' => 'An internal server error occurred.', ]; @@ -51,13 +53,15 @@ class ServerErrorResponseTest extends Unit public function testToArrayIfCodeIsSet(): void { + Config::set('app.dev_mode', false); + try { throw new \Exception('A Test Error occurred.', 1234); } catch (\Exception $exception) { $response = new ServerErrorResponse($exception); $expected = [ - 'status_code' => 1234, + 'code' => 1234, 'message' => 'An internal server error occurred.', ]; @@ -75,7 +79,7 @@ class ServerErrorResponseTest extends Unit $response = new ServerErrorResponse($exception); $expected = [ - 'status_code' => 1234, + 'code' => 1234, 'message' => 'A Test Error occurred.', 'file' => $exception->getFile(), 'line' => $exception->getLine(),