Assignments, Notes & Quizzes
Last updated August 2, 2026
Classgrid's Assignment module handles creation, submission, grading, and analytics for classroom assignments. All assignment data is stored in Supabase/Postgres (assignments, assignment_submissions tables), while classroom membership and student identity are resolved from MongoDB.
Creating Assignments (Teacher)
API: POST /api/assignments/:classroomId
Roles: Classroom owner (enforced via requireClassroomOwner middleware)
Body:
Holiday Guard: Before creating, the system checks isHoliday(today, orgId). If today is a holiday, creation is blocked with:
After creation:
- Sends bulk push notifications to all enrolled students in the classroom via
bulkDispatchNotification - Title: "📚 New Assignment"
- Message: "A new assignment '[title]' has been posted"
Student Views
Global Assignment List (All Classes)
API: GET /api/assignments/global/me
Roles: Any authenticated student or teacher
For Students: Returns assignments across all enrolled classrooms with submission status:
Status logic:
submitted— submitted before deadlinelate— submitted after deadlinemissing— not submitted AND past due datepending— not submitted AND before due date
For Teachers: Returns their assignments across all classes with submittedCount per assignment.
Single Assignment Detail
API: GET /api/assignments/:assignmentId
Roles: Classroom teacher or enrolled student
Student view: Returns assignment details + their own submission (if any) with submittedFile, grade, feedback, status.
Teacher view: Returns assignment details + all student submissions with:
- Student info (name, email, profile picture) from MongoDB
- Submission status:
Submitted,Late,Not Submitted - Late detection: compares
submitted_atagainstdue_dateend-of-day (23:59:59.999) - Sort order: submitted first (by date), then not-submitted (alphabetical by name)
Submitting Assignments (Student)
API: POST /api/assignments/:assignmentId/submit
Roles: Enrolled student (verified via ClassroomMembership)
Body:
Guards:
- Late submission block: If
block_late === trueand current time >due_date, returns HTTP 403:JSON - Holiday guard: If today is a holiday, submissions are blocked:
JSON
Upsert behavior: Uses Supabase upsert with conflict on (assignment_id, student_id) — resubmission overwrites the previous file.
Status is automatically set to late if submitted after due_date end-of-day.
Unsubmit (Retract Submission)
API: DELETE /api/assignments/:assignmentId/unsubmit
Roles: Enrolled student
- Blocked if the submission has already been graded (
grade != null) - Returns: "Cannot unsubmit — assignment has already been graded"
Grading (Teacher)
Grade Individual Submission
API: POST /api/assignments/:assignmentId/grade/:submissionId
Roles: Assignment creator (teacher)
Body:
After grading:
- Updates submission
statustoreturnedand setsgraded_attimestamp - Sends push notification to student: "✅ Assignment Graded — Your assignment '[title]' has been graded: 85 points."
Bulk Grade
API: POST /api/assignments/:assignmentId/grade-bulk
Roles: Assignment creator (teacher)
Body:
- Grades are clamped between 0 and
max_points - Processes sequentially; returns count of successes and any errors
- Returns: "Graded 45 submission(s), 2 failed"
Editing & Deleting Assignments
Edit Assignment
API: PUT /api/assignments/:assignmentId
Roles: Assignment creator (teacher)
Updatable fields: title, description, dueDate, maxPoints, attachments
Delete Assignment
API: DELETE /api/assignments/:assignmentId
Roles: Assignment creator (teacher)
Deletes the assignment — submissions are automatically cascade-deleted via Supabase ON DELETE CASCADE.
Database Tables (Supabase)
Unique constraint on submissions: (assignment_id, student_id) — one submission per student per assignment.