eletrotupi / tcc/ api/src/lib/queue/processors/insights/index.tsc4e059e5c5f2c31a451ad9b27204e46056841ed3
1.9 KB | 62 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

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

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

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

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

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

31
    default:
32
      throw new Error(`Unknown insight job: ${job.name}`);
33
  }
34
}
35

36
async function fanOut(): Promise<void> {
37
  const users = await prisma.user.findMany({
38
    where: { active: true },
39
    select: { id: true },
40
  });
41

42
  const queue = getQueue("insights");
43
  const periodEnd = new Date();
44
  const periodStart = new Date();
45
  periodStart.setDate(periodEnd.getDate() - 7);
46

47
  const payload: Omit<InsightPeriodPayload, "userId"> = {
48
    periodStart: periodStart.toISOString(),
49
    periodEnd: periodEnd.toISOString(),
50
  };
51

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