Use composer metadata as primary source for version and ping build
All checks were successful
CI/CD Pipeline / deploy (push) Successful in 23s
CI/CD Pipeline / promote_stable (push) Successful in 2s

This commit is contained in:
2026-02-24 23:26:30 +01:00
parent 78bdd869ef
commit 8e86fcdbd9
4 changed files with 64 additions and 16 deletions

View File

@@ -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;
}
}

View File

@@ -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,
];
}
}

View File

@@ -1,9 +1,8 @@
<?php
use App\Models\Setting;
it('returns ping status with build and notification state', function (): void {
Setting::updateOrCreate(['key' => '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,
]);

View File

@@ -1,16 +1,15 @@
<?php
use App\Models\Setting;
it('returns version and build info', function (): void {
Setting::updateOrCreate(['key' => '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,
]);
});