Skip to content

Assignment Controller

Overview

The assignment.controller module handles operations related to course assignments for both faculty and students. It includes functionalities for managing courses, creating and updating assignments, student submissions, and fetching user-specific academic data.

Dependencies

import mongoose from "mongoose";
import { Faculty } from "../models/faculty.model.js";
import { Course, FacultyCourse } from "../models/course.model.js";
import { Assignment } from "../models/assignment.model.js";
import { Student } from "../models/student.model.js";
import { StudentCourse } from "../models/course.model.js";
import { User } from "../models/user.model.js";`

Controller Methods

Course Management

getFacultyCourses

Fetches all ongoing courses assigned to a faculty.

Input: - req.params: userId (faculty's user ID)

Process: 1. Retrieves the faculty using userId. 2. Finds all ongoing course mappings from FacultyCourse. 3. Fetches course details from Course.

Key Code Snippet

const facultyCourses = await FacultyCourse.find({ facultyId: userId, status: "Ongoing" });
const courseCodes = facultyCourses.map(fc => fc.courseCode);
const courses = await Course.find({ courseCode: { $in: courseCodes } });

Output: - Success (200): List of courses. - Error (404/500): Returns error message.

getStudentCourses

Fetches all approved courses a student is enrolled in.

Input: - req.params: userId (student's user ID)

Process: 1. Finds student record by userId. 2. Retrieves approved course enrollments from StudentCourse. 3. Fetches course details from Course.

Key Code Snippet

const studentCourses = await StudentCourse.find({ rollNo: student.rollNo, status: 'Approved' });
const courseCodes = studentCourses.map(sc => sc.courseId);
const courses = await Course.find({ courseCode: { $in: courseCodes } });

Output: - Success (200): List of enrolled courses. - Error (404/500): Returns error message.

getCourse

Retrieves details of a course using courseCode.

Input: - req.params: courseCode

Process: 1. Fetches course using course code.

Key Code Snippet

const course = await Course.findOne({ courseCode });

Output: - Success (200): Course data. - Error (400/404/500): Returns error message.

Assignment Management

createAssignment

Creates a new assignment for a course.

Input: - req.params: courseId - req.body: title, description, dueDate

Process: 1. Validates input fields. 2. Counts current assignments to assign a sequential number. 3. Creates and saves new assignment.

Key Code Snippet

const assignmentCount = await Assignment.countDocuments({ courseCode: courseId });
const newAssignment = new Assignment({
  assignmentNumber: assignmentCount + 1,
  courseCode: courseId,
  title,
  description,
  dueDate: new Date(dueDate),
});
await newAssignment.save();

Output: - Success (201): Assignment object. - Error (400/500): Returns error message.

getCourseAssignments

Fetches all assignments of a course.

Input: - req.params: courseId

Process: 1. Validates course ID. 2. Finds assignments using course code.

Key Code Snippet

const assignments = await Assignment.find({ courseCode: courseId });

Output: - Success (200): List of assignments. - Error (400/500): Returns error message.

getAssignmentDetails

Fetches details of a specific assignment.

Input: - req.params: courseId, assignmentId

Process: 1. Finds assignment by course and assignment number.

Key Code Snippet

const assignment = await Assignment.findOne({
  assignmentNumber: assignmentId,
  courseCode: courseId,
});

Output: - Success (200): Assignment object. - Error (404/500): Returns error message.

editAssignmentDetails

Updates title, description, or due date of an assignment.

Input: - req.params: courseId, assignmentId - req.body: title, description, dueDate

Process: 1. Validates required fields. 2. Finds and updates assignment.

Key Code Snippet

const updatedAssignment = await Assignment.findOneAndUpdate(
  { assignmentNumber: assignmentId, courseCode: courseId },
  { title, description, dueDate },
  { new: true }
);

Output: - Success (200): Updated assignment. - Error (400/404/500): Returns error message.

deleteAssignmentDetails

Deletes a specific assignment.

Input: - req.params: courseId, assignmentId

Process: 1. Validates input. 2. Deletes assignment using course and assignment number.

Key Code Snippet

const deletedAssignment = await Assignment.findOneAndDelete({
  assignmentNumber: assignmentId,
  courseCode: courseId,
});

Output: - Success (200): Deleted assignment object. - Error (400/404/500): Returns error message.

Submission Management

submitAssignment

Allows a student to submit an assignment.

Input: - req.params: courseCode, assignmentId - req.body: studentRollNo, studentName, content

Process: 1. Finds assignment by course and ID. 2. Checks if the student has already submitted. 3. Pushes submission with current timestamp.

Key Code Snippet

const alreadySubmitted = assignment.submissions.some(
  (sub) => sub.studentRollNo === studentRollNo
);

assignment.submissions.push({
  studentRollNo,
  studentName,
  content,
  submittedAt: new Date(),
});
await assignment.save();

Output: - Success (200): Confirmation message. - Error (404/409/500): Returns error message.

undoSubmission

Allows a student to undo a submission.

Input: - req.params: courseCode, assignmentId, rollNo

Process: 1. Finds the assignment. 2. Removes the student's submission from the list. 3. Saves the assignment.

Key Code Snippet

assignment.submissions = assignment.submissions.filter(
  (sub) => sub.studentRollNo !== rollNo
);
await assignment.save();

Output: - Success (200): Confirmation message. - Error (404/500): Returns error message.

User and Student Info

getStudent

Fetches student details by user ID.

Input: - req.params: userId

Process: 1. Finds student record using userId.

Key Code Snippet

const student = await Student.findOne({ userId });

Output: - Success (200): Student object. - Error (404/500): Returns error message.

getUser

Fetches user details from the User collection.

Input: - req.params: userId

Process: 1. Finds user document by ID.

Key Code Snippet

const user = await User.findById(userId);

Output: - Success (200): User object. - Error (404/500): Returns error message.

Error Handling Strategy

  • Validations for required fields before DB operations.
  • All async operations wrapped in try-catch.
  • Returns specific messages and status codes (400, 404, 500).
  • Console logs for debugging and traceability.

Business Rules

  • Students cannot resubmit once an assignment is submitted (unless undone).
  • Assignment numbers are auto-incremented per course.
  • Course-based filtering ensures scoped data access.