mirror of
https://github.com/immich-app/immich.git
synced 2025-05-31 04:05:39 -04:00
refactor: config repository (#15495)
* refactor: access repository * refactor: config repository
This commit is contained in:
parent
332a865ce6
commit
9a27a99cab
@ -5,13 +5,13 @@ import { AssetEntity } from 'src/entities/asset.entity';
|
|||||||
import { PersonEntity } from 'src/entities/person.entity';
|
import { PersonEntity } from 'src/entities/person.entity';
|
||||||
import { AssetFileType, AssetPathType, ImageFormat, PathType, PersonPathType, StorageFolder } from 'src/enum';
|
import { AssetFileType, AssetPathType, ImageFormat, PathType, PersonPathType, StorageFolder } from 'src/enum';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { IMoveRepository } from 'src/interfaces/move.interface';
|
import { IMoveRepository } from 'src/interfaces/move.interface';
|
||||||
import { IPersonRepository } from 'src/interfaces/person.interface';
|
import { IPersonRepository } from 'src/interfaces/person.interface';
|
||||||
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { getAssetFiles } from 'src/utils/asset.util';
|
import { getAssetFiles } from 'src/utils/asset.util';
|
||||||
import { getConfig } from 'src/utils/config';
|
import { getConfig } from 'src/utils/config';
|
||||||
|
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
import { DatabaseAction, EntityType } from 'src/enum';
|
|
||||||
|
|
||||||
export const IAuditRepository = 'IAuditRepository';
|
|
||||||
|
|
||||||
export interface AuditSearch {
|
|
||||||
action?: DatabaseAction;
|
|
||||||
entityType?: EntityType;
|
|
||||||
userIds: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IAuditRepository {
|
|
||||||
getAfter(since: Date, options: AuditSearch): Promise<string[]>;
|
|
||||||
removeBefore(before: Date): Promise<void>;
|
|
||||||
}
|
|
@ -1,98 +0,0 @@
|
|||||||
import { RegisterQueueOptions } from '@nestjs/bullmq';
|
|
||||||
import { QueueOptions } from 'bullmq';
|
|
||||||
import { RedisOptions } from 'ioredis';
|
|
||||||
import { KyselyConfig } from 'kysely';
|
|
||||||
import { ClsModuleOptions } from 'nestjs-cls';
|
|
||||||
import { OpenTelemetryModuleOptions } from 'nestjs-otel/lib/interfaces';
|
|
||||||
import { ImmichEnvironment, ImmichTelemetry, ImmichWorker, LogLevel } from 'src/enum';
|
|
||||||
import { DatabaseConnectionParams, VectorExtension } from 'src/interfaces/database.interface';
|
|
||||||
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';
|
|
||||||
|
|
||||||
export const IConfigRepository = 'IConfigRepository';
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IConfigRepository {
|
|
||||||
getEnv(): EnvData;
|
|
||||||
getWorker(): ImmichWorker | undefined;
|
|
||||||
}
|
|
@ -3,7 +3,7 @@ import { IoAdapter } from '@nestjs/platform-socket.io';
|
|||||||
import { createAdapter } from '@socket.io/redis-adapter';
|
import { createAdapter } from '@socket.io/redis-adapter';
|
||||||
import { Redis } from 'ioredis';
|
import { Redis } from 'ioredis';
|
||||||
import { ServerOptions } from 'socket.io';
|
import { ServerOptions } from 'socket.io';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
|
|
||||||
export class WebSocketAdapter extends IoAdapter {
|
export class WebSocketAdapter extends IoAdapter {
|
||||||
constructor(private app: INestApplicationContext) {
|
constructor(private app: INestApplicationContext) {
|
||||||
@ -11,7 +11,7 @@ export class WebSocketAdapter extends IoAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
createIOServer(port: number, options?: ServerOptions): any {
|
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 server = super.createIOServer(port, options);
|
||||||
const pubClient = new Redis(redis);
|
const pubClient = new Redis(redis);
|
||||||
const subClient = pubClient.duplicate();
|
const subClient = pubClient.duplicate();
|
||||||
|
@ -4,10 +4,15 @@ import { InjectKysely } from 'nestjs-kysely';
|
|||||||
import { DB } from 'src/db';
|
import { DB } from 'src/db';
|
||||||
import { DummyValue, GenerateSql } from 'src/decorators';
|
import { DummyValue, GenerateSql } from 'src/decorators';
|
||||||
import { DatabaseAction, EntityType } from 'src/enum';
|
import { DatabaseAction, EntityType } from 'src/enum';
|
||||||
import { AuditSearch, IAuditRepository } from 'src/interfaces/audit.interface';
|
|
||||||
|
export interface AuditSearch {
|
||||||
|
action?: DatabaseAction;
|
||||||
|
entityType?: EntityType;
|
||||||
|
userIds: string[];
|
||||||
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AuditRepository implements IAuditRepository {
|
export class AuditRepository {
|
||||||
constructor(@InjectKysely() private db: Kysely<DB>) {}
|
constructor(@InjectKysely() private db: Kysely<DB>) {}
|
||||||
|
|
||||||
@GenerateSql({
|
@GenerateSql({
|
||||||
|
@ -1,19 +1,106 @@
|
|||||||
|
import { RegisterQueueOptions } from '@nestjs/bullmq';
|
||||||
import { Inject, Injectable, Optional } from '@nestjs/common';
|
import { Inject, Injectable, Optional } from '@nestjs/common';
|
||||||
|
import { QueueOptions } from 'bullmq';
|
||||||
import { plainToInstance } from 'class-transformer';
|
import { plainToInstance } from 'class-transformer';
|
||||||
import { validateSync } from 'class-validator';
|
import { validateSync } from 'class-validator';
|
||||||
import { Request, Response } from 'express';
|
import { Request, Response } from 'express';
|
||||||
|
import { RedisOptions } from 'ioredis';
|
||||||
|
import { KyselyConfig } from 'kysely';
|
||||||
import { PostgresJSDialect } from 'kysely-postgres-js';
|
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 { join, resolve } from 'node:path';
|
||||||
import postgres, { Notice } from 'postgres';
|
import postgres, { Notice } from 'postgres';
|
||||||
import { citiesFile, excludePaths, IWorker } from 'src/constants';
|
import { citiesFile, excludePaths, IWorker } from 'src/constants';
|
||||||
import { Telemetry } from 'src/decorators';
|
import { Telemetry } from 'src/decorators';
|
||||||
import { EnvDto } from 'src/dtos/env.dto';
|
import { EnvDto } from 'src/dtos/env.dto';
|
||||||
import { ImmichEnvironment, ImmichHeader, ImmichTelemetry, ImmichWorker } from 'src/enum';
|
import { ImmichEnvironment, ImmichHeader, ImmichTelemetry, ImmichWorker, LogLevel } from 'src/enum';
|
||||||
import { EnvData, IConfigRepository } from 'src/interfaces/config.interface';
|
import { DatabaseConnectionParams, DatabaseExtension, VectorExtension } from 'src/interfaces/database.interface';
|
||||||
import { DatabaseExtension } from 'src/interfaces/database.interface';
|
|
||||||
import { QueueName } from 'src/interfaces/job.interface';
|
import { QueueName } from 'src/interfaces/job.interface';
|
||||||
import { setDifference } from 'src/utils/set';
|
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 = {
|
const productionKeys = {
|
||||||
client:
|
client:
|
||||||
@ -269,10 +356,10 @@ let cached: EnvData | undefined;
|
|||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@Telemetry({ enabled: false })
|
@Telemetry({ enabled: false })
|
||||||
export class ConfigRepository implements IConfigRepository {
|
export class ConfigRepository {
|
||||||
constructor(@Inject(IWorker) @Optional() private worker?: ImmichWorker) {}
|
constructor(@Inject(IWorker) @Optional() private worker?: ImmichWorker) {}
|
||||||
|
|
||||||
getEnv(): EnvData {
|
getEnv() {
|
||||||
if (!cached) {
|
if (!cached) {
|
||||||
cached = getEnv();
|
cached = getEnv();
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ import { InjectKysely } from 'nestjs-kysely';
|
|||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
import { POSTGRES_VERSION_RANGE, VECTOR_VERSION_RANGE, VECTORS_VERSION_RANGE } from 'src/constants';
|
import { POSTGRES_VERSION_RANGE, VECTOR_VERSION_RANGE, VECTORS_VERSION_RANGE } from 'src/constants';
|
||||||
import { DB } from 'src/db';
|
import { DB } from 'src/db';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import {
|
import {
|
||||||
DatabaseExtension,
|
DatabaseExtension,
|
||||||
DatabaseLock,
|
DatabaseLock,
|
||||||
@ -18,6 +17,7 @@ import {
|
|||||||
VectorUpdateResult,
|
VectorUpdateResult,
|
||||||
} from 'src/interfaces/database.interface';
|
} from 'src/interfaces/database.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
import { UPSERT_COLUMNS } from 'src/utils/database';
|
import { UPSERT_COLUMNS } from 'src/utils/database';
|
||||||
import { isValidInteger } from 'src/validation';
|
import { isValidInteger } from 'src/validation';
|
||||||
import { DataSource, EntityManager, EntityMetadata, QueryRunner } from 'typeorm';
|
import { DataSource, EntityManager, EntityMetadata, QueryRunner } from 'typeorm';
|
||||||
@ -31,7 +31,7 @@ export class DatabaseRepository implements IDatabaseRepository {
|
|||||||
@InjectKysely() private db: Kysely<DB>,
|
@InjectKysely() private db: Kysely<DB>,
|
||||||
@InjectDataSource() private dataSource: DataSource,
|
@InjectDataSource() private dataSource: DataSource,
|
||||||
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
||||||
@Inject(IConfigRepository) configRepository: IConfigRepository,
|
configRepository: ConfigRepository,
|
||||||
) {
|
) {
|
||||||
this.vectorExtension = configRepository.getEnv().database.vectorExtension;
|
this.vectorExtension = configRepository.getEnv().database.vectorExtension;
|
||||||
this.logger.setContext(DatabaseRepository.name);
|
this.logger.setContext(DatabaseRepository.name);
|
||||||
|
@ -12,7 +12,6 @@ import _ from 'lodash';
|
|||||||
import { Server, Socket } from 'socket.io';
|
import { Server, Socket } from 'socket.io';
|
||||||
import { EventConfig } from 'src/decorators';
|
import { EventConfig } from 'src/decorators';
|
||||||
import { ImmichWorker, MetadataKey } from 'src/enum';
|
import { ImmichWorker, MetadataKey } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import {
|
import {
|
||||||
ArgsOf,
|
ArgsOf,
|
||||||
ClientEventMap,
|
ClientEventMap,
|
||||||
@ -52,7 +51,7 @@ export class EventRepository implements OnGatewayConnection, OnGatewayDisconnect
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private moduleRef: ModuleRef,
|
private moduleRef: ModuleRef,
|
||||||
@Inject(IConfigRepository) private configRepository: ConfigRepository,
|
private configRepository: ConfigRepository,
|
||||||
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
||||||
) {
|
) {
|
||||||
this.logger.setContext(EventRepository.name);
|
this.logger.setContext(EventRepository.name);
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import { IAlbumUserRepository } from 'src/interfaces/album-user.interface';
|
import { IAlbumUserRepository } from 'src/interfaces/album-user.interface';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.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 { ICronRepository } from 'src/interfaces/cron.interface';
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
||||||
@ -78,15 +76,15 @@ export const repositories = [
|
|||||||
//
|
//
|
||||||
AccessRepository,
|
AccessRepository,
|
||||||
ActivityRepository,
|
ActivityRepository,
|
||||||
|
AuditRepository,
|
||||||
ApiKeyRepository,
|
ApiKeyRepository,
|
||||||
|
ConfigRepository,
|
||||||
];
|
];
|
||||||
|
|
||||||
export const providers = [
|
export const providers = [
|
||||||
{ provide: IAlbumRepository, useClass: AlbumRepository },
|
{ provide: IAlbumRepository, useClass: AlbumRepository },
|
||||||
{ provide: IAlbumUserRepository, useClass: AlbumUserRepository },
|
{ provide: IAlbumUserRepository, useClass: AlbumUserRepository },
|
||||||
{ provide: IAssetRepository, useClass: AssetRepository },
|
{ provide: IAssetRepository, useClass: AssetRepository },
|
||||||
{ provide: IAuditRepository, useClass: AuditRepository },
|
|
||||||
{ provide: IConfigRepository, useClass: ConfigRepository },
|
|
||||||
{ provide: ICronRepository, useClass: CronRepository },
|
{ provide: ICronRepository, useClass: CronRepository },
|
||||||
{ provide: ICryptoRepository, useClass: CryptoRepository },
|
{ provide: ICryptoRepository, useClass: CryptoRepository },
|
||||||
{ provide: IDatabaseRepository, useClass: DatabaseRepository },
|
{ provide: IDatabaseRepository, useClass: DatabaseRepository },
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
import { getQueueToken } from '@nestjs/bullmq';
|
import { getQueueToken } from '@nestjs/bullmq';
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { ModuleRef, Reflector } from '@nestjs/core';
|
import { ModuleRef, Reflector } from '@nestjs/core';
|
||||||
import { SchedulerRegistry } from '@nestjs/schedule';
|
|
||||||
import { JobsOptions, Queue, Worker } from 'bullmq';
|
import { JobsOptions, Queue, Worker } from 'bullmq';
|
||||||
import { ClassConstructor } from 'class-transformer';
|
import { ClassConstructor } from 'class-transformer';
|
||||||
import { setTimeout } from 'node:timers/promises';
|
import { setTimeout } from 'node:timers/promises';
|
||||||
import { JobConfig } from 'src/decorators';
|
import { JobConfig } from 'src/decorators';
|
||||||
import { MetadataKey } from 'src/enum';
|
import { MetadataKey } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { IEventRepository } from 'src/interfaces/event.interface';
|
import { IEventRepository } from 'src/interfaces/event.interface';
|
||||||
import {
|
import {
|
||||||
IEntityJob,
|
IEntityJob,
|
||||||
@ -22,6 +20,7 @@ import {
|
|||||||
QueueStatus,
|
QueueStatus,
|
||||||
} from 'src/interfaces/job.interface';
|
} from 'src/interfaces/job.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
import { getKeyByValue, getMethodNames, ImmichStartupError } from 'src/utils/misc';
|
import { getKeyByValue, getMethodNames, ImmichStartupError } from 'src/utils/misc';
|
||||||
|
|
||||||
type JobMapItem = {
|
type JobMapItem = {
|
||||||
@ -38,8 +37,7 @@ export class JobRepository implements IJobRepository {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private moduleRef: ModuleRef,
|
private moduleRef: ModuleRef,
|
||||||
private schedulerRegistry: SchedulerRegistry,
|
private configRepository: ConfigRepository,
|
||||||
@Inject(IConfigRepository) private configRepository: IConfigRepository,
|
|
||||||
@Inject(IEventRepository) private eventRepository: IEventRepository,
|
@Inject(IEventRepository) private eventRepository: IEventRepository,
|
||||||
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
||||||
) {
|
) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { ClsService } from 'nestjs-cls';
|
import { ClsService } from 'nestjs-cls';
|
||||||
import { ImmichWorker } from 'src/enum';
|
import { ImmichWorker } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { LoggerRepository } from 'src/repositories/logger.repository';
|
import { LoggerRepository } from 'src/repositories/logger.repository';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { mockEnvData, newConfigRepositoryMock } from 'test/repositories/config.repository.mock';
|
import { mockEnvData, newConfigRepositoryMock } from 'test/repositories/config.repository.mock';
|
||||||
import { Mocked } from 'vitest';
|
import { Mocked } from 'vitest';
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import { ConsoleLogger, Inject, Injectable, Scope } from '@nestjs/common';
|
import { ConsoleLogger, Injectable, Scope } from '@nestjs/common';
|
||||||
import { isLogLevelEnabled } from '@nestjs/common/services/utils/is-log-level-enabled.util';
|
import { isLogLevelEnabled } from '@nestjs/common/services/utils/is-log-level-enabled.util';
|
||||||
import { ClsService } from 'nestjs-cls';
|
import { ClsService } from 'nestjs-cls';
|
||||||
import { Telemetry } from 'src/decorators';
|
import { Telemetry } from 'src/decorators';
|
||||||
import { LogLevel } from 'src/enum';
|
import { LogLevel } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
|
|
||||||
const LOG_LEVELS = [LogLevel.VERBOSE, LogLevel.DEBUG, LogLevel.LOG, LogLevel.WARN, LogLevel.ERROR, LogLevel.FATAL];
|
const LOG_LEVELS = [LogLevel.VERBOSE, LogLevel.DEBUG, LogLevel.LOG, LogLevel.WARN, LogLevel.ERROR, LogLevel.FATAL];
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ export class LoggerRepository extends ConsoleLogger implements ILoggerRepository
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private cls: ClsService,
|
private cls: ClsService,
|
||||||
@Inject(IConfigRepository) configRepository: IConfigRepository,
|
configRepository: ConfigRepository,
|
||||||
) {
|
) {
|
||||||
super(LoggerRepository.name);
|
super(LoggerRepository.name);
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ import { DB, GeodataPlaces, NaturalearthCountries } from 'src/db';
|
|||||||
import { AssetEntity, withExif } from 'src/entities/asset.entity';
|
import { AssetEntity, withExif } from 'src/entities/asset.entity';
|
||||||
import { NaturalEarthCountriesTempEntity } from 'src/entities/natural-earth-countries.entity';
|
import { NaturalEarthCountriesTempEntity } from 'src/entities/natural-earth-countries.entity';
|
||||||
import { LogLevel, SystemMetadataKey } from 'src/enum';
|
import { LogLevel, SystemMetadataKey } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import {
|
import {
|
||||||
GeoPoint,
|
GeoPoint,
|
||||||
@ -21,6 +20,7 @@ import {
|
|||||||
ReverseGeocodeResult,
|
ReverseGeocodeResult,
|
||||||
} from 'src/interfaces/map.interface';
|
} from 'src/interfaces/map.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
|
|
||||||
interface MapDB extends DB {
|
interface MapDB extends DB {
|
||||||
geodata_places_tmp: GeodataPlaces;
|
geodata_places_tmp: GeodataPlaces;
|
||||||
@ -30,7 +30,7 @@ interface MapDB extends DB {
|
|||||||
@Injectable()
|
@Injectable()
|
||||||
export class MapRepository implements IMapRepository {
|
export class MapRepository implements IMapRepository {
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(IConfigRepository) private configRepository: IConfigRepository,
|
private configRepository: ConfigRepository,
|
||||||
@Inject(ISystemMetadataRepository) private metadataRepository: ISystemMetadataRepository,
|
@Inject(ISystemMetadataRepository) private metadataRepository: ISystemMetadataRepository,
|
||||||
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
||||||
@InjectKysely() private db: Kysely<MapDB>,
|
@InjectKysely() private db: Kysely<MapDB>,
|
||||||
|
@ -4,9 +4,9 @@ import { exec as execCallback } from 'node:child_process';
|
|||||||
import { readFile } from 'node:fs/promises';
|
import { readFile } from 'node:fs/promises';
|
||||||
import { promisify } from 'node:util';
|
import { promisify } from 'node:util';
|
||||||
import sharp from 'sharp';
|
import sharp from 'sharp';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { GitHubRelease, IServerInfoRepository, ServerBuildVersions } from 'src/interfaces/server-info.interface';
|
import { GitHubRelease, IServerInfoRepository, ServerBuildVersions } from 'src/interfaces/server-info.interface';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
|
|
||||||
const exec = promisify(execCallback);
|
const exec = promisify(execCallback);
|
||||||
const maybeFirstLine = async (command: string): Promise<string> => {
|
const maybeFirstLine = async (command: string): Promise<string> => {
|
||||||
@ -36,7 +36,7 @@ const getLockfileVersion = (name: string, lockfile?: BuildLockfile) => {
|
|||||||
@Injectable()
|
@Injectable()
|
||||||
export class ServerInfoRepository implements IServerInfoRepository {
|
export class ServerInfoRepository implements IServerInfoRepository {
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(IConfigRepository) private configRepository: IConfigRepository,
|
private configRepository: ConfigRepository,
|
||||||
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
||||||
) {
|
) {
|
||||||
this.logger.setContext(ServerInfoRepository.name);
|
this.logger.setContext(ServerInfoRepository.name);
|
||||||
|
@ -15,9 +15,9 @@ import { MetricService } from 'nestjs-otel';
|
|||||||
import { copyMetadataFromFunctionToFunction } from 'nestjs-otel/lib/opentelemetry.utils';
|
import { copyMetadataFromFunctionToFunction } from 'nestjs-otel/lib/opentelemetry.utils';
|
||||||
import { serverVersion } from 'src/constants';
|
import { serverVersion } from 'src/constants';
|
||||||
import { ImmichTelemetry, MetadataKey } from 'src/enum';
|
import { ImmichTelemetry, MetadataKey } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { IMetricGroupRepository, ITelemetryRepository, MetricGroupOptions } from 'src/interfaces/telemetry.interface';
|
import { IMetricGroupRepository, ITelemetryRepository, MetricGroupOptions } from 'src/interfaces/telemetry.interface';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
|
|
||||||
class MetricGroupRepository implements IMetricGroupRepository {
|
class MetricGroupRepository implements IMetricGroupRepository {
|
||||||
private enabled = false;
|
private enabled = false;
|
||||||
@ -95,7 +95,7 @@ export class TelemetryRepository implements ITelemetryRepository {
|
|||||||
constructor(
|
constructor(
|
||||||
private metricService: MetricService,
|
private metricService: MetricService,
|
||||||
private reflect: Reflector,
|
private reflect: Reflector,
|
||||||
@Inject(IConfigRepository) private configRepository: IConfigRepository,
|
private configRepository: ConfigRepository,
|
||||||
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
||||||
) {
|
) {
|
||||||
const { telemetry } = this.configRepository.getEnv();
|
const { telemetry } = this.configRepository.getEnv();
|
||||||
|
@ -3,8 +3,8 @@ import { Cron, CronExpression, Interval } from '@nestjs/schedule';
|
|||||||
import { NextFunction, Request, Response } from 'express';
|
import { NextFunction, Request, Response } from 'express';
|
||||||
import { readFileSync } from 'node:fs';
|
import { readFileSync } from 'node:fs';
|
||||||
import { ONE_HOUR } from 'src/constants';
|
import { ONE_HOUR } from 'src/constants';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
import { AuthService } from 'src/services/auth.service';
|
import { AuthService } from 'src/services/auth.service';
|
||||||
import { JobService } from 'src/services/job.service';
|
import { JobService } from 'src/services/job.service';
|
||||||
import { SharedLinkService } from 'src/services/shared-link.service';
|
import { SharedLinkService } from 'src/services/shared-link.service';
|
||||||
@ -38,7 +38,7 @@ export class ApiService {
|
|||||||
private jobService: JobService,
|
private jobService: JobService,
|
||||||
private sharedLinkService: SharedLinkService,
|
private sharedLinkService: SharedLinkService,
|
||||||
private versionService: VersionService,
|
private versionService: VersionService,
|
||||||
@Inject(IConfigRepository) private configRepository: IConfigRepository,
|
private configRepository: ConfigRepository,
|
||||||
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
@Inject(ILoggerRepository) private logger: ILoggerRepository,
|
||||||
) {
|
) {
|
||||||
this.logger.setContext(ApiService.name);
|
this.logger.setContext(ApiService.name);
|
||||||
|
@ -2,12 +2,12 @@ import { BadRequestException } from '@nestjs/common';
|
|||||||
import { FileReportItemDto } from 'src/dtos/audit.dto';
|
import { FileReportItemDto } from 'src/dtos/audit.dto';
|
||||||
import { AssetFileType, AssetPathType, DatabaseAction, EntityType, PersonPathType, UserPathType } from 'src/enum';
|
import { AssetFileType, AssetPathType, DatabaseAction, EntityType, PersonPathType, UserPathType } from 'src/enum';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
import { IAuditRepository } from 'src/interfaces/audit.interface';
|
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
import { JobStatus } from 'src/interfaces/job.interface';
|
import { JobStatus } from 'src/interfaces/job.interface';
|
||||||
import { IPersonRepository } from 'src/interfaces/person.interface';
|
import { IPersonRepository } from 'src/interfaces/person.interface';
|
||||||
import { IUserRepository } from 'src/interfaces/user.interface';
|
import { IUserRepository } from 'src/interfaces/user.interface';
|
||||||
import { AuditService } from 'src/services/audit.service';
|
import { AuditService } from 'src/services/audit.service';
|
||||||
|
import { IAuditRepository } from 'src/types';
|
||||||
import { auditStub } from 'test/fixtures/audit.stub';
|
import { auditStub } from 'test/fixtures/audit.stub';
|
||||||
import { authStub } from 'test/fixtures/auth.stub';
|
import { authStub } from 'test/fixtures/auth.stub';
|
||||||
import { newTestService } from 'test/utils';
|
import { newTestService } from 'test/utils';
|
||||||
|
@ -2,7 +2,6 @@ import { PassThrough } from 'node:stream';
|
|||||||
import { defaults, SystemConfig } from 'src/config';
|
import { defaults, SystemConfig } from 'src/config';
|
||||||
import { StorageCore } from 'src/cores/storage.core';
|
import { StorageCore } from 'src/cores/storage.core';
|
||||||
import { ImmichWorker, StorageFolder } from 'src/enum';
|
import { ImmichWorker, StorageFolder } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ICronRepository } from 'src/interfaces/cron.interface';
|
import { ICronRepository } from 'src/interfaces/cron.interface';
|
||||||
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
||||||
import { JobStatus } from 'src/interfaces/job.interface';
|
import { JobStatus } from 'src/interfaces/job.interface';
|
||||||
@ -10,6 +9,7 @@ import { IProcessRepository } from 'src/interfaces/process.interface';
|
|||||||
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { BackupService } from 'src/services/backup.service';
|
import { BackupService } from 'src/services/backup.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { systemConfigStub } from 'test/fixtures/system-config.stub';
|
import { systemConfigStub } from 'test/fixtures/system-config.stub';
|
||||||
import { mockSpawn, newTestService } from 'test/utils';
|
import { mockSpawn, newTestService } from 'test/utils';
|
||||||
import { describe, Mocked } from 'vitest';
|
import { describe, Mocked } from 'vitest';
|
||||||
|
@ -9,8 +9,6 @@ import { UserEntity } from 'src/entities/user.entity';
|
|||||||
import { IAlbumUserRepository } from 'src/interfaces/album-user.interface';
|
import { IAlbumUserRepository } from 'src/interfaces/album-user.interface';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.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 { ICronRepository } from 'src/interfaces/cron.interface';
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
||||||
@ -45,6 +43,8 @@ import { IViewRepository } from 'src/interfaces/view.interface';
|
|||||||
import { AccessRepository } from 'src/repositories/access.repository';
|
import { AccessRepository } from 'src/repositories/access.repository';
|
||||||
import { ActivityRepository } from 'src/repositories/activity.repository';
|
import { ActivityRepository } from 'src/repositories/activity.repository';
|
||||||
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
||||||
|
import { AuditRepository } from 'src/repositories/audit.repository';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
import { AccessRequest, checkAccess, requireAccess } from 'src/utils/access';
|
import { AccessRequest, checkAccess, requireAccess } from 'src/utils/access';
|
||||||
import { getConfig, updateConfig } from 'src/utils/config';
|
import { getConfig, updateConfig } from 'src/utils/config';
|
||||||
|
|
||||||
@ -55,11 +55,11 @@ export class BaseService {
|
|||||||
@Inject(ILoggerRepository) protected logger: ILoggerRepository,
|
@Inject(ILoggerRepository) protected logger: ILoggerRepository,
|
||||||
protected accessRepository: AccessRepository,
|
protected accessRepository: AccessRepository,
|
||||||
protected activityRepository: ActivityRepository,
|
protected activityRepository: ActivityRepository,
|
||||||
@Inject(IAuditRepository) protected auditRepository: IAuditRepository,
|
protected auditRepository: AuditRepository,
|
||||||
@Inject(IAlbumRepository) protected albumRepository: IAlbumRepository,
|
@Inject(IAlbumRepository) protected albumRepository: IAlbumRepository,
|
||||||
@Inject(IAlbumUserRepository) protected albumUserRepository: IAlbumUserRepository,
|
@Inject(IAlbumUserRepository) protected albumUserRepository: IAlbumUserRepository,
|
||||||
@Inject(IAssetRepository) protected assetRepository: IAssetRepository,
|
@Inject(IAssetRepository) protected assetRepository: IAssetRepository,
|
||||||
@Inject(IConfigRepository) protected configRepository: IConfigRepository,
|
protected configRepository: ConfigRepository,
|
||||||
@Inject(ICronRepository) protected cronRepository: ICronRepository,
|
@Inject(ICronRepository) protected cronRepository: ICronRepository,
|
||||||
@Inject(ICryptoRepository) protected cryptoRepository: ICryptoRepository,
|
@Inject(ICryptoRepository) protected cryptoRepository: ICryptoRepository,
|
||||||
@Inject(IDatabaseRepository) protected databaseRepository: IDatabaseRepository,
|
@Inject(IDatabaseRepository) protected databaseRepository: IDatabaseRepository,
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { PostgresJSDialect } from 'kysely-postgres-js';
|
import { PostgresJSDialect } from 'kysely-postgres-js';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import {
|
import {
|
||||||
DatabaseExtension,
|
DatabaseExtension,
|
||||||
EXTENSION_NAMES,
|
EXTENSION_NAMES,
|
||||||
@ -8,6 +7,7 @@ import {
|
|||||||
} from 'src/interfaces/database.interface';
|
} from 'src/interfaces/database.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { DatabaseService } from 'src/services/database.service';
|
import { DatabaseService } from 'src/services/database.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { mockEnvData } from 'test/repositories/config.repository.mock';
|
import { mockEnvData } from 'test/repositories/config.repository.mock';
|
||||||
import { newTestService } from 'test/utils';
|
import { newTestService } from 'test/utils';
|
||||||
import { Mocked } from 'vitest';
|
import { Mocked } from 'vitest';
|
||||||
|
@ -2,11 +2,11 @@ import { BadRequestException } from '@nestjs/common';
|
|||||||
import { defaults, SystemConfig } from 'src/config';
|
import { defaults, SystemConfig } from 'src/config';
|
||||||
import { ImmichWorker } from 'src/enum';
|
import { ImmichWorker } from 'src/enum';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { IJobRepository, JobCommand, JobItem, JobName, JobStatus, QueueName } from 'src/interfaces/job.interface';
|
import { IJobRepository, JobCommand, JobItem, JobName, JobStatus, QueueName } from 'src/interfaces/job.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { ITelemetryRepository } from 'src/interfaces/telemetry.interface';
|
import { ITelemetryRepository } from 'src/interfaces/telemetry.interface';
|
||||||
import { JobService } from 'src/services/job.service';
|
import { JobService } from 'src/services/job.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { assetStub } from 'test/fixtures/asset.stub';
|
import { assetStub } from 'test/fixtures/asset.stub';
|
||||||
import { newTestService } from 'test/utils';
|
import { newTestService } from 'test/utils';
|
||||||
import { Mocked } from 'vitest';
|
import { Mocked } from 'vitest';
|
||||||
|
@ -5,7 +5,6 @@ import { mapLibrary } from 'src/dtos/library.dto';
|
|||||||
import { UserEntity } from 'src/entities/user.entity';
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
import { AssetType, ImmichWorker } from 'src/enum';
|
import { AssetType, ImmichWorker } from 'src/enum';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ICronRepository } from 'src/interfaces/cron.interface';
|
import { ICronRepository } from 'src/interfaces/cron.interface';
|
||||||
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
||||||
import {
|
import {
|
||||||
@ -19,6 +18,7 @@ import {
|
|||||||
import { ILibraryRepository } from 'src/interfaces/library.interface';
|
import { ILibraryRepository } from 'src/interfaces/library.interface';
|
||||||
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
||||||
import { LibraryService } from 'src/services/library.service';
|
import { LibraryService } from 'src/services/library.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { assetStub } from 'test/fixtures/asset.stub';
|
import { assetStub } from 'test/fixtures/asset.stub';
|
||||||
import { authStub } from 'test/fixtures/auth.stub';
|
import { authStub } from 'test/fixtures/auth.stub';
|
||||||
import { libraryStub } from 'test/fixtures/library.stub';
|
import { libraryStub } from 'test/fixtures/library.stub';
|
||||||
|
@ -7,7 +7,6 @@ import { ExifEntity } from 'src/entities/exif.entity';
|
|||||||
import { AssetType, ExifOrientation, ImmichWorker, SourceType } from 'src/enum';
|
import { AssetType, ExifOrientation, ImmichWorker, SourceType } from 'src/enum';
|
||||||
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
import { IAlbumRepository } from 'src/interfaces/album.interface';
|
||||||
import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.interface';
|
import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.interface';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
import { ICryptoRepository } from 'src/interfaces/crypto.interface';
|
||||||
import { IEventRepository } from 'src/interfaces/event.interface';
|
import { IEventRepository } from 'src/interfaces/event.interface';
|
||||||
import { IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
|
import { IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
|
||||||
@ -20,6 +19,7 @@ import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interf
|
|||||||
import { ITagRepository } from 'src/interfaces/tag.interface';
|
import { ITagRepository } from 'src/interfaces/tag.interface';
|
||||||
import { IUserRepository } from 'src/interfaces/user.interface';
|
import { IUserRepository } from 'src/interfaces/user.interface';
|
||||||
import { MetadataService } from 'src/services/metadata.service';
|
import { MetadataService } from 'src/services/metadata.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { assetStub } from 'test/fixtures/asset.stub';
|
import { assetStub } from 'test/fixtures/asset.stub';
|
||||||
import { fileStub } from 'test/fixtures/file.stub';
|
import { fileStub } from 'test/fixtures/file.stub';
|
||||||
import { probeStub } from 'test/fixtures/media.stub';
|
import { probeStub } from 'test/fixtures/media.stub';
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import { SystemConfig } from 'src/config';
|
import { SystemConfig } from 'src/config';
|
||||||
import { ImmichWorker } from 'src/enum';
|
import { ImmichWorker } from 'src/enum';
|
||||||
import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.interface';
|
import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.interface';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
import { IDatabaseRepository } from 'src/interfaces/database.interface';
|
||||||
import { IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
|
import { IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
|
||||||
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.interface';
|
import { IMachineLearningRepository } from 'src/interfaces/machine-learning.interface';
|
||||||
import { ISearchRepository } from 'src/interfaces/search.interface';
|
import { ISearchRepository } from 'src/interfaces/search.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { SmartInfoService } from 'src/services/smart-info.service';
|
import { SmartInfoService } from 'src/services/smart-info.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { getCLIPModelInfo } from 'src/utils/misc';
|
import { getCLIPModelInfo } from 'src/utils/misc';
|
||||||
import { assetStub } from 'test/fixtures/asset.stub';
|
import { assetStub } from 'test/fixtures/asset.stub';
|
||||||
import { systemConfigStub } from 'test/fixtures/system-config.stub';
|
import { systemConfigStub } from 'test/fixtures/system-config.stub';
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import { SystemMetadataKey } from 'src/enum';
|
import { SystemMetadataKey } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
import { IStorageRepository } from 'src/interfaces/storage.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { StorageService } from 'src/services/storage.service';
|
import { StorageService } from 'src/services/storage.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { ImmichStartupError } from 'src/utils/misc';
|
import { ImmichStartupError } from 'src/utils/misc';
|
||||||
import { mockEnvData } from 'test/repositories/config.repository.mock';
|
import { mockEnvData } from 'test/repositories/config.repository.mock';
|
||||||
import { newTestService } from 'test/utils';
|
import { newTestService } from 'test/utils';
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import { mapAsset } from 'src/dtos/asset-response.dto';
|
import { mapAsset } from 'src/dtos/asset-response.dto';
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
import { IAssetRepository } from 'src/interfaces/asset.interface';
|
||||||
import { IAuditRepository } from 'src/interfaces/audit.interface';
|
|
||||||
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
import { IPartnerRepository } from 'src/interfaces/partner.interface';
|
||||||
import { SyncService } from 'src/services/sync.service';
|
import { SyncService } from 'src/services/sync.service';
|
||||||
|
import { IAuditRepository } from 'src/types';
|
||||||
import { assetStub } from 'test/fixtures/asset.stub';
|
import { assetStub } from 'test/fixtures/asset.stub';
|
||||||
import { authStub } from 'test/fixtures/auth.stub';
|
import { authStub } from 'test/fixtures/auth.stub';
|
||||||
import { partnerStub } from 'test/fixtures/partner.stub';
|
import { partnerStub } from 'test/fixtures/partner.stub';
|
||||||
|
@ -12,12 +12,12 @@ import {
|
|||||||
VideoCodec,
|
VideoCodec,
|
||||||
VideoContainer,
|
VideoContainer,
|
||||||
} from 'src/enum';
|
} from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { IEventRepository } from 'src/interfaces/event.interface';
|
import { IEventRepository } from 'src/interfaces/event.interface';
|
||||||
import { QueueName } from 'src/interfaces/job.interface';
|
import { QueueName } from 'src/interfaces/job.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { SystemConfigService } from 'src/services/system-config.service';
|
import { SystemConfigService } from 'src/services/system-config.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { mockEnvData } from 'test/repositories/config.repository.mock';
|
import { mockEnvData } from 'test/repositories/config.repository.mock';
|
||||||
import { newTestService } from 'test/utils';
|
import { newTestService } from 'test/utils';
|
||||||
import { DeepPartial } from 'typeorm';
|
import { DeepPartial } from 'typeorm';
|
||||||
|
@ -2,7 +2,6 @@ import { DateTime } from 'luxon';
|
|||||||
import { SemVer } from 'semver';
|
import { SemVer } from 'semver';
|
||||||
import { serverVersion } from 'src/constants';
|
import { serverVersion } from 'src/constants';
|
||||||
import { ImmichEnvironment, SystemMetadataKey } from 'src/enum';
|
import { ImmichEnvironment, SystemMetadataKey } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { IEventRepository } from 'src/interfaces/event.interface';
|
import { IEventRepository } from 'src/interfaces/event.interface';
|
||||||
import { IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
|
import { IJobRepository, JobName, JobStatus } from 'src/interfaces/job.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
@ -10,6 +9,7 @@ import { IServerInfoRepository } from 'src/interfaces/server-info.interface';
|
|||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
import { IVersionHistoryRepository } from 'src/interfaces/version-history.interface';
|
import { IVersionHistoryRepository } from 'src/interfaces/version-history.interface';
|
||||||
import { VersionService } from 'src/services/version.service';
|
import { VersionService } from 'src/services/version.service';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { mockEnvData } from 'test/repositories/config.repository.mock';
|
import { mockEnvData } from 'test/repositories/config.repository.mock';
|
||||||
import { newTestService } from 'test/utils';
|
import { newTestService } from 'test/utils';
|
||||||
import { Mocked } from 'vitest';
|
import { Mocked } from 'vitest';
|
||||||
|
@ -3,6 +3,8 @@ import { Permission } from 'src/enum';
|
|||||||
import { AccessRepository } from 'src/repositories/access.repository';
|
import { AccessRepository } from 'src/repositories/access.repository';
|
||||||
import { ActivityRepository } from 'src/repositories/activity.repository';
|
import { ActivityRepository } from 'src/repositories/activity.repository';
|
||||||
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
||||||
|
import { AuditRepository } from 'src/repositories/audit.repository';
|
||||||
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
|
|
||||||
export type AuthApiKey = {
|
export type AuthApiKey = {
|
||||||
id: string;
|
id: string;
|
||||||
@ -16,6 +18,8 @@ export type RepositoryInterface<T extends object> = Pick<T, keyof T>;
|
|||||||
export type IActivityRepository = RepositoryInterface<ActivityRepository>;
|
export type IActivityRepository = RepositoryInterface<ActivityRepository>;
|
||||||
export type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInterface<AccessRepository[K]> };
|
export type IAccessRepository = { [K in keyof AccessRepository]: RepositoryInterface<AccessRepository[K]> };
|
||||||
export type IApiKeyRepository = RepositoryInterface<ApiKeyRepository>;
|
export type IApiKeyRepository = RepositoryInterface<ApiKeyRepository>;
|
||||||
|
export type IAuditRepository = RepositoryInterface<AuditRepository>;
|
||||||
|
export type IConfigRepository = RepositoryInterface<ConfigRepository>;
|
||||||
|
|
||||||
export type ActivityItem =
|
export type ActivityItem =
|
||||||
| Awaited<ReturnType<IActivityRepository['create']>>
|
| Awaited<ReturnType<IActivityRepository['create']>>
|
||||||
|
@ -6,10 +6,10 @@ import * as _ from 'lodash';
|
|||||||
import { SystemConfig, defaults } from 'src/config';
|
import { SystemConfig, defaults } from 'src/config';
|
||||||
import { SystemConfigDto } from 'src/dtos/system-config.dto';
|
import { SystemConfigDto } from 'src/dtos/system-config.dto';
|
||||||
import { SystemMetadataKey } from 'src/enum';
|
import { SystemMetadataKey } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { DatabaseLock } from 'src/interfaces/database.interface';
|
import { DatabaseLock } from 'src/interfaces/database.interface';
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { getKeysDeep, unsetDeep } from 'src/utils/misc';
|
import { getKeysDeep, unsetDeep } from 'src/utils/misc';
|
||||||
import { DeepPartial } from 'typeorm';
|
import { DeepPartial } from 'typeorm';
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ import sirv from 'sirv';
|
|||||||
import { ApiModule } from 'src/app.module';
|
import { ApiModule } from 'src/app.module';
|
||||||
import { excludePaths, serverVersion } from 'src/constants';
|
import { excludePaths, serverVersion } from 'src/constants';
|
||||||
import { ImmichEnvironment } from 'src/enum';
|
import { ImmichEnvironment } from 'src/enum';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { WebSocketAdapter } from 'src/middleware/websocket.adapter';
|
import { WebSocketAdapter } from 'src/middleware/websocket.adapter';
|
||||||
import { ConfigRepository } from 'src/repositories/config.repository';
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
@ -25,7 +24,7 @@ async function bootstrap() {
|
|||||||
|
|
||||||
const app = await NestFactory.create<NestExpressApplication>(ApiModule, { bufferLogs: true });
|
const app = await NestFactory.create<NestExpressApplication>(ApiModule, { bufferLogs: true });
|
||||||
const logger = await app.resolve<ILoggerRepository>(ILoggerRepository);
|
const logger = await app.resolve<ILoggerRepository>(ILoggerRepository);
|
||||||
const configRepository = app.get<IConfigRepository>(IConfigRepository);
|
const configRepository = app.get(ConfigRepository);
|
||||||
|
|
||||||
const { environment, host, port, resourcePaths } = configRepository.getEnv();
|
const { environment, host, port, resourcePaths } = configRepository.getEnv();
|
||||||
const isDev = environment === ImmichEnvironment.DEVELOPMENT;
|
const isDev = environment === ImmichEnvironment.DEVELOPMENT;
|
||||||
|
@ -2,7 +2,6 @@ import { NestFactory } from '@nestjs/core';
|
|||||||
import { isMainThread } from 'node:worker_threads';
|
import { isMainThread } from 'node:worker_threads';
|
||||||
import { MicroservicesModule } from 'src/app.module';
|
import { MicroservicesModule } from 'src/app.module';
|
||||||
import { serverVersion } from 'src/constants';
|
import { serverVersion } from 'src/constants';
|
||||||
import { IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
import { ILoggerRepository } from 'src/interfaces/logger.interface';
|
||||||
import { WebSocketAdapter } from 'src/middleware/websocket.adapter';
|
import { WebSocketAdapter } from 'src/middleware/websocket.adapter';
|
||||||
import { ConfigRepository } from 'src/repositories/config.repository';
|
import { ConfigRepository } from 'src/repositories/config.repository';
|
||||||
@ -23,7 +22,7 @@ export async function bootstrap() {
|
|||||||
|
|
||||||
await app.listen(0);
|
await app.listen(0);
|
||||||
|
|
||||||
const configRepository = app.get<IConfigRepository>(IConfigRepository);
|
const configRepository = app.get(ConfigRepository);
|
||||||
const { environment } = configRepository.getEnv();
|
const { environment } = configRepository.getEnv();
|
||||||
logger.log(`Immich Microservices is running [v${serverVersion}] [${environment}] `);
|
logger.log(`Immich Microservices is running [v${serverVersion}] [${environment}] `);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { IAuditRepository } from 'src/interfaces/audit.interface';
|
import { IAuditRepository } from 'src/types';
|
||||||
import { Mocked, vitest } from 'vitest';
|
import { Mocked, vitest } from 'vitest';
|
||||||
|
|
||||||
export const newAuditRepositoryMock = (): Mocked<IAuditRepository> => {
|
export const newAuditRepositoryMock = (): Mocked<IAuditRepository> => {
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import { PostgresJSDialect } from 'kysely-postgres-js';
|
import { PostgresJSDialect } from 'kysely-postgres-js';
|
||||||
import postgres from 'postgres';
|
import postgres from 'postgres';
|
||||||
import { ImmichEnvironment, ImmichWorker } from 'src/enum';
|
import { ImmichEnvironment, ImmichWorker } from 'src/enum';
|
||||||
import { EnvData, IConfigRepository } from 'src/interfaces/config.interface';
|
|
||||||
import { DatabaseExtension } from 'src/interfaces/database.interface';
|
import { DatabaseExtension } from 'src/interfaces/database.interface';
|
||||||
|
import { EnvData } from 'src/repositories/config.repository';
|
||||||
|
import { IConfigRepository } from 'src/types';
|
||||||
import { Mocked, vitest } from 'vitest';
|
import { Mocked, vitest } from 'vitest';
|
||||||
|
|
||||||
const envData: EnvData = {
|
const envData: EnvData = {
|
||||||
|
@ -6,8 +6,9 @@ import { IMetadataRepository } from 'src/interfaces/metadata.interface';
|
|||||||
import { AccessRepository } from 'src/repositories/access.repository';
|
import { AccessRepository } from 'src/repositories/access.repository';
|
||||||
import { ActivityRepository } from 'src/repositories/activity.repository';
|
import { ActivityRepository } from 'src/repositories/activity.repository';
|
||||||
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
import { ApiKeyRepository } from 'src/repositories/api-key.repository';
|
||||||
|
import { AuditRepository } from 'src/repositories/audit.repository';
|
||||||
import { BaseService } from 'src/services/base.service';
|
import { BaseService } from 'src/services/base.service';
|
||||||
import { IAccessRepository, IActivityRepository, IApiKeyRepository } from 'src/types';
|
import { IAccessRepository, IActivityRepository, IApiKeyRepository, IAuditRepository } from 'src/types';
|
||||||
import { newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
|
import { newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
|
||||||
import { newActivityRepositoryMock } from 'test/repositories/activity.repository.mock';
|
import { newActivityRepositoryMock } from 'test/repositories/activity.repository.mock';
|
||||||
import { newAlbumUserRepositoryMock } from 'test/repositories/album-user.repository.mock';
|
import { newAlbumUserRepositoryMock } from 'test/repositories/album-user.repository.mock';
|
||||||
@ -109,7 +110,7 @@ export const newTestService = <T extends BaseService>(
|
|||||||
loggerMock,
|
loggerMock,
|
||||||
accessMock as IAccessRepository as AccessRepository,
|
accessMock as IAccessRepository as AccessRepository,
|
||||||
activityMock as IActivityRepository as ActivityRepository,
|
activityMock as IActivityRepository as ActivityRepository,
|
||||||
auditMock,
|
auditMock as IAuditRepository as AuditRepository,
|
||||||
albumMock,
|
albumMock,
|
||||||
albumUserMock,
|
albumUserMock,
|
||||||
assetMock,
|
assetMock,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user