/*********************************************************************************************************************************************************************** * File Name: units.routes.js (admin) * Type of Program: Router * Description: Standalone Unit library — Units run independently of Courses. * Course membership (attach/detach/reorder) stays under * /admin/courses/:courseId/units. * * Author: Kenneth Obsequio (@lash0000) * Date Created: Jul. 7, 2026 ***********************************************************************************************************************************************************************/ const router = require("express").Router(); const ctrl = require("../../controllers/admin/units.controller"); const questionCtrl = require("../../controllers/admin/courses.controller"); // shared quiz-question handlers (keyed by quizId) const requirementsCtrl = require("../../controllers/admin/completion_requirements.controller"); // Guards are applied by admin.routes.js (authenticate → requireAdmin → adminLimiter) // ── static segments first ───────────────────────────────────────────────────── router.get("/", ctrl.getUnits); router.post("/", ctrl.createUnit); router.post("/full", ctrl.createUnitFull); router.get("/flat", ctrl.getUnitsFlat); router.get("/field-values", ctrl.getUnitFieldValues); router.delete("/bulk", ctrl.bulkArchiveUnits); router.delete("/bulk/permanent", ctrl.bulkPermanentlyDeleteUnits); router.get("/archives", ctrl.getArchivedUnits); router.patch("/restore/bulk", ctrl.bulkRestoreUnits); router.get("/archives/:unitId", ctrl.getArchivedUnit); // ── then :unitId ────────────────────────────────────────────────────────────── router.patch("/:unitId/restore", ctrl.restoreUnit); router.get("/:unitId/archive-impact", ctrl.getUnitArchiveImpact); router.get("/:unitId/permanent-delete-impact", ctrl.getUnitPermanentDeleteImpact); router.get("/:unitId", ctrl.getUnit); router.put("/:unitId", ctrl.updateUnit); router.delete("/:unitId", ctrl.archiveUnit); router.delete("/:unitId/permanent", ctrl.permanentlyDeleteUnit); // ── Completion requirements (shared with the nested courses.routes.js mount) ── router.get("/:unitId/requirements", requirementsCtrl.getUnitRequirements); router.put("/:unitId/requirements", requirementsCtrl.syncUnitRequirements); // ── Lesson membership (attach / detach / reorder) ───────────────────────────── router.post("/:unitId/lessons", ctrl.attachLessons); router.put("/:unitId/lessons/order", ctrl.reorderLessons); router.delete("/:unitId/lessons/:lessonId", ctrl.detachLesson); // ── Unit quiz (travels with the Unit) ───────────────────────────────────────── router.get("/:unitId/quiz", ctrl.getQuiz); router.post("/:unitId/quiz", ctrl.createQuiz); router.get("/:unitId/quiz/archives", ctrl.getArchivedQuiz); router.patch("/:unitId/quiz/:quizId", ctrl.updateQuiz); router.delete("/:unitId/quiz/:quizId", ctrl.deleteQuiz); router.patch("/:unitId/quiz/:quizId/restore", ctrl.restoreQuiz); // ── Quiz questions (shared handlers — keyed by quizId only) ─────────────────── router.get("/:unitId/quiz/:quizId/questions", questionCtrl.getQuestions); router.post("/:unitId/quiz/:quizId/questions", questionCtrl.createQuestion); router.delete("/:unitId/quiz/:quizId/questions/bulk", questionCtrl.bulkArchiveQuestions); router.patch("/:unitId/quiz/:quizId/questions/restore/bulk", questionCtrl.bulkRestoreQuestions); router.put("/:unitId/quiz/:quizId/questions/bulk-sync", questionCtrl.bulkSyncQuestions); router.get("/:unitId/quiz/:quizId/questions/archives/:questionId", questionCtrl.getArchivedQuestion); router.patch("/:unitId/quiz/:quizId/questions/:questionId", questionCtrl.updateQuestion); router.delete("/:unitId/quiz/:quizId/questions/:questionId", questionCtrl.deleteQuestion); router.patch("/:unitId/quiz/:quizId/questions/:questionId/restore", questionCtrl.restoreQuestion); // ── Quiz completions ────────────────────────────────────────────────────────── router.get("/:unitId/quiz/:quizId/completions", questionCtrl.getQuizCompletions); module.exports = router;