import { Job } from "bullmq"; import { InsightJobName, InsightJobData, InsightPeriodPayload, } from "@app/lib/queue/types"; import { getQueue } from "@app/lib/queue/QueueRegistry"; import { prisma } from "@app/lib/prisma"; import { processMoodTrend } from "@app/lib/queue/processors/insights/moodTrend"; import { processEnergySleep } from "@app/lib/queue/processors/insights/energySleep"; import { processTriggerPattern } from "@app/lib/queue/processors/insights/triggerPattern"; import { processDailyEnergy } from "@app/lib/queue/processors/insights/dailyEnergy"; import { processDailySleep } from "@app/lib/queue/processors/insights/dailySleep"; export async function insightProcessor( job: Job, ): Promise { console.log(`Insight job ${job.name} started`); switch (job.name as InsightJobName) { case InsightJobName.FanOut: return fanOut(); case InsightJobName.MoodTrend: return processMoodTrend(job.data as InsightPeriodPayload); case InsightJobName.EnergySleep: return processEnergySleep(job.data as InsightPeriodPayload); case InsightJobName.TriggerPattern: return processTriggerPattern(job.data as InsightPeriodPayload); case InsightJobName.DailyEnergy: return processDailyEnergy(job.data as InsightPeriodPayload); case InsightJobName.DailySleep: return processDailySleep(job.data as InsightPeriodPayload); default: throw new Error(`Unknown insight job: ${job.name}`); } } async function fanOut(): Promise { const users = await prisma.user.findMany({ where: { active: true }, select: { id: true }, }); const queue = getQueue("insights"); const periodEnd = new Date(); const periodStart = new Date(); periodStart.setDate(periodEnd.getDate() - 7); const payload: Omit = { periodStart: periodStart.toISOString(), periodEnd: periodEnd.toISOString(), }; await queue.addBulk( users.flatMap((u) => [ { name: InsightJobName.MoodTrend, data: { userId: u.id, ...payload } }, { name: InsightJobName.EnergySleep, data: { userId: u.id, ...payload } }, { name: InsightJobName.TriggerPattern, data: { userId: u.id, ...payload }, }, ]), ); }