const express = require("express"); const { body } = require("express-validator"); const { validate } = require("../middleware/validate"); const { requireAuth, requireRole } = require("../middleware/auth"); const { upload } = require("../middleware/upload"); const ctrl = require("../controllers/admin.controller"); const contentCtrl = require("../controllers/content.controller"); const voucherCtrl = require("../controllers/voucher.controller"); const router = express.Router(); router.use(requireAuth, requireRole("admin")); router.get("/dashboard", ctrl.dashboardStats); router.get("/users", ctrl.listUsers); router.get("/orders", ctrl.listOrders); router.get("/orders/:id", ctrl.getOrderDetail); router.post("/orders/:id/confirm", ctrl.confirmOrder); router.post( "/orders/:id/reject", [body("reason").optional({ nullable: true }).trim().isLength({ max: 500 })], validate, ctrl.rejectOrder ); // --- Course content management (admin-only; only admins may ever // upload or modify study materials, per course requirements) ---------- router.get("/courses/:id/curriculum", contentCtrl.getCourseCurriculumForAdmin); router.post( "/courses/:id/sections", [body("title").trim().isLength({ min: 1, max: 200 })], validate, contentCtrl.createSection ); router.put("/courses/:id/sections/:sectionId", contentCtrl.updateSection); router.delete("/courses/:id/sections/:sectionId", contentCtrl.deleteSection); router.post( "/courses/:id/sections/:sectionId/lessons", upload.single("file"), [body("title").trim().isLength({ min: 1, max: 200 })], validate, contentCtrl.uploadLesson ); router.put("/courses/:id/sections/:sectionId/lessons/:lessonId", contentCtrl.updateLesson); router.delete("/courses/:id/sections/:sectionId/lessons/:lessonId", contentCtrl.deleteLesson); router.post("/courses/:id/thumbnail", upload.single("file"), contentCtrl.uploadThumbnail); // --- Vouchers: admins issue free-access codes for a specific course ---- router.get("/vouchers", voucherCtrl.listVouchers); router.get("/vouchers/:id", voucherCtrl.getVoucher); router.post( "/vouchers", [ body("courseId").isMongoId().withMessage("A valid course must be selected."), body("code").optional({ nullable: true }).trim().isLength({ min: 3, max: 40 }), body("maxRedemptions").optional({ nullable: true }).isInt({ min: 1, max: 10000 }), body("restrictedToEmails").optional({ nullable: true }).isArray(), body("restrictedToEmails.*").optional().isEmail(), body("expiresAt").optional({ nullable: true }).isISO8601(), body("note").optional({ nullable: true }).trim().isLength({ max: 500 }), ], validate, voucherCtrl.createVoucher ); router.post("/vouchers/:id/deactivate", voucherCtrl.deactivateVoucher); router.post("/vouchers/:id/reactivate", voucherCtrl.reactivateVoucher); module.exports = router;