mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user