Fix update notifications and clear update cache
Handle hotfix upgrade messaging and clear stale update state after applying updates. - UpdateController: when notifying admins for hotfixes, pass the current app version as the "to" version so notifications read e.g. "v1.1.3 has been updated" instead of showing a commit SHA. - NotificationService: adjust system upgrade message to show a simple "has been updated" message when fromVersion equals toVersion (hotfix/file updates) and standard "upgraded from X to Y" otherwise; factor migration label formatting. - UpdateService: clear cached update-check state after a successful update (add clearUpdateCache method) so the UI no longer shows a stale "update available" card. Keep latest_available_version unchanged to avoid view inconsistencies before migrations run.
This commit is contained in:
@@ -115,9 +115,13 @@ class UpdateController extends Controller
|
|||||||
if (!$hasMigrations) {
|
if (!$hasMigrations) {
|
||||||
try {
|
try {
|
||||||
$notificationService = new NotificationService();
|
$notificationService = new NotificationService();
|
||||||
|
// For hotfixes the "to_version" is a commit SHA (e.g. "4371f17"),
|
||||||
|
// not a semver string. Pass the current app version so the
|
||||||
|
// notification reads "v1.1.3 has been updated" instead of "v4371f17".
|
||||||
|
$notifyToVersion = ($type === 'hotfix') ? $fromVersion : $toVersion;
|
||||||
$notificationService->notifyAdminsUpgrade(
|
$notificationService->notifyAdminsUpgrade(
|
||||||
$fromVersion,
|
$fromVersion,
|
||||||
$toVersion,
|
$notifyToVersion,
|
||||||
0,
|
0,
|
||||||
!empty($result['composer_manual_required'])
|
!empty($result['composer_manual_required'])
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -573,7 +573,13 @@ class NotificationService
|
|||||||
*/
|
*/
|
||||||
public function notifySystemUpgrade(int $userId, string $fromVersion, string $toVersion, int $migrationsCount, bool $composerManualRequired = false): void
|
public function notifySystemUpgrade(int $userId, string $fromVersion, string $toVersion, int $migrationsCount, bool $composerManualRequired = false): void
|
||||||
{
|
{
|
||||||
$message = "Domain Monitor upgraded from v{$fromVersion} to v{$toVersion} ({$migrationsCount} migration" . ($migrationsCount > 1 ? 's' : '') . " applied)";
|
$migrationLabel = $migrationsCount . ' migration' . ($migrationsCount !== 1 ? 's' : '') . ' applied';
|
||||||
|
if ($fromVersion === $toVersion) {
|
||||||
|
// Hotfix: same version, just file updates
|
||||||
|
$message = "Domain Monitor v{$toVersion} has been updated ({$migrationLabel})";
|
||||||
|
} else {
|
||||||
|
$message = "Domain Monitor upgraded from v{$fromVersion} to v{$toVersion} ({$migrationLabel})";
|
||||||
|
}
|
||||||
if ($composerManualRequired) {
|
if ($composerManualRequired) {
|
||||||
$message .= ". Composer could not be run here (e.g. exec disabled). If dependencies changed, run \"composer install --no-dev\" manually via SSH or Terminal.";
|
$message .= ". Composer could not be run here (e.g. exec disabled). If dependencies changed, run \"composer install --no-dev\" manually via SSH or Terminal.";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -243,6 +243,9 @@ class UpdateService
|
|||||||
? ($this->settingModel->getValue('latest_available_version') ?: $this->settingModel->getAppVersion())
|
? ($this->settingModel->getValue('latest_available_version') ?: $this->settingModel->getAppVersion())
|
||||||
: ($this->settingModel->getValue('latest_remote_sha') ? substr($this->settingModel->getValue('latest_remote_sha'), 0, 7) : 'latest');
|
: ($this->settingModel->getValue('latest_remote_sha') ? substr($this->settingModel->getValue('latest_remote_sha'), 0, 7) : 'latest');
|
||||||
|
|
||||||
|
// Clear cached update state so the UI no longer shows a stale "update available" card
|
||||||
|
$this->clearUpdateCache();
|
||||||
|
|
||||||
$this->logger->endOperation('Application Update', [
|
$this->logger->endOperation('Application Update', [
|
||||||
'success' => true,
|
'success' => true,
|
||||||
'files_updated' => $filesUpdated,
|
'files_updated' => $filesUpdated,
|
||||||
@@ -386,6 +389,24 @@ class UpdateService
|
|||||||
// Private: Cache methods
|
// Private: Cache methods
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all cached update-check state so the UI no longer shows stale "update available" info.
|
||||||
|
* Called after a successful update is applied.
|
||||||
|
*/
|
||||||
|
private function clearUpdateCache(): void
|
||||||
|
{
|
||||||
|
$this->settingModel->setValue('last_update_check', null);
|
||||||
|
$this->settingModel->setValue('commits_behind_count', '0');
|
||||||
|
$this->settingModel->setValue('latest_remote_sha', '');
|
||||||
|
$this->settingModel->setValue('latest_release_notes', '');
|
||||||
|
$this->settingModel->setValue('latest_release_url', '');
|
||||||
|
$this->settingModel->setValue('latest_release_published_at', '');
|
||||||
|
// Note: latest_available_version is kept — it's used by the view to compare
|
||||||
|
// against current_version. After migrations bump app_version, the comparison
|
||||||
|
// will no longer show an update. Clearing it could cause issues if migrations
|
||||||
|
// haven't run yet and the user reloads the page.
|
||||||
|
}
|
||||||
|
|
||||||
private function isCacheValid(string $lastCheckTimestamp): bool
|
private function isCacheValid(string $lastCheckTimestamp): bool
|
||||||
{
|
{
|
||||||
$lastCheck = strtotime($lastCheckTimestamp);
|
$lastCheck = strtotime($lastCheckTimestamp);
|
||||||
|
|||||||
Reference in New Issue
Block a user