| 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 | }
|