From 8e86fcdbd91d101ec4b0eb3ab622c0c25484fffc Mon Sep 17 00:00:00 2001 From: tracer Date: Tue, 24 Feb 2026 23:26:30 +0100 Subject: [PATCH] Use composer metadata as primary source for version and ping build --- app/Http/Controllers/PingController.php | 29 +++++++++++++++++--- app/Http/Controllers/VersionController.php | 31 ++++++++++++++++++++-- tests/Feature/PingControllerTest.php | 7 +++-- tests/Feature/VersionControllerTest.php | 13 +++++---- 4 files changed, 64 insertions(+), 16 deletions(-) diff --git a/app/Http/Controllers/PingController.php b/app/Http/Controllers/PingController.php index 993322e..7431221 100644 --- a/app/Http/Controllers/PingController.php +++ b/app/Http/Controllers/PingController.php @@ -9,15 +9,38 @@ class PingController extends Controller { public function __invoke(): JsonResponse { - $build = Setting::query()->where('key', 'build')->value('value'); - $reportedBuild = $build !== null ? ((int) $build) + 1 : 1; + $build = $this->readComposerBuild(); + if ($build === null) { + $build = Setting::query()->where('key', 'build')->value('value'); + } return response()->json([ 'connect' => 'ok', 'version_status' => [ - 'build' => $reportedBuild, + 'build' => $build !== null ? (int) $build : null, ], 'notification_state' => false, ]); } + + private function readComposerBuild(): ?int + { + $path = base_path('composer.json'); + if (!is_file($path) || !is_readable($path)) { + return null; + } + + $raw = file_get_contents($path); + if ($raw === false) { + return null; + } + + $data = json_decode($raw, true); + if (!is_array($data)) { + return null; + } + + $build = trim((string) ($data['build'] ?? '')); + return ctype_digit($build) ? (int) $build : null; + } } diff --git a/app/Http/Controllers/VersionController.php b/app/Http/Controllers/VersionController.php index 9432b8f..b80ac7c 100644 --- a/app/Http/Controllers/VersionController.php +++ b/app/Http/Controllers/VersionController.php @@ -9,12 +9,39 @@ class VersionController extends Controller { public function __invoke(): JsonResponse { - $version = Setting::where('key', 'version')->value('value'); - $build = Setting::where('key', 'build')->value('value'); + $composer = $this->readComposerMetadata(); + $version = $composer['version'] ?? Setting::where('key', 'version')->value('value'); + $build = $composer['build'] ?? Setting::where('key', 'build')->value('value'); return response()->json([ 'version' => $version, 'build' => $build !== null ? (int) $build : null, ]); } + + private function readComposerMetadata(): array + { + $path = base_path('composer.json'); + if (!is_file($path) || !is_readable($path)) { + return []; + } + + $raw = file_get_contents($path); + if ($raw === false) { + return []; + } + + $data = json_decode($raw, true); + if (!is_array($data)) { + return []; + } + + $version = trim((string) ($data['version'] ?? '')); + $build = trim((string) ($data['build'] ?? '')); + + return [ + 'version' => $version !== '' ? $version : null, + 'build' => ctype_digit($build) ? (int) $build : null, + ]; + } } diff --git a/tests/Feature/PingControllerTest.php b/tests/Feature/PingControllerTest.php index 566b256..6ef2421 100644 --- a/tests/Feature/PingControllerTest.php +++ b/tests/Feature/PingControllerTest.php @@ -1,9 +1,8 @@ 'build'], ['value' => '1337']); + $composer = json_decode((string) file_get_contents(base_path('composer.json')), true); + $expectedBuild = isset($composer['build']) ? (int) $composer['build'] : null; $response = $this->getJson('/ping'); @@ -11,7 +10,7 @@ it('returns ping status with build and notification state', function (): void { $response->assertJson([ 'connect' => 'ok', 'version_status' => [ - 'build' => 1337, + 'build' => $expectedBuild, ], 'notification_state' => false, ]); diff --git a/tests/Feature/VersionControllerTest.php b/tests/Feature/VersionControllerTest.php index f484ced..ea1b1b7 100644 --- a/tests/Feature/VersionControllerTest.php +++ b/tests/Feature/VersionControllerTest.php @@ -1,16 +1,15 @@ 'version'], ['value' => '1.2.3']); - Setting::updateOrCreate(['key' => 'build'], ['value' => '42']); +it('returns version and build info from composer metadata', function (): void { + $composer = json_decode((string) file_get_contents(base_path('composer.json')), true); + $expectedVersion = (string) ($composer['version'] ?? ''); + $expectedBuild = isset($composer['build']) ? (int) $composer['build'] : null; $response = $this->getJson('/api/version'); $response->assertOk(); $response->assertJsonFragment([ - 'version' => '1.2.3', - 'build' => 42, + 'version' => $expectedVersion, + 'build' => $expectedBuild, ]); });