Skip to content

Commit

Permalink
refactor(server): immich work
Browse files Browse the repository at this point in the history
  • Loading branch information
jrasm91 committed Nov 1, 2024
1 parent b9096f3 commit d508fc9
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 35 deletions.
26 changes: 7 additions & 19 deletions server/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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,
Expand All @@ -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) });

Expand All @@ -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],
Expand Down
2 changes: 2 additions & 0 deletions server/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
6 changes: 4 additions & 2 deletions server/src/services/base.service.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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,
Expand Down
5 changes: 3 additions & 2 deletions server/src/services/job.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ describe(JobService.name, () => {
let telemetryMock: Mocked<ITelemetryRepository>;

beforeEach(() => {
({ sut, assetMock, jobMock, loggerMock, telemetryMock } = newTestService(JobService));
({ sut, assetMock, jobMock, loggerMock, telemetryMock } = newTestService(JobService, {
worker: ImmichWorker.MICROSERVICES,
}));
});

it('should work', () => {
Expand All @@ -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);
Expand Down
9 changes: 1 addition & 8 deletions server/src/services/job.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
13 changes: 9 additions & 4 deletions server/test/utils.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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<typeof BaseService>;
type Constructor<Type, Args extends Array<any>> = {
Expand All @@ -54,9 +56,11 @@ type Constructor<Type, Args extends Array<any>> = {

export const newTestService = <T extends BaseService>(
Service: Constructor<T, BaseServiceArgs>,
overrides?: RepositoryOverrides,
overrides?: Overrides,
) => {
const { metadataRepository } = overrides || {};
const { metadataRepository, worker: workerOverride } = overrides || {};

const worker = workerOverride || ImmichWorker.API;

const accessMock = newAccessRepositoryMock();
const loggerMock = newLoggerRepositoryMock();
Expand Down Expand Up @@ -98,6 +102,7 @@ export const newTestService = <T extends BaseService>(
const viewMock = newViewRepositoryMock();

const sut = new Service(
worker,
loggerMock,
accessMock,
activityMock,
Expand Down

0 comments on commit d508fc9

Please sign in to comment.