eletrotupi / tcc / api/src/lib/queue/processors/insights/index.ts master
2.2 KB Raw
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<InsightJobData["data"]>,
): Promise<void> {
  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<void> {
  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<InsightPeriodPayload, "userId"> = {
    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 },
      },
    ]),
  );
}