testing 101

Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-06-30 19:31:45 +08:00
parent 89acdfc239
commit 1372f4e975
62 changed files with 6696 additions and 281 deletions
+30 -2
View File
@@ -124,6 +124,7 @@ const COURSE_LIST_ATTRS = [
"course_id", "uuid", "title", "description",
"course_code", "level", "subscription",
"duration_seconds", "order_index",
"badge_color", "badge_asset_id", "badge_image_url",
];
// Strip correct-answer data before sending quiz questions to the client.
@@ -149,6 +150,22 @@ async function getActiveTier(user_id) {
});
}
// ─── COURSE CATEGORIES (public list for filter chips) ─────────────────────────
exports.getCategories = async (req, res) => {
try {
const rows = await mdl_Category.findAll({
where: { is_active: true },
attributes: ['id', 'name', 'slug'],
order: [['name', 'ASC']],
});
return R.success(res, 'Categories retrieved.', rows);
} catch (err) {
console.error('[CLIENT][COURSES][CATEGORIES]', err);
return R.error(res, 'Could not retrieve categories.', 500);
}
};
// ─── COURSES (all visible, is_locked per user tier) ───────────────────────────
exports.getCourses = async (req, res) => {
@@ -276,6 +293,11 @@ exports.getCourse = async (req, res) => {
"is_required", "passing_score",
"time_limit_minutes", "max_questions",
],
include: [{
model: QuizQuestion, as: "questions",
attributes: ["question_id"],
required: false,
}],
},
],
order: [
@@ -313,7 +335,13 @@ exports.getCourse = async (req, res) => {
where: { assessment_id: plain.assessment.assessment_id, user_id: req.user.user_id, passed: true },
});
is_completed = !!passedAttempt;
plain.assessment = { ...plain.assessment, has_passed: is_completed };
const questionCount = plain.assessment.questions?.length ?? 0;
plain.assessment = {
...plain.assessment,
has_passed: is_completed,
question_count: questionCount,
questions: undefined,
};
}
plain.is_completed = is_completed;
@@ -957,7 +985,7 @@ exports.getCourseByUuid = async (req, res) => {
const { uuid } = req.params;
const course = await Course.findOne({
where: { uuid, ...notDeleted },
attributes: ["course_id", "uuid", "title", "description", "level", "subscription"],
attributes: ["course_id", "uuid", "title", "description", "level", "subscription", "badge_color", "badge_asset_id", "badge_image_url"],
});
if (!course) return R.error(res, "Course not found.", 404);