eletrotupi / tcc/ api/src/services/medicineReminder.sync.tsb44450051fd5637c480a9dec8ae1f93921d1754c
1.9 KB | 80 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

6
function timeToCron(time: string): string {
7
  const [hour, minute] = time.split(":").map(Number);
8
  return `${minute} ${hour} * * *`;
9
}
10

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

23
  const queue = getQueue("medicine-reminders");
24

25
  const existing = await queue.getRepeatableJobs();
26
  let removedCount = 0;
27

28
  for (const job of existing) {
29
    if (job.id?.startsWith(`regimen-${regimen.id}-`)) {
30
      await queue.removeRepeatableByKey(job.key);
31
      removedCount++;
32
    }
33
  }
34

35
  logger.info(
36
    { regimenId: regimen.id, removedCount },
37
    "[medicine-sync] removed existing jobs",
38
  );
39

40
  if (!regimen.active) {
41
    logger.info(
42
      { regimenId: regimen.id },
43
      "[medicine-sync] regimen inactive, no jobs scheduled",
44
    );
45

46
    return;
47
  }
48

49
  if (regimen.scheduledAt.length === 0) {
50
    logger.info(
51
      { regimenId: regimen.id },
52
      "[medicine-sync] regimen has no scheduledAt times, skipping",
53
    );
54

55
    return;
56
  }
57

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

75
    logger.info(
76
      { regimenId: regimen.id, time, cron },
77
      "[medicine-sync] scheduled job",
78
    );
79
  }
80
}