Skip to content

Commit bb4de91

Browse files
Merge pull request #1892 from OneCommunityGlobal/bhavpreet_taskandError_Hand
Bhavpreet: education portal lesson plan taskand error hand
2 parents 1cd187e + 5ac0276 commit bb4de91

4 files changed

Lines changed: 114 additions & 0 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
const LessonPlanSubmission = require('../../models/lessonPlanner/lessonPlanSubmission');
2+
3+
function isValidUrl(url) {
4+
try {
5+
const parsedUrl = new URL(url);
6+
return true;
7+
} catch {
8+
return false;
9+
}
10+
}
11+
12+
async function submitLessonPlan(req, res) {
13+
const { taskId, link } = req.body;
14+
const studentId = req.user?.id || req.body.studentId;
15+
16+
if (!taskId) return res.status(400).json({ error: 'Task ID is required.' });
17+
if (!studentId) return res.status(400).json({ error: 'Student ID is required.' });
18+
19+
let submissionLink = '';
20+
let fileMeta = {};
21+
22+
if (req.file) {
23+
submissionLink = req.file.originalname;
24+
fileMeta = {
25+
fileName: req.file.originalname,
26+
fileType: req.file.mimetype,
27+
fileSize: req.file.size,
28+
};
29+
} else if (link) {
30+
if (!isValidUrl(link)) {
31+
return res.status(400).json({ error: 'Invalid URL format.' });
32+
}
33+
submissionLink = link;
34+
fileMeta = { fileType: 'link' };
35+
} else {
36+
return res.status(400).json({ error: 'Either file or link is required.' });
37+
}
38+
39+
try {
40+
await LessonPlanSubmission.create({
41+
taskId,
42+
studentId,
43+
submissionLink,
44+
status: 'Submitted',
45+
submissionTime: new Date(),
46+
...fileMeta,
47+
});
48+
res.json({ message: 'Submission successful.' });
49+
} catch (err) {
50+
res.status(500).json({ error: 'Failed to save submission.', details: err.message });
51+
}
52+
}
53+
54+
const controller = {
55+
submitLessonPlan,
56+
isValidUrl,
57+
};
58+
59+
module.exports = controller;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const mongoose = require('mongoose');
2+
3+
const lessonPlanSubmissionSchema = new mongoose.Schema({
4+
taskId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'Task' },
5+
studentId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User' },
6+
submissionLink: { type: String, required: true },
7+
status: { type: String, enum: ['Submitted'], default: 'Submitted' },
8+
submissionTime: { type: Date, default: Date.now },
9+
fileName: { type: String },
10+
fileType: { type: String },
11+
fileSize: { type: Number },
12+
version: { type: Number, default: 1 },
13+
});
14+
15+
module.exports = mongoose.model('LessonPlanSubmission', lessonPlanSubmissionSchema);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const express = require('express');
2+
const multer = require('multer');
3+
const controller = require('../../controllers/lessonPlaner/lessonPlanSubmissionController');
4+
5+
const router = express.Router();
6+
7+
const allowedTypes = ['.pdf', '.docx', '.txt', '.png', '.jpg', '.jpeg'];
8+
const maxSize = 10 * 1024 * 1024;
9+
10+
const storage = multer.memoryStorage();
11+
const upload = multer({
12+
storage,
13+
limits: { fileSize: maxSize },
14+
fileFilter: (req, file, cb) => {
15+
const ext = require('path').extname(file.originalname).toLowerCase();
16+
if (!allowedTypes.includes(ext)) {
17+
return cb(new Error('Unsupported file type. Allowed: ' + allowedTypes.join(', ')), false);
18+
}
19+
cb(null, true);
20+
},
21+
});
22+
23+
router.post('/submit', upload.single('file'), async (req, res) => {
24+
try {
25+
await controller.submitLessonPlan(req, res);
26+
} catch (err) {
27+
res.status(400).json({
28+
error: err.message || 'Unknown error during submission.',
29+
code: err.code || 'UPLOAD_ERROR',
30+
});
31+
}
32+
});
33+
34+
module.exports = router;

src/startup/routes.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,10 @@ const PromotionEligibility = require('../models/promotionEligibility');
329329

330330
const promotionEligibilityRouter = require('../routes/promotionEligibilityRouter');
331331

332+
// lesson planner router
333+
334+
const lessonPlanSubmissionRouter = require('../routes/lessonPlanner/lessonPlanSubmissionRouter');
335+
332336
module.exports = function (app) {
333337
app.use('/api', forgotPwdRouter);
334338
app.use('/api', loginRouter);
@@ -502,4 +506,6 @@ module.exports = function (app) {
502506
app.use('/api/lb', bidDeadlinesRouter);
503507
app.use('/api/lb', SMSRouter);
504508
app.use('/api', materialCostRouter);
509+
510+
app.use('/api/lp', lessonPlanSubmissionRouter);
505511
};

0 commit comments

Comments
 (0)