added new requirements for lessons and units

Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-07-15 16:26:09 +08:00
parent b7d62b3b18
commit 9c82b0de09
25 changed files with 1569 additions and 233 deletions
+28
View File
@@ -37,6 +37,8 @@ const {
UnitQuiz, QuizQuestion, QuizOption,
UnitReadingProgress, LessonReadingProgress,
} = require("../../models/courses/courses.associations");
const CompletionRequirement = require("../../models/courses/completion_requirement.mdl");
const { VALID_ENTITY_TYPES } = require("../../utils/courses/completion_requirements.registry");
const mdl_Users = require("../../models/users/users.mdl");
@@ -248,6 +250,17 @@ exports.createUnitFull = async (req, res) => {
if (lessonInput.blocks?.length > CREATE_UNIT_FULL_LIMITS.maxBlocks) {
return R.error(res, `A lesson page can have at most ${CREATE_UNIT_FULL_LIMITS.maxBlocks} blocks.`, 400);
}
if (lessonInput.requirements !== undefined) {
if (!Array.isArray(lessonInput.requirements)) return R.error(res, "Lesson requirements must be a list.", 400);
const seenTypes = new Set();
for (const r of lessonInput.requirements) {
const allowedEntityTypes = VALID_ENTITY_TYPES[r.type];
if (!allowedEntityTypes) return R.error(res, `Unknown requirement type "${r.type}".`, 400);
if (!allowedEntityTypes.includes("lesson")) return R.error(res, `"${r.type}" cannot be configured on a lesson.`, 400);
if (seenTypes.has(r.type)) return R.error(res, `Duplicate "${r.type}" requirement — only one per lesson is allowed.`, 400);
seenTypes.add(r.type);
}
}
}
const by = createdBy ?? req.user?.user_id ?? null;
@@ -278,6 +291,21 @@ exports.createUnitFull = async (req, res) => {
await syncObjectivesCreate(LessonObjective, "lesson_id", lesson.lesson_id, lessonInput.objectives ?? [], t);
if (lessonInput.requirements?.length) {
const rows = lessonInput.requirements.map((r, ri) => ({
entity_type: "lesson",
entity_id: lesson.lesson_id,
type: r.type,
order: r.order ?? ri,
min_percent: r.type === "watch_percent" ? (r.min_percent ?? 100) : null,
button_label: r.type === "manual_complete" ? (r.button_label || null) : null,
is_required: r.is_required ?? true,
createdBy: by,
updatedBy: by,
}));
await CompletionRequirement.bulkCreate(rows, { transaction: t });
}
await UnitLesson.create({
unit_id: unit.unit_id,
lesson_id: lesson.lesson_id,