eletrotupi / tcc/ api/src/services/medicineReminder.sync.tsc941890054e469bdf624c967e653c5c48b4fb80f
1.8 KB | 76 lines Raw
1
import { MedicineRegimen } from "@prisma/client";
2
import { getQueue } from "@app/lib/queue/QueueRegistry";
3
import { MedicineReminderJobName } from "@app/lib/queue/types";
4
import { logger } from "@app/lib/logger";
5
import { timeToCron } from "@app/utils/calc";
6

7
export async function syncMedicineReminderJobs(
8
  regimen: MedicineRegimen
9
): Promise<void> {
10
  logger.info(
11
    {
12
      regimenId: regimen.id,
13
      active: regimen.active,
14
      scheduledAt: regimen.scheduledAt,
15
    },
16
    "[medicine-sync] syncing regimen",
17
  );
18

19
  const queue = getQueue("medicine-reminders");
20

21
  const existing = await queue.getRepeatableJobs();
22
  let removedCount = 0;
23

24
  for (const job of existing) {
25
    if (job.id?.startsWith(`regimen-${regimen.id}-`)) {
26
      await queue.removeRepeatableByKey(job.key);
27
      removedCount++;
28
    }
29
  }
30

31
  logger.info(
32
    { regimenId: regimen.id, removedCount },
33
    "[medicine-sync] removed existing jobs",
34
  );
35

36
  if (!regimen.active) {
37
    logger.info(
38
      { regimenId: regimen.id },
39
      "[medicine-sync] regimen inactive, no jobs scheduled",
40
    );
41

42
    return;
43
  }
44

45
  if (regimen.scheduledAt.length === 0) {
46
    logger.info(
47
      { regimenId: regimen.id },
48
      "[medicine-sync] regimen has no scheduledAt times, skipping",
49
    );
50

51
    return;
52
  }
53

54
  for (const time of regimen.scheduledAt) {
55
    const cron = timeToCron(time);
56
    await queue.add(
57
      MedicineReminderJobName.Send,
58
      {
59
        userId: regimen.userId,
60
        regimenId: regimen.id,
61
        medicineName: regimen.name,
62
        dosage: regimen.dosage,
63
        scheduledTime: time,
64
      },
65
      {
66
        repeat: { pattern: cron, tz: "America/Sao_Paulo" },
67
        jobId: `regimen-${regimen.id}-${time}`,
68
      }
69
    );
70

71
    logger.info(
72
      { regimenId: regimen.id, time, cron },
73
      "[medicine-sync] scheduled job",
74
    );
75
  }
76
}