diff --git a/server/src/app.module.ts b/server/src/app.module.ts index 436b0f1252..7b9098c010 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -6,6 +6,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { ClsModule } from 'nestjs-cls'; import { OpenTelemetryModule } from 'nestjs-otel'; import { commands } from 'src/commands'; +import { IWorker } from 'src/constants'; import { controllers } from 'src/controllers'; import { entities } from 'src/entities'; import { ImmichWorker } from 'src/enum'; @@ -57,12 +58,9 @@ const imports = [ TypeOrmModule.forFeature(entities), ]; -abstract class BaseModule implements OnModuleInit, OnModuleDestroy { - private get worker() { - return this.getWorker(); - } - +class BaseModule implements OnModuleInit, OnModuleDestroy { constructor( + @Inject(IWorker) private worker: ImmichWorker, @Inject(ILoggerRepository) logger: ILoggerRepository, @Inject(IEventRepository) private eventRepository: IEventRepository, @Inject(IJobRepository) private jobRepository: IJobRepository, @@ -71,8 +69,6 @@ abstract class BaseModule implements OnModuleInit, OnModuleDestroy { logger.setAppName(this.worker); } - abstract getWorker(): ImmichWorker; - async onModuleInit() { this.telemetryRepository.setup({ repositories: repositories.map(({ useClass }) => useClass) }); @@ -94,23 +90,15 @@ abstract class BaseModule implements OnModuleInit, OnModuleDestroy { @Module({ imports: [...imports, ScheduleModule.forRoot()], controllers: [...controllers], - providers: [...common, ...middleware], + providers: [...common, ...middleware, { provide: IWorker, useValue: ImmichWorker.API }], }) -export class ApiModule extends BaseModule { - getWorker() { - return ImmichWorker.API; - } -} +export class ApiModule extends BaseModule {} @Module({ imports: [...imports], - providers: [...common, SchedulerRegistry], + providers: [...common, { provide: IWorker, useValue: ImmichWorker.MICROSERVICES }, SchedulerRegistry], }) -export class MicroservicesModule extends BaseModule { - getWorker() { - return ImmichWorker.MICROSERVICES; - } -} +export class MicroservicesModule extends BaseModule {} @Module({ imports: [...imports], diff --git a/server/src/constants.ts b/server/src/constants.ts index e99970723a..0b9f525c71 100644 --- a/server/src/constants.ts +++ b/server/src/constants.ts @@ -13,6 +13,8 @@ export const ADDED_IN_PREFIX = 'This property was added in '; export const SALT_ROUNDS = 10; +export const IWorker = 'IWorker'; + const { version } = JSON.parse(readFileSync('./package.json', 'utf8')); export const serverVersion = new SemVer(version); diff --git a/server/src/services/base.service.ts b/server/src/services/base.service.ts index a312050f08..124e45b62c 100644 --- a/server/src/services/base.service.ts +++ b/server/src/services/base.service.ts @@ -1,9 +1,10 @@ -import { BadRequestException, Inject } from '@nestjs/common'; +import { BadRequestException, Inject, Optional } from '@nestjs/common'; import sanitize from 'sanitize-filename'; import { SystemConfig } from 'src/config'; -import { SALT_ROUNDS } from 'src/constants'; +import { IWorker, SALT_ROUNDS } from 'src/constants'; import { StorageCore } from 'src/cores/storage.core'; import { UserEntity } from 'src/entities/user.entity'; +import { ImmichWorker } from 'src/enum'; import { IAccessRepository } from 'src/interfaces/access.interface'; import { IActivityRepository } from 'src/interfaces/activity.interface'; import { IAlbumUserRepository } from 'src/interfaces/album-user.interface'; @@ -49,6 +50,7 @@ export class BaseService { protected storageCore: StorageCore; constructor( + @Inject(IWorker) @Optional() protected worker: ImmichWorker | undefined, @Inject(ILoggerRepository) protected logger: ILoggerRepository, @Inject(IAccessRepository) protected accessRepository: IAccessRepository, @Inject(IActivityRepository) protected activityRepository: IActivityRepository, diff --git a/server/src/services/job.service.spec.ts b/server/src/services/job.service.spec.ts index 03e89b07ec..0e7607f27a 100644 --- a/server/src/services/job.service.spec.ts +++ b/server/src/services/job.service.spec.ts @@ -18,7 +18,9 @@ describe(JobService.name, () => { let telemetryMock: Mocked; beforeEach(() => { - ({ sut, assetMock, jobMock, loggerMock, telemetryMock } = newTestService(JobService)); + ({ sut, assetMock, jobMock, loggerMock, telemetryMock } = newTestService(JobService, { + worker: ImmichWorker.MICROSERVICES, + })); }); it('should work', () => { @@ -27,7 +29,6 @@ describe(JobService.name, () => { describe('onConfigUpdate', () => { it('should update concurrency', () => { - sut.onBootstrap(ImmichWorker.MICROSERVICES); sut.onConfigUpdate({ oldConfig: defaults, newConfig: defaults }); expect(jobMock.setConcurrency).toHaveBeenCalledTimes(15); diff --git a/server/src/services/job.service.ts b/server/src/services/job.service.ts index ff5ddbf006..946d9b1c91 100644 --- a/server/src/services/job.service.ts +++ b/server/src/services/job.service.ts @@ -38,16 +38,9 @@ const asJobItem = (dto: JobCreateDto): JobItem => { @Injectable() export class JobService extends BaseService { - private isMicroservices = false; - - @OnEvent({ name: 'app.bootstrap' }) - onBootstrap(app: ArgOf<'app.bootstrap'>) { - this.isMicroservices = app === ImmichWorker.MICROSERVICES; - } - @OnEvent({ name: 'config.update', server: true }) onConfigUpdate({ newConfig: config }: ArgOf<'config.update'>) { - if (!this.isMicroservices) { + if (this.worker !== ImmichWorker.MICROSERVICES) { return; } diff --git a/server/test/utils.ts b/server/test/utils.ts index 09c86d1afb..a5a6119033 100644 --- a/server/test/utils.ts +++ b/server/test/utils.ts @@ -1,6 +1,7 @@ import { ChildProcessWithoutNullStreams } from 'node:child_process'; import { Writable } from 'node:stream'; import { PNG } from 'pngjs'; +import { ImmichWorker } from 'src/enum'; import { IMetadataRepository } from 'src/interfaces/metadata.interface'; import { BaseService } from 'src/services/base.service'; import { newAccessRepositoryMock } from 'test/repositories/access.repository.mock'; @@ -44,8 +45,9 @@ import { newViewRepositoryMock } from 'test/repositories/view.repository.mock'; import { Readable } from 'typeorm/platform/PlatformTools'; import { Mocked, vitest } from 'vitest'; -type RepositoryOverrides = { - metadataRepository: IMetadataRepository; +type Overrides = { + worker?: ImmichWorker; + metadataRepository?: IMetadataRepository; }; type BaseServiceArgs = ConstructorParameters; type Constructor> = { @@ -54,9 +56,11 @@ type Constructor> = { export const newTestService = ( Service: Constructor, - overrides?: RepositoryOverrides, + overrides?: Overrides, ) => { - const { metadataRepository } = overrides || {}; + const { metadataRepository, worker: workerOverride } = overrides || {}; + + const worker = workerOverride || ImmichWorker.API; const accessMock = newAccessRepositoryMock(); const loggerMock = newLoggerRepositoryMock(); @@ -98,6 +102,7 @@ export const newTestService = ( const viewMock = newViewRepositoryMock(); const sut = new Service( + worker, loggerMock, accessMock, activityMock,