feat(server): use nestjs events to validate config (#7986)

* use events for config validation

* chore: better types

* add unit tests

---------

Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
This commit is contained in:
Daniel Dietzler
2024-03-17 20:16:02 +01:00
committed by GitHub
parent 14da671bf9
commit 148428a564
14 changed files with 170 additions and 81 deletions

View File

@@ -31,6 +31,7 @@ import {
import { BullModule } from '@nestjs/bullmq';
import { Global, Module, Provider } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { ScheduleModule, SchedulerRegistry } from '@nestjs/schedule';
import { TypeOrmModule } from '@nestjs/typeorm';
import { OpenTelemetryModule } from 'nestjs-otel';
@@ -103,6 +104,7 @@ const providers: Provider[] = [
@Module({
imports: [
ConfigModule.forRoot(immichAppConfig),
EventEmitterModule.forRoot(),
TypeOrmModule.forRoot(databaseConfig),
TypeOrmModule.forFeature(databaseEntities),
ScheduleModule,
@@ -119,6 +121,7 @@ export class InfraModule {}
@Module({
imports: [
ConfigModule.forRoot(immichAppConfig),
EventEmitterModule.forRoot(),
TypeOrmModule.forRoot(databaseConfig),
TypeOrmModule.forFeature(databaseEntities),
ScheduleModule,

View File

@@ -2,11 +2,13 @@ import {
AuthService,
ClientEvent,
ICommunicationRepository,
InternalEventMap,
OnConnectCallback,
OnServerEventCallback,
ServerEvent,
} from '@app/domain';
import { ImmichLogger } from '@app/infra/logger';
import { EventEmitter2 } from '@nestjs/event-emitter';
import {
OnGatewayConnection,
OnGatewayDisconnect,
@@ -35,7 +37,10 @@ export class CommunicationRepository
@WebSocketServer()
private server?: Server;
constructor(private authService: AuthService) {}
constructor(
private authService: AuthService,
private eventEmitter: EventEmitter2,
) {}
afterInit(server: Server) {
this.logger.log('Initialized websocket server');
@@ -97,4 +102,12 @@ export class CommunicationRepository
this.logger.debug(`Server event: ${event} (send)`);
this.server?.serverSideEmit(event);
}
emit<E extends keyof InternalEventMap>(event: E, data: InternalEventMap[E]): boolean {
return this.eventEmitter.emit(event, data);
}
emitAsync<E extends keyof InternalEventMap, R = any[]>(event: E, data: InternalEventMap[E]): Promise<R> {
return this.eventEmitter.emitAsync(event, data) as Promise<R>;
}
}