const router = require("express").Router(); const controller = require("../../controllers/admin/task.controller"); const completionController = require("../../controllers/admin/task_completion.controller"); const { sensitiveOpsLimiter } = require("../../middleware/rateLimiter.middleware"); // NOTE on rate limiting: every route below already sits behind adminLimiter // (200 req/15min per admin user — applied blanket-wide in admin.routes.js). // sensitiveOpsLimiter (10 req/hour, ALSO keyed per admin user and shared // across every route it's attached to) is reserved for genuinely irreversible // actions — permanent delete — so routine CRUD doesn't compete with those for // the same tight budget. // ─── Task Lists ─────────────────────────────────────────────────────────────── router.get("/", controller.getTaskLists); router.get("/archived", controller.getArchivedTaskLists); router.get("/field-values", controller.getTaskListFieldValues); router.post("/", controller.createTaskList); router.post("/bulk-archive", controller.bulkArchiveTaskLists); router.post("/bulk-restore", controller.bulkRestoreTaskLists); router.post("/bulk-delete", sensitiveOpsLimiter, controller.bulkPermanentlyDeleteTaskLists); // ─── Task List (single) ─────────────────────────────────────────────────────── router.get("/:taskListId", controller.getTaskList); router.get("/:taskListId/permanent-delete-impact", controller.getTaskListPermanentDeleteImpact); router.patch("/:taskListId", controller.updateTaskList); router.delete("/:taskListId", controller.archiveTaskList); router.delete("/:taskListId/permanent", sensitiveOpsLimiter, controller.permanentlyDeleteTaskList); router.patch("/:taskListId/restore", controller.restoreTaskList); // ─── Task List Groups ───────────────────────────────────────────────────────── router.get("/:taskListId/groups", controller.getTaskListGroups); router.put("/:taskListId/groups", controller.syncGroups); router.post("/:taskListId/groups/assign", controller.assignGroups); router.post("/:taskListId/groups/unassign", controller.unassignGroups); // ─── Tasks (nested under task-list) ────────────────────────────────────────── router.get("/:taskListId/tasks", controller.getTasks); router.get("/:taskListId/tasks/archived", controller.getArchivedTasks); router.get("/:taskListId/tasks/field-values", controller.getTaskFieldValues); router.get("/:taskListId/tasks/requirement-completion-check", controller.checkRequirementCompletion); router.post("/:taskListId/tasks", controller.createTask); router.post("/:taskListId/tasks/bulk", controller.createTasksBulk); router.post("/:taskListId/tasks/bulk-archive", controller.bulkArchiveTasks); router.post("/:taskListId/tasks/bulk-restore", controller.bulkRestoreTasks); router.post("/:taskListId/tasks/bulk-delete", sensitiveOpsLimiter, controller.bulkPermanentlyDeleteTasks); router.patch("/:taskListId/tasks/order", controller.reorderTasks); // ─── Tasks (single) ─────────────────────────────────────────────────────────── router.get("/:taskListId/tasks/:taskId", controller.getTask); router.patch("/:taskListId/tasks/:taskId", controller.updateTask); router.delete("/:taskListId/tasks/:taskId", controller.archiveTask); router.delete("/:taskListId/tasks/:taskId/permanent", sensitiveOpsLimiter, controller.permanentlyDeleteTask); router.patch("/:taskListId/tasks/:taskId/restore", controller.restoreTask); // ─── Completions (nested under task) ───────────────────────────────────────── router.get("/:taskListId/tasks/:taskId/completions", completionController.getCompletions); router.get("/:taskListId/tasks/:taskId/completions/user/:userId", completionController.getCompletionsByUser); router.post("/:taskListId/tasks/:taskId/completions/bulk-archive", completionController.bulkArchiveCompletions); router.post("/:taskListId/tasks/:taskId/completions/bulk-restore", completionController.bulkRestoreCompletions); router.get("/:taskListId/tasks/:taskId/completions/:completionId", completionController.getCompletion); router.patch("/:taskListId/tasks/:taskId/completions/:completionId/review", completionController.reviewSubmission); router.delete("/:taskListId/tasks/:taskId/completions/:completionId", completionController.archiveCompletion); router.patch("/:taskListId/tasks/:taskId/completions/:completionId/restore", completionController.restoreCompletion); module.exports = router;