auth-app-api / src /routes /admin.routes.js
AndreaNotes1's picture
Upload 46 files
4c6b1e8 verified
Raw History Blame Contribute Delete
2.91 kB
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;