Initial commit: Complete NodeJS-native setup
- Migrated from Python pre-commit to NodeJS-native solution - Reorganized documentation structure - Set up Husky + lint-staged for efficient pre-commit hooks - Fixed Dockerfile healthcheck issue - Added comprehensive documentation index
This commit is contained in:
107
utils/schedule.ts
Normal file
107
utils/schedule.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
import {
|
||||
Medication,
|
||||
Dose,
|
||||
Frequency,
|
||||
CustomReminder,
|
||||
ReminderInstance,
|
||||
} from '../types';
|
||||
|
||||
export const generateSchedule = (
|
||||
medications: Medication[],
|
||||
forDate: Date
|
||||
): Dose[] => {
|
||||
const schedule: Dose[] = [];
|
||||
const today = new Date(forDate);
|
||||
today.setHours(0, 0, 0, 0);
|
||||
|
||||
medications.forEach(med => {
|
||||
const [startHour, startMinute] = med.startTime.split(':').map(Number);
|
||||
|
||||
const createDose = (hour: number, minute: number): Dose => {
|
||||
const scheduledTime = new Date(today);
|
||||
scheduledTime.setHours(hour, minute, 0, 0);
|
||||
const dateString = scheduledTime.toISOString().split('T')[0];
|
||||
const timeString = scheduledTime
|
||||
.toTimeString()
|
||||
.split(' ')[0]
|
||||
.replace(/:/g, '');
|
||||
return {
|
||||
id: `${med._id}-${dateString}-${timeString}`,
|
||||
medicationId: med._id,
|
||||
scheduledTime,
|
||||
};
|
||||
};
|
||||
|
||||
switch (med.frequency) {
|
||||
case Frequency.Daily:
|
||||
schedule.push(createDose(startHour, startMinute));
|
||||
break;
|
||||
case Frequency.TwiceADay:
|
||||
schedule.push(createDose(startHour, startMinute));
|
||||
schedule.push(createDose((startHour + 12) % 24, startMinute));
|
||||
break;
|
||||
case Frequency.ThreeTimesADay:
|
||||
schedule.push(createDose(startHour, startMinute));
|
||||
schedule.push(createDose((startHour + 8) % 24, startMinute));
|
||||
schedule.push(createDose((startHour + 16) % 24, startMinute));
|
||||
break;
|
||||
case Frequency.EveryXHours:
|
||||
if (med.hoursBetween && med.hoursBetween > 0) {
|
||||
for (let h = 0; h < 24; h += med.hoursBetween) {
|
||||
schedule.push(createDose((startHour + h) % 24, startMinute));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
return schedule.sort(
|
||||
(a, b) => a.scheduledTime.getTime() - b.scheduledTime.getTime()
|
||||
);
|
||||
};
|
||||
|
||||
export const generateReminderSchedule = (
|
||||
reminders: CustomReminder[],
|
||||
forDate: Date
|
||||
): ReminderInstance[] => {
|
||||
const schedule: ReminderInstance[] = [];
|
||||
const today = new Date(forDate);
|
||||
today.setHours(0, 0, 0, 0);
|
||||
|
||||
reminders.forEach(reminder => {
|
||||
const [startHour, startMinute] = reminder.startTime.split(':').map(Number);
|
||||
const [endHour, endMinute] = reminder.endTime.split(':').map(Number);
|
||||
|
||||
const firstReminderTime = new Date(today);
|
||||
firstReminderTime.setHours(startHour, startMinute, 0, 0);
|
||||
|
||||
const endOfWindowTime = new Date(today);
|
||||
endOfWindowTime.setHours(endHour, endMinute, 0, 0);
|
||||
|
||||
let currentReminderTime = firstReminderTime;
|
||||
|
||||
while (currentReminderTime.getTime() <= endOfWindowTime.getTime()) {
|
||||
const dateString = currentReminderTime.toISOString().split('T')[0];
|
||||
const timeString = currentReminderTime
|
||||
.toTimeString()
|
||||
.split(' ')[0]
|
||||
.replace(/:/g, '');
|
||||
|
||||
schedule.push({
|
||||
id: `${reminder._id}-${dateString}-${timeString}`,
|
||||
reminderId: reminder._id,
|
||||
title: reminder.title,
|
||||
icon: reminder.icon,
|
||||
scheduledTime: new Date(currentReminderTime),
|
||||
});
|
||||
|
||||
currentReminderTime = new Date(
|
||||
currentReminderTime.getTime() + reminder.frequencyMinutes * 60000
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
return schedule.sort(
|
||||
(a, b) => a.scheduledTime.getTime() - b.scheduledTime.getTime()
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user