eletrotupi / tcc/ api/src/services/medicineRegimen.service.ts95b0a7d7b379540440909110b748904954048374
2.3 KB | 83 lines Raw
1
import { prisma } from '@app/lib/prisma';
2
import { MedicineRegimen } from '@prisma/client';
3
import { CreateMedicineRegimenInput, UpdateMedicineRegimenInput } from '@app/schemas';
4
import { syncMedicineReminderJobs } from '@app/services/medicineReminder.sync';
5

6
type TodayEntry = {
7
  regimen: Pick<MedicineRegimen, 'id' | 'name' | 'dosage' | 'scheduledAt'>;
8
  logs: { id: number; takenAt: Date }[];
9
};
10

11
export const getMedicineRegimensByUserId = async (
12
  userId: number,
13
): Promise<MedicineRegimen[]> => {
14
  return prisma.medicineRegimen.findMany({
15
    where: { userId, active: true },
16
    orderBy: { createdAt: 'desc' },
17
  });
18
};
19

20
export const createMedicineRegimen = async (
21
  userId: number,
22
  input: CreateMedicineRegimenInput,
23
): Promise<MedicineRegimen> => {
24
  const regimen = await prisma.medicineRegimen.create({
25
    data: { ...input, userId },
26
  });
27
  await syncMedicineReminderJobs(regimen);
28
  return regimen;
29
};
30

31
export const updateMedicineRegimen = async (
32
  userId: number,
33
  id: number,
34
  input: UpdateMedicineRegimenInput,
35
): Promise<MedicineRegimen> => {
36
  const regimen = await prisma.medicineRegimen.update({
37
    where: { id, userId },
38
    data: input,
39
  });
40
  await syncMedicineReminderJobs(regimen);
41
  return regimen;
42
};
43

44
export const getTodayMedicineRegimens = async (
45
  userId: number,
46
): Promise<TodayEntry[]> => {
47
  const now = new Date();
48
  const startOfDay = new Date(now);
49
  startOfDay.setUTCHours(0, 0, 0, 0);
50
  const endOfDay = new Date(now);
51
  endOfDay.setUTCHours(23, 59, 59, 999);
52

53
  const regimens = await prisma.medicineRegimen.findMany({
54
    where: { userId, active: true },
55
    select: { id: true, name: true, dosage: true, scheduledAt: true },
56
    orderBy: { createdAt: 'desc' },
57
  });
58

59
  return Promise.all(
60
    regimens.map(async (regimen) => {
61
      const logs = await prisma.medicineLog.findMany({
62
        where: {
63
          regimenId: regimen.id,
64
          takenAt: { gte: startOfDay, lte: endOfDay },
65
        },
66
        select: { id: true, takenAt: true },
67
      });
68
      return { regimen, logs };
69
    })
70
  );
71
};
72

73
export const deactivateMedicineRegimen = async (
74
  userId: number,
75
  id: number,
76
): Promise<MedicineRegimen> => {
77
  const regimen = await prisma.medicineRegimen.update({
78
    where: { id, userId },
79
    data: { active: false },
80
  });
81
  await syncMedicineReminderJobs(regimen);
82
  return regimen;
83
};