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