Skip to content

Commit 0c40110

Browse files
authored
Merge pull request #10 from Kuzuri247/test
feat: implement core modules for homework, timetable, payments, and staff routing with new frontend dashboard pages and initial database migrations
2 parents 5e10c08 + 03e724c commit 0c40110

15 files changed

Lines changed: 1590 additions & 335 deletions

backend/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ app.use("/api/payments", paymentsRouter);
6161
app.use("/api/marks", require("./modules/marks/marks.routes"));
6262
app.use("/api/attendance", require("./modules/attendance/attendance.routes"));
6363
app.use("/api/homework", require("./modules/homework/homework.routes"));
64-
app.use("/api/timetable", require("./modules/academics/timetable.route"));
64+
app.use("/api/v1/timetable", require("./modules/timetable/timetable.routes"));
65+
app.use("/api/timetable", require("./modules/timetable/timetable.routes"));
6566
app.use("/api/teacher", require("./modules/academics/teacher.route"));
6667
app.use("/api/transport", require("./modules/transport/transport.routes"));
6768
app.use("/api/reports", require("./modules/reports/reports.route"));
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
-- 010_timetable_breaks.sql
2-
ALTER TABLE timetables
3-
ADD COLUMN is_break TINYINT(1) DEFAULT 0 AFTER end_time;
2+
ALTER TABLE timetables MODIFY COLUMN subject_id INT NULL;
3+
ALTER TABLE timetables ADD COLUMN IF NOT EXISTS is_break TINYINT(1) DEFAULT 0 AFTER end_time;

backend/modules/homework/homework.routes.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,14 @@ router.put('/status', verifyToken, authorize(ROLES.STUDENT), async (req, res) =>
138138
// Teacher or Admin deletes homework
139139
router.delete('/:id', verifyToken, authorize(ROLES.TEACHER, ROLES.ADMIN, ROLES.SUPER_ADMIN), async (req, res) => {
140140
try {
141-
await svc.deleteHomework(req.params.id);
141+
const teacherUserId = req.user.role === ROLES.TEACHER ? req.user.id : null;
142+
const affected = await svc.deleteHomework(req.params.id, teacherUserId);
143+
if (affected === 0) {
144+
if (req.user.role === ROLES.TEACHER) {
145+
return res.status(403).json({ success: false, message: 'Not authorized to delete this homework assignment or homework not found' });
146+
}
147+
return res.status(404).json({ success: false, message: 'Homework not found' });
148+
}
142149
res.json({ success: true, message: 'Homework deleted successfully' });
143150
} catch (err) {
144151
res.status(500).json({ success: false, message: err.message });

backend/modules/homework/homework.service.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,15 @@ const listAllForAdmin = async () => {
114114
return rows;
115115
};
116116

117-
const deleteHomework = async (homeworkId) => {
118-
await pool.query('DELETE FROM homework WHERE id = ?', [homeworkId]);
117+
const deleteHomework = async (homeworkId, teacherUserId = null) => {
118+
let query = 'DELETE FROM homework WHERE id = ?';
119+
let params = [homeworkId];
120+
if (teacherUserId) {
121+
query += ' AND assigned_by = ?';
122+
params.push(teacherUserId);
123+
}
124+
const [result] = await pool.query(query, params);
125+
return result.affectedRows;
119126
};
120127

121128
module.exports = {

backend/modules/payments/payments.route.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ router.post('/create-order',
3333
);
3434

3535
// POST /api/payments/verify - Verify Razorpay payment signature
36-
router.post('/verify', verifyToken, async (req, res) => {
36+
router.post('/verify', verifyToken, authorize(...canCreateOrder), async (req, res) => {
3737
try {
38-
const result = await svc.verifyPayment(req.body);
38+
const result = await svc.verifyPayment(req.body, req.user);
3939
res.json({ success: true, data: result });
4040
} catch (err) {
4141
res.status(err.status || 500).json({ success: false, message: err.message });

backend/modules/payments/payments.service.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,27 @@ const createOrder = async (feeRecordId, createdByUserId) => {
6161
};
6262
};
6363

64-
const verifyPayment = async ({
65-
razorpay_order_id,
66-
razorpay_payment_id,
67-
razorpay_signature,
68-
}) => {
64+
const verifyPayment = async (
65+
{ razorpay_order_id, razorpay_payment_id, razorpay_signature },
66+
user = null
67+
) => {
6968
const secret = process.env.RAZORPAY_KEY_SECRET;
7069
if (!secret) {
7170
throw Object.assign(new Error("Razorpay Secret is not configured"), { status: 500 });
7271
}
72+
73+
if (user && user.role === "student") {
74+
const [[orderInfo]] = await pool.query(
75+
`SELECT ro.student_id FROM razorpay_orders ro
76+
JOIN students s ON ro.student_id = s.id
77+
WHERE ro.razorpay_order_id = ? AND s.user_id = ?`,
78+
[razorpay_order_id, user.id]
79+
);
80+
if (!orderInfo) {
81+
throw Object.assign(new Error("Unauthorized: Cannot verify payment for another student"), { status: 403 });
82+
}
83+
}
84+
7385
const expectedSignature = crypto
7486
.createHmac("sha256", secret)
7587
.update(`${razorpay_order_id}|${razorpay_payment_id}`)

backend/modules/staff/teacherAssignment.routes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ router.get('/my-assignments', verifyToken, authorize(ROLES.TEACHER), async (req,
3535
});
3636

3737
// Admin/Super Admin view of all teachers + assignments
38-
router.get('/all', verifyToken, authorize(...canManage, ROLES.SUPER_ADMIN), async (req, res) => {
38+
router.get('/all', verifyToken, authorize(...canManage), async (req, res) => {
3939
const rows = await svc.listAllTeachersWithAssignments();
4040
res.json({ success: true, data: rows });
4141
});

0 commit comments

Comments
 (0)