eletrotupi / tcc/ api/src/services/dailyReminder.sync.tsdafa6f8a8e3b0e51605fc953a979d50ff6085b26
1.4 KB | 52 lines Raw
1
import { User } from "@prisma/client";
2
import { getQueue } from "@app/lib/queue/QueueRegistry";
3
import { DailyReminderJobName } from "@app/lib/queue/types";
4
import { logger } from "@app/lib/logger";
5

6
// XXX: Might be moved to the utilities?
7
function timeToCron(time: string): string {
8
  const [hour, minute] = time.split(":").map(Number);
9
  return `${minute} ${hour} * * *`;
10
}
11

12
export async function syncDailyReminderJob(user: User): Promise<void> {
13
  logger.info({ userId: user.id }, "[daily-sync] syncing user");
14

15
  const queue = getQueue("daily-reminders");
16

17
  const existing = await queue.getRepeatableJobs();
18
  for (const job of existing) {
19
    if (job.id?.includes(`daily-reminder-user-${user.id}`)) {
20
      await queue.removeRepeatableByKey(job.key);
21
    }
22
  }
23

24
  if (!user.notificationsEnabled || !user.dailyReminderTime) {
25
    logger.info(
26
      {
27
        userId: user.id,
28
        enabled: user.notificationsEnabled,
29
        time: user.dailyReminderTime,
30
      },
31
      "[daily-sync] user skipped",
32
    );
33

34
    return;
35
  }
36

37
  const cron = timeToCron(user.dailyReminderTime);
38

39
  await queue.add(
40
    DailyReminderJobName.Send,
41
    { userId: user.id, scheduledTime: user.dailyReminderTime },
42
    {
43
      repeat: { pattern: cron, tz: "America/Sao_Paulo" },
44
      jobId: `daily-reminder-user-${user.id}`,
45
    }
46
  );
47

48
  logger.info(
49
    { userId: user.id, time: user.dailyReminderTime, cron },
50
    "[daily-sync] scheduled daily reminder",
51
  );
52
}