## Issues Addressed - #115: Cron scheduler worker - #116: Cron WebSocket notifications ## Changes ### CronSchedulerService (cron.scheduler.ts) - Polls CronSchedule table every minute for due schedules - Executes commands when schedules fire (placeholder for MoltBot integration) - Updates lastRun/nextRun fields after execution - Handles errors gracefully with logging - Supports manual trigger for testing - Start/stop lifecycle management ### WebSocket Integration - Added emitCronExecuted() method to WebSocketGateway - Emits workspace-scoped cron:executed events - Payload includes: scheduleId, command, executedAt ### Tests - cron.scheduler.spec.ts: 9 passing tests - Tests cover: status, due schedule processing, manual trigger, scheduler lifecycle ## Technical Notes - Placeholder triggerMoltBotCommand() needs actual implementation - Uses setInterval for polling (could upgrade to cron-parser library) - WebSocket rooms use workspace:{id} format (existing pattern) ## Files Changed - apps/api/src/cron/cron.scheduler.ts (new) - apps/api/src/cron/cron.scheduler.spec.ts (new) - apps/api/src/cron/cron.module.ts (updated) - apps/api/src/websocket/websocket.gateway.ts (updated)
16 lines
625 B
TypeScript
16 lines
625 B
TypeScript
import { Module, forwardRef } from "@nestjs/common";
|
|
import { CronController } from "./cron.controller";
|
|
import { CronService } from "./cron.service";
|
|
import { CronSchedulerService } from "./cron.scheduler";
|
|
import { PrismaModule } from "../prisma/prisma.module";
|
|
import { AuthModule } from "../auth/auth.module";
|
|
import { WebSocketModule } from "../websocket/websocket.module";
|
|
|
|
@Module({
|
|
imports: [PrismaModule, AuthModule, forwardRef(() => WebSocketModule)],
|
|
controllers: [CronController],
|
|
providers: [CronService, CronSchedulerService],
|
|
exports: [CronService, CronSchedulerService],
|
|
})
|
|
export class CronModule {}
|