- queue.constants.ts: 新增 QUEUE_AI_INTERACTIVE / QUEUE_AI_BACKGROUND
- queue-definitions.ts: 队列配置对齐 ADR-003 §3.1
ai-interactive: concurrency=2, attempts=2, backoff=2000ms
ai-background: concurrency=1, attempts=3, backoff=5000ms
- queue.service.ts: QueueService 注入并路由新队列
- queue.module.ts: BullModule.registerQueue 注册新队列
- AiJobExecutionEngine 接口 + AI_JOB_EXECUTION_ENGINE 注入 Token
- AiInteractiveJobWorker + AiBackgroundJobWorker: 薄 Processor,仅接收 {jobId} 调用 Engine
- worker.module.ts: 注册两个新 Processor(#291 提供 Engine 真实实现前为 no-op)
Co-Authored-By: Claude <noreply@anthropic.com>
87 lines
3.0 KiB
TypeScript
87 lines
3.0 KiB
TypeScript
import { Module } from '@nestjs/common';
|
|
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
import { JwtModule } from '@nestjs/jwt';
|
|
|
|
import { PrismaModule } from './infrastructure/database/prisma.module';
|
|
import { RedisModule } from './infrastructure/redis/redis.module';
|
|
import { QueueModule } from './infrastructure/queue/queue.module';
|
|
import { AiModule } from './modules/ai/ai.module';
|
|
import { StorageModule } from './infrastructure/storage/storage.module';
|
|
import { LoggerModule } from './infrastructure/logger/logger.module';
|
|
|
|
import { AiAnalysisWorker } from './workers/ai-analysis.worker';
|
|
import { DocumentImportWorker } from './workers/document-import.worker';
|
|
import { NotificationWorker } from './workers/notification.worker';
|
|
import { AiInteractiveJobWorker } from './workers/ai-interactive.worker';
|
|
import { AiBackgroundJobWorker } from './workers/ai-background.worker';
|
|
|
|
import { AuditLogProcessor } from './modules/admin-audit-log/audit-log.processor';
|
|
import { FileCleanupProcessor } from './modules/files/file-cleanup.processor';
|
|
import { WorkerHeartbeatService } from './workers/worker-heartbeat.service';
|
|
|
|
import { AiAnalysisModule } from './modules/ai-analysis/ai-analysis.module';
|
|
import { DocumentImportModule } from './modules/document-import/document-import.module';
|
|
import { KnowledgeItemsModule } from './modules/knowledge-items/knowledge-items.module';
|
|
import { NotificationsModule } from './modules/notifications/notifications.module';
|
|
import { EventBusModule } from './common/event-bus/event-bus.module';
|
|
import { FocusItemsModule } from './modules/focus-items/focus-items.module';
|
|
import { ReviewModule } from './modules/review/review.module';
|
|
|
|
import appConfig from './config/app.config';
|
|
import databaseConfig from './config/database.config';
|
|
import redisConfig from './config/redis.config';
|
|
import jwtConfig from './config/jwt.config';
|
|
import aiConfig from './config/ai.config';
|
|
import storageConfig from './config/storage.config';
|
|
import appleConfig from './config/apple.config';
|
|
|
|
@Module({
|
|
imports: [
|
|
ConfigModule.forRoot({
|
|
isGlobal: true,
|
|
load: [
|
|
appConfig,
|
|
databaseConfig,
|
|
redisConfig,
|
|
jwtConfig,
|
|
aiConfig,
|
|
storageConfig,
|
|
appleConfig,
|
|
],
|
|
}),
|
|
JwtModule.registerAsync({
|
|
global: true,
|
|
imports: [ConfigModule],
|
|
inject: [ConfigService],
|
|
useFactory: (config: ConfigService) => ({
|
|
secret: config.get<string>('jwt.secret'),
|
|
signOptions: { expiresIn: config.get<string>('jwt.expiresIn', '1h') as any },
|
|
}),
|
|
}),
|
|
PrismaModule,
|
|
RedisModule,
|
|
QueueModule,
|
|
AiModule,
|
|
StorageModule,
|
|
LoggerModule,
|
|
AiAnalysisModule,
|
|
DocumentImportModule,
|
|
KnowledgeItemsModule,
|
|
NotificationsModule,
|
|
EventBusModule,
|
|
FocusItemsModule,
|
|
ReviewModule,
|
|
],
|
|
providers: [
|
|
AiAnalysisWorker,
|
|
DocumentImportWorker,
|
|
NotificationWorker,
|
|
AiInteractiveJobWorker,
|
|
AiBackgroundJobWorker,
|
|
AuditLogProcessor,
|
|
FileCleanupProcessor,
|
|
WorkerHeartbeatService,
|
|
],
|
|
})
|
|
export class WorkerModule {}
|