Development of a Deadline and Schedule System for LMS
Deadlines and schedules form the temporal skeleton of a course. Without a proper system, students miss assignments, don't know when classes are, and instructors waste time on manual reminders.
Two Course Modes
Self-paced—students progress at their own pace. Deadlines are relative: "Assignment due 7 days after lesson start." No schedule.
Cohort-based—a cohort with fixed dates. Absolute deadlines and class schedules (webinars, seminars). Students enroll in specific cohorts.
Data Model
-- Cohorts
CREATE TABLE course_cohorts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
course_id UUID REFERENCES courses(id),
name VARCHAR(200), -- 'Cohort #5, March 2026'
starts_at DATE NOT NULL,
ends_at DATE,
max_students INT,
enrollment_open BOOLEAN DEFAULT TRUE
);
-- Assignment deadlines
CREATE TABLE assignment_deadlines (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
assignment_id UUID REFERENCES assignments(id),
cohort_id UUID REFERENCES course_cohorts(id),
-- Absolute deadline for cohort-based courses
deadline_at TIMESTAMPTZ,
-- Relative for self-paced: N days from lesson start
relative_days INT,
late_allowed BOOLEAN DEFAULT FALSE,
late_penalty_pct INT DEFAULT 0
);
-- Class schedule
CREATE TABLE schedule_events (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
cohort_id UUID REFERENCES course_cohorts(id),
lesson_id UUID REFERENCES lessons(id),
title VARCHAR(500),
event_type VARCHAR(50), -- 'webinar', 'seminar', 'qa_session'
starts_at TIMESTAMPTZ NOT NULL,
ends_at TIMESTAMPTZ NOT NULL,
location_url VARCHAR(2000), -- Zoom/Meet link
recording_url VARCHAR(2000), -- After event
is_mandatory BOOLEAN DEFAULT FALSE,
timezone VARCHAR(100) DEFAULT 'Europe/Moscow'
);
Calculating Personal Deadlines for Self-Paced
When a student enrolls in a course, all relative deadlines are converted to absolute deadlines and saved for that student:
async function assignDeadlines(studentId, courseId) {
const enrollment = await db.enrollments.findOne({ studentId, courseId });
const assignments = await db.assignments.findAll({ courseId });
const deadlineRecords = assignments
.filter(a => a.relativeDays !== null)
.map(a => ({
studentId,
assignmentId: a.id,
deadlineAt: addDays(enrollment.enrolledAt, a.relativeDays),
}));
await db.studentDeadlines.bulkCreate(deadlineRecords, {
onConflict: 'ignore', // Don't overwrite on repeat call
});
}
Display in Interface
For Students:
- Calendar with deadlines and classes
- "What to submit this week" list on dashboard
- Countdown timer for next deadline
- Categorization: overdue / today / this week / later
For Instructors:
- Cohort summary: how many submitted on time, how many didn't
- Bulk deadline extension for entire cohort
Deadline Notifications
Notifications sent via job queue on schedule:
| When | Type | Condition |
|---|---|---|
| 7 days | Assignment not submitted | |
| 24 hours | Email + Push | Assignment not submitted |
| 3 hours | Push | Assignment not submitted |
| Class day | Webinar reminder | |
| 15 minutes | Push | Class reminder |
// Cron job: runs every hour
async function sendDeadlineReminders() {
const upcoming = await db.studentDeadlines.findAll({
deadlineAt: {
gte: new Date(),
lte: addHours(new Date(), 25), // Next 25 hours
},
submittedAt: null, // Not yet submitted
reminderSent24h: false,
});
for (const deadline of upcoming) {
const hoursLeft = (deadline.deadlineAt - new Date()) / (1000 * 60 * 60);
if (hoursLeft <= 24) {
await sendReminderEmail(deadline.studentId, deadline.assignmentId);
await db.studentDeadlines.update(deadline.id, { reminderSent24h: true });
}
}
}
iCal Export
Students want to see course schedules in Google Calendar or Apple Calendar:
import ical from 'ical-generator';
app.get('/api/courses/:id/schedule.ics', authMiddleware, async (req, res) => {
const events = await db.scheduleEvents.findAll({ courseId: req.params.id });
const calendar = ical({ name: course.title });
events.forEach(event => {
calendar.createEvent({
start: event.startsAt,
end: event.endsAt,
summary: event.title,
description: `Type: ${event.eventType}\nLink: ${event.locationUrl}`,
url: event.locationUrl,
});
});
res.setHeader('Content-Type', 'text/calendar');
res.send(calendar.toString());
});
Timeline
Basic deadline system with notifications—4–5 days. Cohort-based schedule with calendar display and iCal export—another 4–5 days.







