atikin-chrono-flow
Version:
Intelligent Timezone-Aware Scheduling
72 lines (58 loc) • 1.69 kB
JavaScript
const moment = require('moment-timezone');
const { v4: uuidv4 } = require('uuid');
class ChronoFlow {
constructor() {
this.schedules = [];
}
// Add a new event
addEvent(name, startTime, endTime, timezone) {
const start = moment.tz(startTime, timezone);
const end = moment.tz(endTime, timezone);
if (!start.isValid() || !end.isValid()) {
throw new Error("Invalid date or timezone provided.");
}
if (start.isAfter(end)) {
throw new Error("Start time must be before end time.");
}
const event = {
id: uuidv4(),
name,
start,
end,
timezone,
};
this.schedules.push(event);
return event;
}
// Get all events in a specific timezone
getEventsInTimezone(timezone) {
return this.schedules.map((event) => ({
...event,
start: event.start.clone().tz(timezone).format(),
end: event.end.clone().tz(timezone).format(),
}));
}
// Check for overlapping events
detectConflicts() {
const conflicts = [];
for (let i = 0; i < this.schedules.length; i++) {
for (let j = i + 1; j < this.schedules.length; j++) {
const event1 = this.schedules[i];
const event2 = this.schedules[j];
if (
event1.start.isBefore(event2.end) &&
event1.end.isAfter(event2.start)
) {
conflicts.push({ event1, event2 });
}
}
}
return conflicts;
}
// Remove an event by ID
removeEvent(id) {
this.schedules = this.schedules.filter((event) => event.id !== id);
return this.schedules;
}
}
module.exports = ChronoFlow;