eletrotupi / tcc/ api/src/services/medicineRegimen.service.tsc901c35af9c84b6a29e5185545ced1129f33b8f4
2.8 KB | 115 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
export const toggleMedicineRegimen = async (
7
  userId: number,
8
  id: number,
9
  active: boolean,
10
): Promise<MedicineRegimen> => {
11
  const regimen = await prisma.medicineRegimen.update({
12
    where: { id, userId },
13
    data: { active },
14
  });
15

16
  await syncMedicineReminderJobs(regimen);
17

18
  return regimen;
19
};
20

21
type TodayEntry = {
22
  regimen: Pick<MedicineRegimen, 'id' | 'name' | 'dosage' | 'scheduledAt'>;
23
  logs: { id: number; takenAt: Date }[];
24
};
25

26
export const getMedicineRegimenById = async (
27
  userId: number,
28
  id: number,
29
): Promise<MedicineRegimen | null> => {
30
  return prisma.medicineRegimen.findUnique({
31
    where: { id, userId },
32
  });
33
};
34

35
export const getMedicineRegimensByUserId = async (
36
  userId: number,
37
): Promise<MedicineRegimen[]> => {
38
  return prisma.medicineRegimen.findMany({
39
    where: { userId },
40
    orderBy: [{ active: 'desc' }, { createdAt: 'desc' }],
41
  });
42
};
43

44
export const createMedicineRegimen = async (
45
  userId: number,
46
  input: CreateMedicineRegimenInput,
47
): Promise<MedicineRegimen> => {
48
  const regimen = await prisma.medicineRegimen.create({
49
    data: { ...input, userId },
50
  });
51

52
  await syncMedicineReminderJobs(regimen);
53

54
  return regimen;
55
};
56

57
export const updateMedicineRegimen = async (
58
  userId: number,
59
  id: number,
60
  input: UpdateMedicineRegimenInput,
61
): Promise<MedicineRegimen> => {
62
  const regimen = await prisma.medicineRegimen.update({
63
    where: { id, userId },
64
    data: input,
65
  });
66

67
  await syncMedicineReminderJobs(regimen);
68

69
  return regimen;
70
};
71

72
export const getTodayMedicineRegimens = async (
73
  userId: number,
74
): Promise<TodayEntry[]> => {
75
  const now = new Date();
76

77
  const startOfDay = new Date(now);
78
  startOfDay.setUTCHours(0, 0, 0, 0);
79

80
  const endOfDay = new Date(now);
81
  endOfDay.setUTCHours(23, 59, 59, 999);
82

83
  const regimens = await prisma.medicineRegimen.findMany({
84
    where: { userId, active: true },
85
    select: { id: true, name: true, dosage: true, scheduledAt: true },
86
    orderBy: { createdAt: 'desc' },
87
  });
88

89
  return Promise.all(
90
    regimens.map(async (regimen) => {
91
      const logs = await prisma.medicineLog.findMany({
92
        where: {
93
          regimenId: regimen.id,
94
          takenAt: { gte: startOfDay, lte: endOfDay },
95
        },
96
        select: { id: true, takenAt: true },
97
      });
98
      return { regimen, logs };
99
    })
100
  );
101
};
102

103
export const deactivateMedicineRegimen = async (
104
  userId: number,
105
  id: number,
106
): Promise<MedicineRegimen> => {
107
  const regimen = await prisma.medicineRegimen.update({
108
    where: { id, userId },
109
    data: { active: false },
110
  });
111

112
  await syncMedicineReminderJobs(regimen);
113

114
  return regimen;
115
};