Spaces:
Running
Running
Download src/routes/admin.routes.js from AndreaNotes1/auth-app-api: direct link, hf CLI and curl.
- Browser
- Download file 2.91 kB
-
https://huggingface.co/spaces/AndreaNotes1/auth-app-api/resolve/main/src/routes/admin.routes.js
- Command line
-
hf download hf://spaces/AndreaNotes1/auth-app-api/src/routes/admin.routes.js
-
curl -L -o admin.routes.js https://huggingface.co/spaces/AndreaNotes1/auth-app-api/resolve/main/src/routes/admin.routes.js
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; | |