fix(upgrade): clear stale upgrade flag when version is already current
Refactor upgrade state initialization into a shared `refreshUpgradeState()` method used by both `mount()` and `checkUpdate()`. The method now uses `version_compare` to validate upgrade availability and clears the `new_version_available` flag in InstanceSettings when the current version is already equal to or newer than the latest version, preventing stale upgrade notifications from persisting after a successful update.
This commit is contained in:
parent
02558d8672
commit
dbd2b68a08
2 changed files with 90 additions and 10 deletions
|
|
@ -23,25 +23,42 @@ class Upgrade extends Component
|
||||||
|
|
||||||
public function mount()
|
public function mount()
|
||||||
{
|
{
|
||||||
$this->currentVersion = config('constants.coolify.version');
|
$this->refreshUpgradeState();
|
||||||
$this->latestVersion = get_latest_version_of_coolify();
|
|
||||||
$this->devMode = isDev();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function checkUpdate()
|
public function checkUpdate()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$this->latestVersion = get_latest_version_of_coolify();
|
$this->refreshUpgradeState();
|
||||||
$this->currentVersion = config('constants.coolify.version');
|
|
||||||
$this->isUpgradeAvailable = data_get(InstanceSettings::get(), 'new_version_available', false);
|
|
||||||
if (isDev()) {
|
|
||||||
$this->isUpgradeAvailable = true;
|
|
||||||
}
|
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function refreshUpgradeState(): void
|
||||||
|
{
|
||||||
|
$this->currentVersion = config('constants.coolify.version');
|
||||||
|
$this->latestVersion = get_latest_version_of_coolify();
|
||||||
|
$this->devMode = isDev();
|
||||||
|
|
||||||
|
if ($this->devMode) {
|
||||||
|
$this->isUpgradeAvailable = true;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$settings = InstanceSettings::find(0);
|
||||||
|
$hasNewerVersion = version_compare($this->latestVersion, $this->currentVersion, '>');
|
||||||
|
$newVersionAvailable = (bool) data_get($settings, 'new_version_available', false);
|
||||||
|
|
||||||
|
if ($settings && $newVersionAvailable && ! $hasNewerVersion) {
|
||||||
|
$settings->update(['new_version_available' => false]);
|
||||||
|
$newVersionAvailable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->isUpgradeAvailable = $hasNewerVersion && $newVersionAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
public function upgrade()
|
public function upgrade()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,19 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Livewire\Upgrade;
|
use App\Livewire\Upgrade;
|
||||||
|
use App\Models\InstanceSettings;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Livewire\Livewire;
|
use Livewire\Livewire;
|
||||||
|
|
||||||
|
uses(RefreshDatabase::class);
|
||||||
|
|
||||||
it('initializes latest version during mount from cached versions data', function () {
|
it('initializes latest version during mount from cached versions data', function () {
|
||||||
config(['constants.coolify.version' => '4.0.0-beta.998']);
|
config(['constants.coolify.version' => '4.0.0-beta.998']);
|
||||||
|
InstanceSettings::create([
|
||||||
|
'id' => 0,
|
||||||
|
'new_version_available' => true,
|
||||||
|
]);
|
||||||
|
|
||||||
Cache::shouldReceive('remember')
|
Cache::shouldReceive('remember')
|
||||||
->once()
|
->once()
|
||||||
|
|
@ -21,12 +29,17 @@
|
||||||
Livewire::test(Upgrade::class)
|
Livewire::test(Upgrade::class)
|
||||||
->assertSet('currentVersion', '4.0.0-beta.998')
|
->assertSet('currentVersion', '4.0.0-beta.998')
|
||||||
->assertSet('latestVersion', '4.0.0-beta.999')
|
->assertSet('latestVersion', '4.0.0-beta.999')
|
||||||
->set('isUpgradeAvailable', true)
|
->assertSet('isUpgradeAvailable', true)
|
||||||
->assertSee('4.0.0-beta.998')
|
->assertSee('4.0.0-beta.998')
|
||||||
->assertSee('4.0.0-beta.999');
|
->assertSee('4.0.0-beta.999');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('falls back to 0.0.0 during mount when cached versions data is unavailable', function () {
|
it('falls back to 0.0.0 during mount when cached versions data is unavailable', function () {
|
||||||
|
InstanceSettings::create([
|
||||||
|
'id' => 0,
|
||||||
|
'new_version_available' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
Cache::shouldReceive('remember')
|
Cache::shouldReceive('remember')
|
||||||
->once()
|
->once()
|
||||||
->with('coolify:versions:all', 3600, Mockery::type(\Closure::class))
|
->with('coolify:versions:all', 3600, Mockery::type(\Closure::class))
|
||||||
|
|
@ -35,3 +48,53 @@
|
||||||
Livewire::test(Upgrade::class)
|
Livewire::test(Upgrade::class)
|
||||||
->assertSet('latestVersion', '0.0.0');
|
->assertSet('latestVersion', '0.0.0');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('clears stale upgrade availability when current version already matches latest version', function () {
|
||||||
|
config(['constants.coolify.version' => '4.0.0-beta.999']);
|
||||||
|
InstanceSettings::create([
|
||||||
|
'id' => 0,
|
||||||
|
'new_version_available' => true,
|
||||||
|
]);
|
||||||
|
|
||||||
|
Cache::shouldReceive('remember')
|
||||||
|
->once()
|
||||||
|
->with('coolify:versions:all', 3600, Mockery::type(\Closure::class))
|
||||||
|
->andReturn([
|
||||||
|
'coolify' => [
|
||||||
|
'v4' => [
|
||||||
|
'version' => '4.0.0-beta.999',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
Livewire::test(Upgrade::class)
|
||||||
|
->assertSet('latestVersion', '4.0.0-beta.999')
|
||||||
|
->assertSet('isUpgradeAvailable', false);
|
||||||
|
|
||||||
|
expect(InstanceSettings::findOrFail(0)->new_version_available)->toBeFalse();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('clears stale upgrade availability when current version is newer than cached latest version', function () {
|
||||||
|
config(['constants.coolify.version' => '4.0.0-beta.1000']);
|
||||||
|
InstanceSettings::create([
|
||||||
|
'id' => 0,
|
||||||
|
'new_version_available' => true,
|
||||||
|
]);
|
||||||
|
|
||||||
|
Cache::shouldReceive('remember')
|
||||||
|
->once()
|
||||||
|
->with('coolify:versions:all', 3600, Mockery::type(\Closure::class))
|
||||||
|
->andReturn([
|
||||||
|
'coolify' => [
|
||||||
|
'v4' => [
|
||||||
|
'version' => '4.0.0-beta.999',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
Livewire::test(Upgrade::class)
|
||||||
|
->assertSet('latestVersion', '4.0.0-beta.999')
|
||||||
|
->assertSet('isUpgradeAvailable', false);
|
||||||
|
|
||||||
|
expect(InstanceSettings::findOrFail(0)->new_version_available)->toBeFalse();
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue