diff --git a/src/controllers/educationTaskController.js b/src/controllers/educationTaskController.js index 288771723..73ae9d05c 100644 --- a/src/controllers/educationTaskController.js +++ b/src/controllers/educationTaskController.js @@ -2,7 +2,6 @@ const EducationTask = require('../models/educationTask'); const LessonPlan = require('../models/lessonPlan'); const UserProfile = require('../models/userProfile'); const Atom = require('../models/atom'); -const IntermediateTask = require('../models/intermediateTask'); const educationTaskController = function () { // Get all education tasks @@ -165,9 +164,10 @@ const educationTaskController = function () { } // Update completedAt if status is being changed to completed - const { completedAt: currentCompletedAt } = task; - const completedAt = - status === 'completed' && task.status !== 'completed' ? new Date() : currentCompletedAt; + let { completedAt } = task; + if (status === 'completed' && task.status !== 'completed') { + completedAt = new Date(); + } const updatedTask = await EducationTask.findByIdAndUpdate( id, @@ -227,9 +227,10 @@ const educationTaskController = function () { }); } - const { completedAt: currentCompletedAt } = task; - const completedAt = - status === 'completed' && task.status !== 'completed' ? new Date() : currentCompletedAt; + let { completedAt } = task; + if (status === 'completed' && task.status !== 'completed') { + completedAt = new Date(); + } const updatedTask = await EducationTask.findByIdAndUpdate( id, @@ -294,137 +295,105 @@ const educationTaskController = function () { } }; - // Helper function to check and update parent task progress - const checkAndUpdateParentTaskProgress = async (parentTaskId) => { + const getTaskSubmissions = async (req, res) => { try { - // Get all intermediate tasks for this parent - const intermediateTasks = await IntermediateTask.find({ parent_task_id: parentTaskId }); + const { status, studentId, lessonPlanId, courseId } = req.query; - // If there are no intermediate tasks, return - if (intermediateTasks.length === 0) { - return; - } + const filter = {}; - // Check if all intermediate tasks are completed - const allCompleted = intermediateTasks.every((task) => task.status === 'completed'); - - if (allCompleted) { - // Get the parent task - const parentTask = await EducationTask.findById(parentTaskId); - - // Only update if parent task is not already completed or graded - if (parentTask && parentTask.status !== 'completed' && parentTask.status !== 'graded') { - await EducationTask.findByIdAndUpdate( - parentTaskId, - { - status: 'completed', - completedAt: new Date(), - }, - { new: true }, - ); - } + // Support friendly status values from frontend (e.g., "submissions", "pending submissions") + // Map them to internal task statuses where applicable. + if (status) { + const statusMap = { + submissions: 'completed', + 'pending submissions': 'assigned', + pending: 'assigned', + completed: 'completed', + graded: 'graded', + }; + filter.status = statusMap[status] || status; } - } catch (error) { - console.error('Error updating parent task progress:', error); - } - }; - - // Mark task as complete - const markTaskAsComplete = async (req, res) => { - try { - const { taskId, studentId, taskType } = req.body; - const requestorId = req.body.requestor?.requestorId; - - if (!taskId) { - return res.status(400).json({ error: 'Task ID is required' }); + if (studentId) { + filter.studentId = studentId; } - if (!requestorId) { - return res.status(401).json({ error: 'Authentication required' }); + // Accept `courseId` as an alias for lessonPlanId when frontend sends course filters. + const lpFilterId = lessonPlanId || courseId; + if (lpFilterId) { + filter.lessonPlanId = lpFilterId; } - // Handle intermediate tasks - if (taskType === 'intermediate') { - const intermediateTask = await IntermediateTask.findById(taskId).populate('parent_task_id'); + const submissions = await EducationTask.find(filter) + .populate('studentId', 'firstName lastName email') + .populate('lessonPlanId', 'title') + .sort({ completedAt: -1 }); - if (!intermediateTask) { - return res.status(404).json({ error: 'Intermediate task not found' }); + // Helper function to format a single task submission + const formatSubmission = (task) => { + if (!task.studentId || !task.lessonPlanId) { + return null; } - // Check if task is already completed - if (intermediateTask.status === 'completed') { - return res.status(400).json({ error: 'Task is already completed' }); + // Detect late submission: when completedAt exists and is after dueAt + let isLate = false; + let lateByMs = 0; + if (task.completedAt && task.dueAt) { + const completed = new Date(task.completedAt).getTime(); + const due = new Date(task.dueAt).getTime(); + if (!Number.isNaN(completed) && !Number.isNaN(due) && completed > due) { + isLate = true; + lateByMs = completed - due; + } } - // Update intermediate task status to completed (only update status field) - const updatedTask = await IntermediateTask.findByIdAndUpdate( - taskId, - { - $set: { status: 'completed' }, - }, - { new: true, runValidators: true }, - ).populate('parent_task_id', 'type status dueAt studentId lessonPlanId'); - - // Check if all intermediate tasks for the parent are completed - await checkAndUpdateParentTaskProgress(intermediateTask.parent_task_id); - - return res.status(200).json({ - message: 'Intermediate task marked as complete successfully', - task: updatedTask, - }); - } - - // Handle education tasks (original logic) - if (!studentId) { - return res.status(400).json({ error: 'Student ID is required' }); - } - - // Find the task and verify it belongs to the student - const task = await EducationTask.findOne({ - _id: taskId, - studentId, - }); - - if (!task) { - return res.status(404).json({ error: 'Task not found or does not belong to student' }); - } - - // Check if task is already completed - if (task.status === 'completed') { - return res.status(400).json({ error: 'Task is already completed' }); - } - - // Verify task type is read-only (only read-only tasks can be marked done manually) - if (task.type !== 'read') { - return res.status(400).json({ - error: 'Only read-only tasks can be marked as complete manually', - }); - } - - // Check if logged hours meet the requirement - if (task.loggedHours < task.suggestedTotalHours) { - return res.status(400).json({ - error: `Insufficient hours logged. Required: ${task.suggestedTotalHours}, Logged: ${task.loggedHours}`, - }); - } - - // Update task status to completed - const updatedTask = await EducationTask.findByIdAndUpdate( - taskId, - { - status: 'completed', - completedAt: new Date(), - }, - { new: true }, - ) - .populate('lessonPlanId', 'title theme') - .populate('studentId', 'firstName lastName email') - .populate('atomIds', 'name description difficulty'); - - res.status(200).json({ - message: 'Task marked as complete successfully', - task: updatedTask, - }); + // If no completedAt but current time is past due and status not completed, + // mark as overdue (not yet submitted) but not a "late submission". + const now = Date.now(); + const isOverdue = !task.completedAt && task.dueAt && new Date(task.dueAt).getTime() < now; + + const camelStatus = (() => { + if (task.status === 'completed') return 'Pending Review'; + if (task.status === 'graded') return 'Graded'; + return task.status; + })(); + + return { + _id: task._id, + studentId: task.studentId._id, + + // CamelCase fields expected by current frontend + studentName: `${task.studentId.firstName} ${task.studentId.lastName}`, + studentEmail: task.studentId.email, + taskName: task.name || 'Unnamed Task', + taskType: task.type, + submissionLinks: task.uploadUrls || [], + status: camelStatus, + submittedAt: task.completedAt || null, + assignedAt: task.assignedAt || null, + dueAt: task.dueAt || null, + grade: task.grade, + feedback: task.feedback, + lessonPlanId: task.lessonPlanId._id, + lessonPlanTitle: task.lessonPlanId.title || 'Unknown Lesson Plan', + late: isLate, + lateByMs: isLate ? lateByMs : 0, + overdue: isOverdue, + + // Backwards-compatible snake_case fields (some integrations may use these) + student_name: `${task.studentId.firstName} ${task.studentId.lastName}`, + student_email: task.studentId.email, + task: task.name || 'Unnamed Task', + task_type: task.type, + submission_link: task.uploadUrls || [], + submitted_at: task.completedAt || null, + assigned_at: task.assignedAt || null, + due_at: task.dueAt || null, + }; + }; + + const formattedSubmissions = submissions.map(formatSubmission).filter(Boolean); + + res.status(200).json(formattedSubmissions); } catch (error) { res.status(500).json({ error: error.message }); } @@ -441,7 +410,7 @@ const educationTaskController = function () { updateTaskStatus, gradeTask, getTasksByStatus, - markTaskAsComplete, + getTaskSubmissions, }; }; diff --git a/src/models/educationTask.js b/src/models/educationTask.js index a50ccb650..88e5337ed 100644 --- a/src/models/educationTask.js +++ b/src/models/educationTask.js @@ -2,6 +2,11 @@ const mongoose = require('mongoose'); const educationTaskSchema = new mongoose.Schema( { + name: { + type: String, + required: true, + trim: true, + }, lessonPlanId: { type: mongoose.Schema.Types.ObjectId, ref: 'LessonPlan', @@ -9,7 +14,7 @@ const educationTaskSchema = new mongoose.Schema( }, studentId: { type: mongoose.Schema.Types.ObjectId, - ref: 'userProfile', + ref: 'User', required: true, }, atomIds: [ @@ -56,14 +61,6 @@ const educationTaskSchema = new mongoose.Schema( type: String, trim: true, }, - suggestedTotalHours: { - type: Number, - default: 0, - }, - loggedHours: { - type: Number, - default: 0, - }, }, { timestamps: true, diff --git a/src/models/userProfile.js b/src/models/userProfile.js index bc1ab732b..0433b030c 100644 --- a/src/models/userProfile.js +++ b/src/models/userProfile.js @@ -128,19 +128,6 @@ const userProfileSchema = new Schema({ date: { type: String, required: true }, description: { type: String, required: true }, createdDate: { type: String }, - - reason: { - type: String, - enum: [ - 'missingHours', - 'missingSummary', - 'missingBothHoursAndSummary', - 'vacationTime', - 'other', - ], - required: false, - }, - ccdUsers: { type: [ { @@ -153,7 +140,6 @@ const userProfileSchema = new Schema({ }, }, ], - infringementCount: { type: Number, default: 0 }, warnings: [ { date: { type: String, required: true }, @@ -312,7 +298,6 @@ const userProfileSchema = new Schema({ daterequestedFeedback: { type: Date, default: Date.now }, foundHelpSomeWhereClosePermanently: { type: Boolean, default: false }, }, - infringementCCList: [ { email: { type: String, required: true }, @@ -364,7 +349,7 @@ const userProfileSchema = new Schema({ assignedStudents: [ { type: mongoose.Schema.Types.ObjectId, - ref: 'UserProfile', + ref: 'User', }, ], }, @@ -389,27 +374,13 @@ const userProfileSchema = new Schema({ assignedTeachers: [ { type: mongoose.Schema.Types.ObjectId, - ref: 'UserProfile', + ref: 'User', }, ], }, }, }); -function clearUserCache(doc) { - try { - const cache = require('../utilities/nodeCache')(); - if (!cache) return; - - cache.removeCache('allusers_v1'); - if (doc && doc._id) { - cache.removeCache(`user_${doc._id.toString()}`); - } - } catch (error) { - console.error('Cache clear failed:', error.message); - } -} - userProfileSchema.pre('save', function (next) { const user = this; if (!user.isModified('password')) return next(); @@ -424,21 +395,11 @@ userProfileSchema.pre('save', function (next) { .catch((error) => next(error)); }); -userProfileSchema.post('save', (doc) => { - clearUserCache(doc); -}); -userProfileSchema.post('deleteOne', { document: true, query: false }, (doc) => { - clearUserCache(doc); -}); -userProfileSchema.post(['findOneAndUpdate', 'findOneAndDelete'], (doc) => { - clearUserCache(doc); -}); userProfileSchema.index({ teamCode: 1 }); userProfileSchema.index({ email: 1 }); userProfileSchema.index({ projects: 1, firstName: 1 }); userProfileSchema.index({ projects: 1, lastName: 1 }); userProfileSchema.index({ isActive: 1 }); -userProfileSchema.index({ lastName: 1 }); // Add index for weeklySummaries.dueDate to speed up filtering userProfileSchema.index({ 'weeklySummaries.dueDate': 1 }); // Add compound index for isActive and createdDate @@ -453,3 +414,4 @@ userProfileSchema.index({ totalTangibleHrs: 1 }); userProfileSchema.index({ bioPosted: 1 }); module.exports = mongoose.model('userProfile', userProfileSchema, 'userProfiles'); +mongoose.model('User', userProfileSchema, 'userProfiles'); diff --git a/src/routes/educatorRoutes.js b/src/routes/educatorRoutes.js new file mode 100644 index 000000000..3f6dc2c35 --- /dev/null +++ b/src/routes/educatorRoutes.js @@ -0,0 +1,9 @@ +const express = require('express'); + +const router = express.Router(); + +const { getTaskSubmissions } = require('../controllers/educationTaskController')(); + +router.get('/task-submissions', getTaskSubmissions); + +module.exports = router; diff --git a/src/startup/routes.js b/src/startup/routes.js index b7d83878d..eb9e31f88 100644 --- a/src/startup/routes.js +++ b/src/startup/routes.js @@ -30,14 +30,12 @@ const hgnFormResponses = require('../models/hgnFormResponse'); const listings = require('../models/lbdashboard/listings'); const biddingHome = require('../models/lbdashboard/biddings'); const village = require('../models/lbdashboard/villages'); -const event = require('../models/event'); const registration = require('../models/registration'); const projectCost = require('../models/bmdashboard/projectCost'); const userPreferences = require('../models/lbdashboard/userPreferences'); const message = require('../models/lbdashboard/message'); const helpCategory = require('../models/helpCategory'); const wishlists = require('../models/lbdashboard/wishlists'); -const popularityTimelineRoutes = require('../routes/popularityTimeline'); const pledgeAnalyticsRoutes = require('../routes/pledgeAnalytics'); const PRReviewInsights = require('../models/prAnalytics/prReviewsInsights'); @@ -63,8 +61,6 @@ const mapLocations = require('../models/mapLocation'); const buildingProject = require('../models/bmdashboard/buildingProject'); const buildingNewLesson = require('../models/bmdashboard/buildingNewLesson'); const metIssue = require('../models/bmdashboard/metIssue'); -const projectStatus = require('../models/bmdashboard/project'); - const { invTypeBase, materialType, @@ -88,12 +84,7 @@ const buildingMaterialModel = require('../models/bmdashboard/buildingMaterial'); const timeOffRequest = require('../models/timeOffRequest'); const followUp = require('../models/followUp'); - -const supplierPerformance = require('../models/summaryDashboard/supplierPerformance'); -const costs = require('../models/costs'); const tag = require('../models/tag'); -const educationTask = require('../models/educationTask'); -const injujrySeverity = require('../models/bmdashboard/injujrySeverity'); const bidoverview_Listing = require('../models/lbdashboard/bidoverview/Listing'); const bidoverview_Bid = require('../models/lbdashboard/bidoverview/Bid'); @@ -108,15 +99,12 @@ const currentWarningsRouter = require('../routes/curentWarningsRouter')(currentW const badgeRouter = require('../routes/badgeRouter')(badge); const dashboardRouter = require('../routes/dashboardRouter')(weeklySummaryAIPrompt); const timeEntryRouter = require('../routes/timeentryRouter')(timeEntry); -const projectStatusRouter = require('../routes/projectStatusRouter')(projectStatus); -const timelogTrackingRouter = require('../routes/timelogTrackingRouter')(); const projectRouter = require('../routes/projectRouter')(project); const informationRouter = require('../routes/informationRouter')(information); const teamRouter = require('../routes/teamRouter')(team); const jobsRouter = require('../routes/jobsRouter'); const laborCostRouter = require('../routes/laborCostRouter'); // const actionItemRouter = require('../routes/actionItemRouter')(actionItem); -// const actionItemRouter = require('../routes/actionItemRouter')(actionItem); const notificationRouter = require('../routes/notificationRouter')(); const loginRouter = require('../routes/loginRouter')(); const forgotPwdRouter = require('../routes/forgotPwdRouter')(userProfile); @@ -124,7 +112,6 @@ const forcePwdRouter = require('../routes/forcePwdRouter')(userProfile); const reportsRouter = require('../routes/reportsRouter')(); const wbsRouter = require('../routes/wbsRouter')(wbs); const taskRouter = require('../routes/taskRouter')(task); -const studentTaskRouter = require('../routes/studentTaskRouter')(); const popupRouter = require('../routes/popupEditorRouter')(popup); const popupBackupRouter = require('../routes/popupEditorBackupRouter')(popupBackup); const taskNotificationRouter = require('../routes/taskNotificationRouter')(taskNotification); @@ -169,25 +156,19 @@ const timeOffRequestRouter = require('../routes/timeOffRequestRouter')( userProfile, ); const followUpRouter = require('../routes/followUpRouter')(followUp); -const communityRouter = require('../routes/communityRouter'); -const costsRouter = require('../routes/costsRouter')(costs); const form = require('../models/forms'); const formResponse = require('../models/formResponse'); const formRouter = require('../routes/formRouter')(form, formResponse); const wastedMaterialRouter = require('../routes/mostWastedRouter'); -const weeklySummariesFilterRouter = require('../routes/weeklySummariesFilterRouter')(); const jobAnalyticsRoutes = require('../routes/jobAnalytics'); -const materialCostRouter = require('../routes/materialCostRouter')(); - // bm dashboard const bmLoginRouter = require('../routes/bmdashboard/bmLoginRouter')(); const bmMaterialsRouter = require('../routes/bmdashboard/bmMaterialsRouter')(buildingMaterial); const bmReusableRouter = require('../routes/bmdashboard/bmReusableRouter')(buildingReusable); const bmProjectRouter = require('../routes/bmdashboard/bmProjectRouter')(buildingProject); - const bmNewLessonRouter = require('../routes/bmdashboard/bmNewLessonRouter')(buildingNewLesson); const injuryCategoryRoutes = require('../routes/bmdashboard/injuryCategoryRouter'); const bmConsumablesRouter = require('../routes/bmdashboard/bmConsumablesRouter')( @@ -224,14 +205,9 @@ const bmToolRouter = require('../routes/bmdashboard/bmToolRouter')(buildingTool, const bmEquipmentRouter = require('../routes/bmdashboard/bmEquipmentRouter')(buildingEquipment); const buildingIssue = require('../models/bmdashboard/buildingIssue'); const bmIssueRouter = require('../routes/bmdashboard/bmIssueRouter')(buildingIssue); -const bmInjuryRouter = require('../routes/bmdashboard/bmInjuryRouter')(injujrySeverity); - const bmExternalTeam = require('../routes/bmdashboard/bmExternalTeamRouter'); const bmActualVsPlannedCostRouter = require('../routes/bmdashboard/bmActualVsPlannedCostRouter'); const bmRentalChart = require('../routes/bmdashboard/bmRentalChartRouter')(); -const bmToolsReturnedLateRouter = require('../routes/bmdashboard/bmToolsReturnedLateRouter')(); -const toolUtilizationRouter = require('../routes/bmdashboard/toolUtilizationRouter')(buildingTool); -const bmToolsDowntimeRouter = require('../routes/bmdashboard/bmToolsDowntimeRouter'); const lbMessageRouter = require('../routes/lbdashboard/messagesRouter')(message); const lbUserPrefRouter = require('../routes/lbdashboard/userPreferencesRouter')( @@ -259,12 +235,8 @@ const blueSquareEmailAssignmentRouter = require('../routes/BlueSquareEmailAssign userProfile, ); // PR Analytics -const prInsightsRouter = require('../routes/prAnalytics/prInsightsRouter')( - PRReviewInsights, - userProfile, -); +const prInsightsRouter = require('../routes/prAnalytics/prInsightsRouter')(PRReviewInsights); -const eventRouter = require('../routes/eventRouter'); const weeklySummaryEmailAssignmentRouter = require('../routes/WeeklySummaryEmailAssignmentRoute')( weeklySummaryEmailAssignment, userProfile, @@ -293,9 +265,6 @@ const cpEventFeedbackRouter = require('../routes/CommunityPortal/eventFeedbackRo const collaborationRouter = require('../routes/collaborationRouter'); -// summary dashboard routes -const supplierPerformanceRouter = require('../routes/summaryDashboard/supplierPerformanceRouter')(); - const registrationRouter = require('../routes/registrationRouter')(registration); const templateRouter = require('../routes/templateRouter'); @@ -305,8 +274,6 @@ const projectMaterialRouter = require('../routes/projectMaterialroutes'); const projectCostRouter = require('../routes/bmdashboard/projectCostRouter')(projectCost); const tagRouter = require('../routes/tagRouter')(tag); -const educationTaskRouter = require('../routes/educationTaskRouter'); -const intermediateTaskRouter = require('../routes/intermediateTaskRouter'); const savedFilterRouter = require('../routes/savedFilterRouter')(savedFilter); // lbdashboard const bidTermsRouter = require('../routes/lbdashboard/bidTermsRouter'); @@ -319,13 +286,9 @@ const SMSRouter = require('../routes/lbdashboard/SMSRouter')(); const applicantVolunteerRatioRouter = require('../routes/applicantVolunteerRatioRouter'); const applicationRoutes = require('../routes/applications'); -const announcementRouter = require('../routes/announcementRouter')(); - -const permissionRouter = require('../routes/permissionRouter'); -const PromotionEligibility = require('../models/promotionEligibility'); - -const promotionEligibilityRouter = require('../routes/promotionEligibilityRouter'); +// Education Portal +const educatorRoutes = require('../routes/educatorRoutes'); module.exports = function (app) { app.use('/api', forgotPwdRouter); @@ -335,19 +298,15 @@ module.exports = function (app) { app.use('/api', userProfileRouter); app.use('/api', dashboardRouter); app.use('/api', timeEntryRouter); - app.use('/api', timelogTrackingRouter); app.use('/api', teamRouter); app.use('/api', wastedMaterialRouter); - app.use('/api/permission-management', permissionRouter(userProfile)); app.use('/api', laborCostRouter); // app.use('/api', actionItemRouter); app.use('/api', notificationRouter); - app.use('/api', announcementRouter); app.use('/api', reportsRouter); app.use('/api', wbsRouter); app.use('/api', taskRouter); - app.use('/api', studentTaskRouter); app.use('/api', popupRouter); app.use('/api', popupBackupRouter); app.use('/api', taskNotificationRouter); @@ -388,25 +347,16 @@ module.exports = function (app) { app.use('/api/questionnaire-analytics/', questionnaireAnalyticsRouter); app.use('/api/applicant-analytics/', applicantAnalyticsRouter); app.use('/api/job-notification-list/', jobNotificationListRouter); - - app.use('/api/projects', projectStatusRouter); - - app.use('/api/hgnHelp', communityRouter()); - app.use('/api/costs', costsRouter); app.use('/api', hoursPledgedRoutes); app.use('/api', templateRouter); app.use('/api/help-categories', helpCategoryRouter); app.use('/api', tagRouter); - app.use('/api/education-tasks', educationTaskRouter); - app.use('/api/educator', intermediateTaskRouter); app.use('/api/analytics', pledgeAnalyticsRoutes); app.use('/api', registrationRouter); app.use('/api/job-analytics', jobAnalyticsRoutes); app.use('/api/applicant-volunteer-ratio', applicantVolunteerRatioRouter); - app.use('/api', weeklySummariesFilterRouter); - app.use('/api/popularity', popularityTimelineRoutes); app.use('/applications', applicationRoutes); // bm dashboard @@ -416,7 +366,6 @@ module.exports = function (app) { app.use('/api/bm', bmProjectRouter); app.use('/api/bm', bmNewLessonRouter); app.use('/api/bm', bmInventoryTypeRouter); - app.use('/api/bm', bmToolsReturnedLateRouter); app.use('/api/bm', bmToolRouter); app.use('/api/bm', bmEquipmentRouter); app.use('/api/bm', bmConsumablesRouter); @@ -436,7 +385,6 @@ module.exports = function (app) { app.use('/api/bm', bmTimeLoggerRouter); app.use('/api/bm/injuries', injuryCategoryRoutes); app.use('/api', toolAvailabilityRouter); - app.use('/api', toolUtilizationRouter); // lb dashboard app.use('/api', toolAvailabilityRouter); @@ -450,10 +398,6 @@ module.exports = function (app) { app.use('/api/labor-cost', bmPaidLaborCostRouter); - app.use('/api/bm', bmTimeLoggerRouter); - app.use('/api/bm', bmIssueRouter); - app.use('/api/bm', bmInjuryRouter); - app.use('/api/lb', bidPropertyRouter); app.use('/api/lb', userBidRouter); @@ -463,8 +407,6 @@ module.exports = function (app) { // lb dashboard app.use('/api/lb', lbListingsRouter); - app.use('/api/bm', bmIssueRouter); - app.use('/api', eventRouter); app.use('/api/villages', require('../routes/lbdashboard/villages')); app.use('/api/lb', lbMessageRouter); app.use('/api/lb', lbUserPrefRouter); @@ -473,16 +415,11 @@ module.exports = function (app) { app.use('/api/lb', biddingRouter); app.use('/api', registrationRouter); - - // summary dashboard - app.use('/api/suppliers', supplierPerformanceRouter); app.use('/api/', projectCostRouter); app.use('/api', toolAvailabilityRoutes); app.use('/api', projectMaterialRouter); app.use('/api/bm', bmRentalChart); - app.use('/api', bmToolsDowntimeRouter); app.use('/api/lb', lbWishlistsRouter); - app.use('/api/', promotionEligibilityRouter(userProfile, timeEntry, task, PromotionEligibility)); // PR Analytics app.use('/api', prInsightsRouter); @@ -498,5 +435,7 @@ module.exports = function (app) { app.use('/api/lb', bidNotificationsRouter); app.use('/api/lb', bidDeadlinesRouter); app.use('/api/lb', SMSRouter); - app.use('/api', materialCostRouter); + + // Education Portal + app.use('/api/educationportal/educator', educatorRoutes); };