import { DatabaseModule, PrismaService } from "@cv/core"; import { FileStorageModule } from "@cv/file-storage"; import { HandlersModule, HtmlToPdfService, RenderPdfHandler, } from "@cv/handlers"; import { Module } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; import { EventEmitterModule } from "@nestjs/event-emitter"; import { LoggerProvider, MessengerModule, } from "@riotbyte-com/project-q-nestjs"; import { PrismaClientToken, PrismaTransportFactory, } from "@riotbyte-com/project-q-prisma"; import type { WorkerConfig } from "./config"; import { config } from "./config"; import { HeartbeatModule } from "./heartbeat/heartbeat.module"; import { NestProjectQLogger } from "./logger.provider"; export const WORKER_CONFIG = Symbol("WORKER_CONFIG"); @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, load: [() => ({ DATABASE_URL: config.databaseUrl })], }), DatabaseModule, EventEmitterModule.forRoot(), HandlersModule, HeartbeatModule.register(config), FileStorageModule.forRoot( config.fileStorageDriver === "r2" ? { driver: "r2", endpoint: config.r2Endpoint, accessKeyId: config.r2AccessKeyId, secretAccessKey: config.r2SecretAccessKey, bucket: config.r2Bucket, } : { driver: "disk", baseDir: config.pdfOutputDir }, ), MessengerModule.forRoot({ transports: { async: { dsn: `prisma://?queue=${config.queueName}`, retry: true }, }, routing: new Map([["render-pdf", "async"]]), }), ], providers: [ { provide: WORKER_CONFIG, useValue: config satisfies WorkerConfig }, { provide: PrismaClientToken, useExisting: PrismaService }, { provide: LoggerProvider, useClass: NestProjectQLogger }, PrismaTransportFactory, ], }) export class WorkerModule {}