Skip to content

Commit

Permalink
refactor(server): cls (#13814)
Browse files Browse the repository at this point in the history
  • Loading branch information
jrasm91 authored Oct 29, 2024
1 parent 2efba63 commit 19eb3ed
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 21 deletions.
6 changes: 3 additions & 3 deletions server/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { ClsModule } from 'nestjs-cls';
import { OpenTelemetryModule } from 'nestjs-otel';
import { commands } from 'src/commands';
import { clsConfig, immichAppConfig } from 'src/config';
import { immichAppConfig } from 'src/config';
import { controllers } from 'src/controllers';
import { entities } from 'src/entities';
import { ImmichWorker } from 'src/enum';
Expand Down Expand Up @@ -37,12 +37,12 @@ const middleware = [
];

const configRepository = new ConfigRepository();
const { bull, database, otel } = configRepository.getEnv();
const { bull, cls, database, otel } = configRepository.getEnv();

const imports = [
BullModule.forRoot(bull.config),
BullModule.registerQueue(...bull.queues),
ClsModule.forRoot(clsConfig),
ClsModule.forRoot(cls.config),
ConfigModule.forRoot(immichAppConfig),
OpenTelemetryModule.forRoot(otel),
TypeOrmModule.forRootAsync({
Expand Down
17 changes: 0 additions & 17 deletions server/src/config.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import { ConfigModuleOptions } from '@nestjs/config';
import { CronExpression } from '@nestjs/schedule';
import { Request, Response } from 'express';
import Joi, { Root } from 'joi';
import { CLS_ID, ClsModuleOptions } from 'nestjs-cls';
import {
AudioCodec,
Colorspace,
CQMode,
ImageFormat,
ImmichEnvironment,
ImmichHeader,
LogLevel,
ToneMapping,
TranscodeHWAccel,
Expand Down Expand Up @@ -354,17 +351,3 @@ export const immichAppConfig: ConfigModuleOptions = {
),
}),
};

export const clsConfig: ClsModuleOptions = {
middleware: {
mount: true,
generateId: true,
setup: (cls, req: Request, res: Response) => {
const headerValues = req.headers[ImmichHeader.CID];
const headerValue = Array.isArray(headerValues) ? headerValues[0] : headerValues;
const cid = headerValue || cls.get(CLS_ID);
cls.set(CLS_ID, cid);
res.header(ImmichHeader.CID, cid);
},
},
};
5 changes: 5 additions & 0 deletions server/src/interfaces/config.interface.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { RegisterQueueOptions } from '@nestjs/bullmq';
import { QueueOptions } from 'bullmq';
import { RedisOptions } from 'ioredis';
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';
Expand Down Expand Up @@ -36,6 +37,10 @@ export interface EnvData {
queues: RegisterQueueOptions[];
};

cls: {
config: ClsModuleOptions;
};

database: {
config: PostgresConnectionOptions & DatabaseConnectionParams;
skipMigrations: boolean;
Expand Down
20 changes: 19 additions & 1 deletion server/src/repositories/config.repository.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { Injectable } from '@nestjs/common';
import { Request, Response } from 'express';
import { CLS_ID } from 'nestjs-cls';
import { join, resolve } from 'node:path';
import { citiesFile, excludePaths } from 'src/constants';
import { Telemetry } from 'src/decorators';
import { ImmichEnvironment, ImmichTelemetry, ImmichWorker, LogLevel } from 'src/enum';
import { ImmichEnvironment, ImmichHeader, ImmichTelemetry, ImmichWorker, LogLevel } from 'src/enum';
import { EnvData, IConfigRepository } from 'src/interfaces/config.interface';
import { DatabaseExtension } from 'src/interfaces/database.interface';
import { QueueName } from 'src/interfaces/job.interface';
Expand Down Expand Up @@ -121,6 +123,22 @@ const getEnv = (): EnvData => {
queues: Object.values(QueueName).map((name) => ({ name })),
},

cls: {
config: {
middleware: {
mount: true,
generateId: true,
setup: (cls, req: Request, res: Response) => {
const headerValues = req.headers[ImmichHeader.CID];
const headerValue = Array.isArray(headerValues) ? headerValues[0] : headerValues;
const cid = headerValue || cls.get(CLS_ID);
cls.set(CLS_ID, cid);
res.header(ImmichHeader.CID, cid);
},
},
},
},

database: {
config: {
type: 'postgres',
Expand Down
4 changes: 4 additions & 0 deletions server/test/repositories/config.repository.mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ const envData: EnvData = {
queues: [{ name: 'queue-1' }],
},

cls: {
config: {},
},

database: {
config: {
connectionType: 'parts',
Expand Down

0 comments on commit 19eb3ed

Please sign in to comment.