From f3e4bcc7334c9bcddbeca23996c2e73fad6bef36 Mon Sep 17 00:00:00 2001 From: Thomas <9749173+uhthomas@users.noreply.github.com> Date: Fri, 20 Mar 2026 15:07:40 +0000 Subject: [PATCH] fix(server): queue version check job when config changed (#27094) Nothing happens when the version checks are enabled, which means the server may return very stale versions until the next job runs. Refs: #26935 --- server/src/services/version.service.spec.ts | 27 +++++++++++++++++++++ server/src/services/version.service.ts | 7 ++++++ 2 files changed, 34 insertions(+) diff --git a/server/src/services/version.service.spec.ts b/server/src/services/version.service.spec.ts index 7872f720a9..eacae928eb 100644 --- a/server/src/services/version.service.spec.ts +++ b/server/src/services/version.service.spec.ts @@ -1,5 +1,6 @@ import { DateTime } from 'luxon'; import { SemVer } from 'semver'; +import { defaults } from 'src/config'; import { serverVersion } from 'src/constants'; import { ImmichEnvironment, JobName, JobStatus, SystemMetadataKey } from 'src/enum'; import { VersionService } from 'src/services/version.service'; @@ -130,6 +131,32 @@ describe(VersionService.name, () => { }); }); + describe('onConfigUpdate', () => { + it('should queue a version check job when newVersionCheck is enabled', async () => { + await sut.onConfigUpdate({ + oldConfig: { ...defaults, newVersionCheck: { enabled: false } }, + newConfig: { ...defaults, newVersionCheck: { enabled: true } }, + }); + expect(mocks.job.queue).toHaveBeenCalledWith({ name: JobName.VersionCheck, data: {} }); + }); + + it('should not queue a version check job when newVersionCheck is disabled', async () => { + await sut.onConfigUpdate({ + oldConfig: { ...defaults, newVersionCheck: { enabled: true } }, + newConfig: { ...defaults, newVersionCheck: { enabled: false } }, + }); + expect(mocks.job.queue).not.toHaveBeenCalled(); + }); + + it('should not queue a version check job when newVersionCheck was already enabled', async () => { + await sut.onConfigUpdate({ + oldConfig: { ...defaults, newVersionCheck: { enabled: true } }, + newConfig: { ...defaults, newVersionCheck: { enabled: true } }, + }); + expect(mocks.job.queue).not.toHaveBeenCalled(); + }); + }); + describe('onWebsocketConnection', () => { it('should send on_server_version client event', async () => { await sut.onWebsocketConnection({ userId: '42' }); diff --git a/server/src/services/version.service.ts b/server/src/services/version.service.ts index fd51fa9adf..fc51481cad 100644 --- a/server/src/services/version.service.ts +++ b/server/src/services/version.service.ts @@ -55,6 +55,13 @@ export class VersionService extends BaseService { return this.versionRepository.getAll(); } + @OnEvent({ name: 'ConfigUpdate' }) + async onConfigUpdate({ oldConfig, newConfig }: ArgOf<'ConfigUpdate'>) { + if (!oldConfig.newVersionCheck.enabled && newConfig.newVersionCheck.enabled) { + await this.handleQueueVersionCheck(); + } + } + async handleQueueVersionCheck() { await this.jobRepository.queue({ name: JobName.VersionCheck, data: {} }); }