eletrotupi / tcc/ api/src/lib/queue/processors/insights/index.tsa1a9079e3159130a372ea537b25611ee5d274ef9
2.3 KB | 71 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 { logger } from "@app/lib/logger";
10
import { processMoodTrend } from "@app/lib/queue/processors/insights/moodTrend";
11
import { processEnergySleep } from "@app/lib/queue/processors/insights/energySleep";
12
import { processTriggerPattern } from "@app/lib/queue/processors/insights/triggerPattern";
13
import { processDailyEnergy } from "@app/lib/queue/processors/insights/dailyEnergy";
14
import { processDailySleep } from "@app/lib/queue/processors/insights/dailySleep";
15

16
export async function insightProcessor(
17
  job: Job<InsightJobData["data"]>,
18
): Promise<void> {
19
  logger.info({ job: job.name }, "[insights] job started");
20

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

25
    case InsightJobName.MoodTrend:
26
      return processMoodTrend(job.data as InsightPeriodPayload);
27

28
    case InsightJobName.EnergySleep:
29
      return processEnergySleep(job.data as InsightPeriodPayload);
30

31
    case InsightJobName.TriggerPattern:
32
      return processTriggerPattern(job.data as InsightPeriodPayload);
33

34
    case InsightJobName.DailyEnergy:
35
      return processDailyEnergy(job.data as InsightPeriodPayload);
36

37
    case InsightJobName.DailySleep:
38
      return processDailySleep(job.data as InsightPeriodPayload);
39

40
    default:
41
      throw new Error(`Unknown insight job: ${job.name}`);
42
  }
43
}
44

45
async function fanOut(): Promise<void> {
46
  const users = await prisma.user.findMany({
47
    where: { active: true },
48
    select: { id: true },
49
  });
50

51
  const queue = getQueue("insights");
52
  const periodEnd = new Date();
53
  const periodStart = new Date();
54
  periodStart.setDate(periodEnd.getDate() - 7);
55

56
  const payload: Omit<InsightPeriodPayload, "userId"> = {
57
    periodStart: periodStart.toISOString(),
58
    periodEnd: periodEnd.toISOString(),
59
  };
60

61
  await queue.addBulk(
62
    users.flatMap((u) => [
63
      { name: InsightJobName.MoodTrend, data: { userId: u.id, ...payload } },
64
      { name: InsightJobName.EnergySleep, data: { userId: u.id, ...payload } },
65
      {
66
        name: InsightJobName.TriggerPattern,
67
        data: { userId: u.id, ...payload },
68
      },
69
    ]),
70
  );
71
}