Skip to content

Commit

Permalink
refactor: config repository (immich-app#15495)
Browse files Browse the repository at this point in the history
* refactor: access repository

* refactor: config repository
  • Loading branch information
jrasm91 authored and ExceptionsOccur committed Jan 22, 2025
1 parent b82630c commit c933589
Show file tree
Hide file tree
Showing 35 changed files with 150 additions and 171 deletions.
2 changes: 1 addition & 1 deletion server/src/cores/storage.core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import { AssetEntity } from 'src/entities/asset.entity';
import { PersonEntity } from 'src/entities/person.entity';
import { AssetFileType, AssetPathType, ImageFormat, PathType, PersonPathType, StorageFolder } from 'src/enum';
import { IAssetRepository } from 'src/interfaces/asset.interface';
import { IConfigRepository } from 'src/interfaces/config.interface';
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
import { ILoggerRepository } from 'src/interfaces/logger.interface';
import { IMoveRepository } from 'src/interfaces/move.interface';
import { IPersonRepository } from 'src/interfaces/person.interface';
import { IStorageRepository } from 'src/interfaces/storage.interface';
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
import { IConfigRepository } from 'src/types';
import { getAssetFiles } from 'src/utils/asset.util';
import { getConfig } from 'src/utils/config';

Expand Down
14 changes: 0 additions & 14 deletions server/src/interfaces/audit.interface.ts

This file was deleted.

98 changes: 0 additions & 98 deletions server/src/interfaces/config.interface.ts

This file was deleted.

4 changes: 2 additions & 2 deletions server/src/middleware/websocket.adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { Redis } from 'ioredis';
import { ServerOptions } from 'socket.io';
import { IConfigRepository } from 'src/interfaces/config.interface';
import { ConfigRepository } from 'src/repositories/config.repository';

export class WebSocketAdapter extends IoAdapter {
constructor(private app: INestApplicationContext) {
super(app);
}

createIOServer(port: number, options?: ServerOptions): any {
const { redis } = this.app.get<IConfigRepository>(IConfigRepository).getEnv();
const { redis } = this.app.get(ConfigRepository).getEnv();
const server = super.createIOServer(port, options);
const pubClient = new Redis(redis);
const subClient = pubClient.duplicate();
Expand Down
9 changes: 7 additions & 2 deletions server/src/repositories/audit.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,15 @@ import { InjectKysely } from 'nestjs-kysely';
import { DB } from 'src/db';
import { DummyValue, GenerateSql } from 'src/decorators';
import { DatabaseAction, EntityType } from 'src/enum';
import { AuditSearch, IAuditRepository } from 'src/interfaces/audit.interface';

export interface AuditSearch {
action?: DatabaseAction;
entityType?: EntityType;
userIds: string[];
}

@Injectable()
export class AuditRepository implements IAuditRepository {
export class AuditRepository {
constructor(@InjectKysely() private db: Kysely<DB>) {}

@GenerateSql({
Expand Down
99 changes: 93 additions & 6 deletions server/src/repositories/config.repository.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,106 @@
import { RegisterQueueOptions } from '@nestjs/bullmq';
import { Inject, Injectable, Optional } from '@nestjs/common';
import { QueueOptions } from 'bullmq';
import { plainToInstance } from 'class-transformer';
import { validateSync } from 'class-validator';
import { Request, Response } from 'express';
import { RedisOptions } from 'ioredis';
import { KyselyConfig } from 'kysely';
import { PostgresJSDialect } from 'kysely-postgres-js';
import { CLS_ID } from 'nestjs-cls';
import { CLS_ID, ClsModuleOptions } from 'nestjs-cls';
import { OpenTelemetryModuleOptions } from 'nestjs-otel/lib/interfaces';
import { join, resolve } from 'node:path';
import postgres, { Notice } from 'postgres';
import { citiesFile, excludePaths, IWorker } from 'src/constants';
import { Telemetry } from 'src/decorators';
import { EnvDto } from 'src/dtos/env.dto';
import { ImmichEnvironment, ImmichHeader, ImmichTelemetry, ImmichWorker } from 'src/enum';
import { EnvData, IConfigRepository } from 'src/interfaces/config.interface';
import { DatabaseExtension } from 'src/interfaces/database.interface';
import { ImmichEnvironment, ImmichHeader, ImmichTelemetry, ImmichWorker, LogLevel } from 'src/enum';
import { DatabaseConnectionParams, DatabaseExtension, VectorExtension } from 'src/interfaces/database.interface';
import { QueueName } from 'src/interfaces/job.interface';
import { setDifference } from 'src/utils/set';
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';

export interface EnvData {
host?: string;
port: number;
environment: ImmichEnvironment;
configFile?: string;
logLevel?: LogLevel;

buildMetadata: {
build?: string;
buildUrl?: string;
buildImage?: string;
buildImageUrl?: string;
repository?: string;
repositoryUrl?: string;
sourceRef?: string;
sourceCommit?: string;
sourceUrl?: string;
thirdPartySourceUrl?: string;
thirdPartyBugFeatureUrl?: string;
thirdPartyDocumentationUrl?: string;
thirdPartySupportUrl?: string;
};

bull: {
config: QueueOptions;
queues: RegisterQueueOptions[];
};

cls: {
config: ClsModuleOptions;
};

database: {
config: { typeorm: PostgresConnectionOptions & DatabaseConnectionParams; kysely: KyselyConfig };
skipMigrations: boolean;
vectorExtension: VectorExtension;
};

licensePublicKey: {
client: string;
server: string;
};

network: {
trustedProxies: string[];
};

otel: OpenTelemetryModuleOptions;

resourcePaths: {
lockFile: string;
geodata: {
dateFile: string;
admin1: string;
admin2: string;
cities500: string;
naturalEarthCountriesPath: string;
};
web: {
root: string;
indexHtml: string;
};
};

redis: RedisOptions;

telemetry: {
apiPort: number;
microservicesPort: number;
metrics: Set<ImmichTelemetry>;
};

storage: {
ignoreMountCheckErrors: boolean;
};

workers: ImmichWorker[];

noColor: boolean;
nodeVersion?: string;
}

const productionKeys = {
client:
Expand Down Expand Up @@ -269,10 +356,10 @@ let cached: EnvData | undefined;

@Injectable()
@Telemetry({ enabled: false })
export class ConfigRepository implements IConfigRepository {
export class ConfigRepository {
constructor(@Inject(IWorker) @Optional() private worker?: ImmichWorker) {}

getEnv(): EnvData {
getEnv() {
if (!cached) {
cached = getEnv();
}
Expand Down
4 changes: 2 additions & 2 deletions server/src/repositories/database.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { InjectKysely } from 'nestjs-kysely';
import semver from 'semver';
import { POSTGRES_VERSION_RANGE, VECTOR_VERSION_RANGE, VECTORS_VERSION_RANGE } from 'src/constants';
import { DB } from 'src/db';
import { IConfigRepository } from 'src/interfaces/config.interface';
import {
DatabaseExtension,
DatabaseLock,
Expand All @@ -18,6 +17,7 @@ import {
VectorUpdateResult,
} from 'src/interfaces/database.interface';
import { ILoggerRepository } from 'src/interfaces/logger.interface';
import { ConfigRepository } from 'src/repositories/config.repository';
import { UPSERT_COLUMNS } from 'src/utils/database';
import { isValidInteger } from 'src/validation';
import { DataSource, EntityManager, EntityMetadata, QueryRunner } from 'typeorm';
Expand All @@ -31,7 +31,7 @@ export class DatabaseRepository implements IDatabaseRepository {
@InjectKysely() private db: Kysely<DB>,
@InjectDataSource() private dataSource: DataSource,
@Inject(ILoggerRepository) private logger: ILoggerRepository,
@Inject(IConfigRepository) configRepository: IConfigRepository,
configRepository: ConfigRepository,
) {
this.vectorExtension = configRepository.getEnv().database.vectorExtension;
this.logger.setContext(DatabaseRepository.name);
Expand Down
3 changes: 1 addition & 2 deletions server/src/repositories/event.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import _ from 'lodash';
import { Server, Socket } from 'socket.io';
import { EventConfig } from 'src/decorators';
import { ImmichWorker, MetadataKey } from 'src/enum';
import { IConfigRepository } from 'src/interfaces/config.interface';
import {
ArgsOf,
ClientEventMap,
Expand Down Expand Up @@ -52,7 +51,7 @@ export class EventRepository implements OnGatewayConnection, OnGatewayDisconnect

constructor(
private moduleRef: ModuleRef,
@Inject(IConfigRepository) private configRepository: ConfigRepository,
private configRepository: ConfigRepository,
@Inject(ILoggerRepository) private logger: ILoggerRepository,
) {
this.logger.setContext(EventRepository.name);
Expand Down
6 changes: 2 additions & 4 deletions server/src/repositories/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { IAlbumUserRepository } from 'src/interfaces/album-user.interface';
import { IAlbumRepository } from 'src/interfaces/album.interface';
import { IAssetRepository } from 'src/interfaces/asset.interface';
import { IAuditRepository } from 'src/interfaces/audit.interface';
import { IConfigRepository } from 'src/interfaces/config.interface';
import { ICronRepository } from 'src/interfaces/cron.interface';
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
import { IDatabaseRepository } from 'src/interfaces/database.interface';
Expand Down Expand Up @@ -78,15 +76,15 @@ export const repositories = [
//
AccessRepository,
ActivityRepository,
AuditRepository,
ApiKeyRepository,
ConfigRepository,
];

export const providers = [
{ provide: IAlbumRepository, useClass: AlbumRepository },
{ provide: IAlbumUserRepository, useClass: AlbumUserRepository },
{ provide: IAssetRepository, useClass: AssetRepository },
{ provide: IAuditRepository, useClass: AuditRepository },
{ provide: IConfigRepository, useClass: ConfigRepository },
{ provide: ICronRepository, useClass: CronRepository },
{ provide: ICryptoRepository, useClass: CryptoRepository },
{ provide: IDatabaseRepository, useClass: DatabaseRepository },
Expand Down
6 changes: 2 additions & 4 deletions server/src/repositories/job.repository.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import { getQueueToken } from '@nestjs/bullmq';
import { Inject, Injectable } from '@nestjs/common';
import { ModuleRef, Reflector } from '@nestjs/core';
import { SchedulerRegistry } from '@nestjs/schedule';
import { JobsOptions, Queue, Worker } from 'bullmq';
import { ClassConstructor } from 'class-transformer';
import { setTimeout } from 'node:timers/promises';
import { JobConfig } from 'src/decorators';
import { MetadataKey } from 'src/enum';
import { IConfigRepository } from 'src/interfaces/config.interface';
import { IEventRepository } from 'src/interfaces/event.interface';
import {
IEntityJob,
Expand All @@ -22,6 +20,7 @@ import {
QueueStatus,
} from 'src/interfaces/job.interface';
import { ILoggerRepository } from 'src/interfaces/logger.interface';
import { ConfigRepository } from 'src/repositories/config.repository';
import { getKeyByValue, getMethodNames, ImmichStartupError } from 'src/utils/misc';

type JobMapItem = {
Expand All @@ -38,8 +37,7 @@ export class JobRepository implements IJobRepository {

constructor(
private moduleRef: ModuleRef,
private schedulerRegistry: SchedulerRegistry,
@Inject(IConfigRepository) private configRepository: IConfigRepository,
private configRepository: ConfigRepository,
@Inject(IEventRepository) private eventRepository: IEventRepository,
@Inject(ILoggerRepository) private logger: ILoggerRepository,
) {
Expand Down
2 changes: 1 addition & 1 deletion server/src/repositories/logger.repository.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ClsService } from 'nestjs-cls';
import { ImmichWorker } from 'src/enum';
import { IConfigRepository } from 'src/interfaces/config.interface';
import { LoggerRepository } from 'src/repositories/logger.repository';
import { IConfigRepository } from 'src/types';
import { mockEnvData, newConfigRepositoryMock } from 'test/repositories/config.repository.mock';
import { Mocked } from 'vitest';

Expand Down
Loading

0 comments on commit c933589

Please sign in to comment.