eletrotupi / tcc/ api/src/lib/queue/processors/insights/index.tsfc92b32268c541f45e9432340f0d76076dfc57f4
2.0 KB | 66 lines Raw
1
import { Job } from "bullmq";
2
import {
3
  InsightJobName,
4
  InsightJobData,
5
  InsightPeriodPayload,
6
} from "@app/lib/queue/types";
7
import { getQueue } from "@app/lib/queue/QueueRegistry";
8
import { prisma } from "@app/lib/prisma";
9
import { processMoodTrend } from "@app/lib/queue/processors/insights/moodTrend";
10
import { processEnergySleep } from "@app/lib/queue/processors/insights/energySleep";
11
import { processTriggerPattern } from "@app/lib/queue/processors/insights/triggerPattern";
12
import { processDailyEnergy } from "@app/lib/queue/processors/insights/dailyEnergy";
13

14
export async function insightProcessor(
15
  job: Job<InsightJobData["data"]>,
16
): Promise<void> {
17
  console.log(`Insight job ${job.name} started`);
18

19
  switch (job.name as InsightJobName) {
20
    case InsightJobName.FanOut:
21
      return fanOut();
22

23
    case InsightJobName.MoodTrend:
24
      return processMoodTrend(job.data as InsightPeriodPayload);
25

26
    case InsightJobName.EnergySleep:
27
      return processEnergySleep(job.data as InsightPeriodPayload);
28

29
    case InsightJobName.TriggerPattern:
30
      return processTriggerPattern(job.data as InsightPeriodPayload);
31

32
    case InsightJobName.DailyEnergy:
33
      return processDailyEnergy(job.data as InsightPeriodPayload);
34

35
    default:
36
      throw new Error(`Unknown insight job: ${job.name}`);
37
  }
38
}
39

40
async function fanOut(): Promise<void> {
41
  const users = await prisma.user.findMany({
42
    where: { active: true },
43
    select: { id: true },
44
  });
45

46
  const queue = getQueue("insights");
47
  const periodEnd = new Date();
48
  const periodStart = new Date();
49
  periodStart.setDate(periodEnd.getDate() - 7);
50

51
  const payload: Omit<InsightPeriodPayload, "userId"> = {
52
    periodStart: periodStart.toISOString(),
53
    periodEnd: periodEnd.toISOString(),
54
  };
55

56
  await queue.addBulk(
57
    users.flatMap((u) => [
58
      { name: InsightJobName.MoodTrend, data: { userId: u.id, ...payload } },
59
      { name: InsightJobName.EnergySleep, data: { userId: u.id, ...payload } },
60
      {
61
        name: InsightJobName.TriggerPattern,
62
        data: { userId: u.id, ...payload },
63
      },
64
    ]),
65
  );
66
}