mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
@@ -23,7 +23,7 @@ const {
|
||||
CoursePrerequisite, CourseAssessment,
|
||||
UnitQuiz, QuizQuestion, QuizOption,
|
||||
QuizAttempt, AssessmentSession,
|
||||
CourseInstructor,
|
||||
CourseInstructor, CourseAchievement,
|
||||
} = require("../../models/courses/courses.associations");
|
||||
|
||||
const mdl_Users = require("../../models/users/users.mdl");
|
||||
@@ -100,6 +100,8 @@ exports.createCourse = async (req, res) => {
|
||||
course_code, level, subscription,
|
||||
objectives = [],
|
||||
category_ids = [],
|
||||
achievement_keys = [],
|
||||
badge_color, badge_asset_id, badge_image_url,
|
||||
createdBy,
|
||||
} = req.body;
|
||||
|
||||
@@ -107,18 +109,28 @@ exports.createCourse = async (req, res) => {
|
||||
|
||||
const course = await Course.create({
|
||||
title,
|
||||
description: description ?? null,
|
||||
order_index: order_index ?? 0,
|
||||
course_code: course_code ?? null,
|
||||
level: level ?? null,
|
||||
subscription: subscription ?? "free",
|
||||
description: description ?? null,
|
||||
order_index: order_index ?? 0,
|
||||
course_code: course_code ?? null,
|
||||
level: level ?? null,
|
||||
subscription: subscription ?? "free",
|
||||
duration_seconds: 0,
|
||||
createdBy: createdBy ?? null,
|
||||
badge_color: badge_color ?? "purple",
|
||||
badge_asset_id: badge_asset_id ?? null,
|
||||
badge_image_url: badge_image_url ?? null,
|
||||
createdBy: createdBy ?? null,
|
||||
}, { transaction: t });
|
||||
|
||||
await syncObjectivesCreate(CourseObjective, "course_id", course.course_id, objectives, t);
|
||||
await syncJunction(CourseProductCat, course.course_id, category_ids, "category_id", t);
|
||||
|
||||
if (achievement_keys.length) {
|
||||
await CourseAchievement.bulkCreate(
|
||||
achievement_keys.slice(0, 3).map((key, i) => ({ course_id: course.course_id, achievement_key: key, order_index: i })),
|
||||
{ transaction: t },
|
||||
);
|
||||
}
|
||||
|
||||
await t.commit();
|
||||
logActivity(req.user?.user_id, 'create_course', { entityType: 'course', entityId: course.course_id, details: { title: course.title } });
|
||||
return R.success(res, "Course created.", { data: course }, 201);
|
||||
@@ -140,6 +152,7 @@ exports.updateCourse = async (req, res) => {
|
||||
title, description, order_index,
|
||||
course_code, level, subscription,
|
||||
objectives, category_ids,
|
||||
badge_color, badge_asset_id, badge_image_url,
|
||||
updatedBy,
|
||||
} = req.body;
|
||||
|
||||
@@ -149,6 +162,9 @@ exports.updateCourse = async (req, res) => {
|
||||
if (course_code !== undefined) course.course_code = course_code;
|
||||
if (level !== undefined) course.level = level;
|
||||
if (subscription !== undefined) course.subscription = subscription;
|
||||
if (badge_color !== undefined) course.badge_color = badge_color;
|
||||
if (badge_asset_id !== undefined) course.badge_asset_id = badge_asset_id;
|
||||
if (badge_image_url !== undefined) course.badge_image_url = badge_image_url;
|
||||
course.updatedBy = updatedBy ?? null;
|
||||
await course.save({ transaction: t });
|
||||
|
||||
@@ -1760,3 +1776,52 @@ exports.getAssessmentSessions = async (req, res) => {
|
||||
return R.error(res, "Could not retrieve assessment sessions.", 500);
|
||||
}
|
||||
};
|
||||
|
||||
// ══════════════════════════════════════════════════════════════════════════════
|
||||
// COURSE ACHIEVEMENTS
|
||||
// ══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
exports.getCourseAchievements = async (req, res) => {
|
||||
try {
|
||||
const { courseId } = req.params;
|
||||
const rows = await CourseAchievement.findAll({
|
||||
where: { course_id: courseId },
|
||||
order: [["order_index", "ASC"]],
|
||||
});
|
||||
return R.success(res, "Course achievements retrieved.", { data: rows });
|
||||
} catch (err) {
|
||||
console.error("[COURSE][ACHIEVEMENTS][GET]", err);
|
||||
return R.error(res, "Could not retrieve course achievements.", 500);
|
||||
}
|
||||
};
|
||||
|
||||
exports.syncCourseAchievements = async (req, res) => {
|
||||
const t = await sequelize.transaction();
|
||||
try {
|
||||
const { courseId } = req.params;
|
||||
const { achievement_keys = [] } = req.body;
|
||||
|
||||
if (achievement_keys.length > 3)
|
||||
return R.error(res, "Maximum 3 achievements allowed per course.", 400);
|
||||
|
||||
await CourseAchievement.destroy({ where: { course_id: courseId }, transaction: t });
|
||||
|
||||
if (achievement_keys.length) {
|
||||
await CourseAchievement.bulkCreate(
|
||||
achievement_keys.map((key, i) => ({ course_id: courseId, achievement_key: key, order_index: i })),
|
||||
{ transaction: t },
|
||||
);
|
||||
}
|
||||
|
||||
await t.commit();
|
||||
const rows = await CourseAchievement.findAll({
|
||||
where: { course_id: courseId },
|
||||
order: [["order_index", "ASC"]],
|
||||
});
|
||||
return R.success(res, "Course achievements updated.", { data: rows });
|
||||
} catch (err) {
|
||||
await t.rollback();
|
||||
console.error("[COURSE][ACHIEVEMENTS][SYNC]", err);
|
||||
return R.error(res, "Could not update course achievements.", 500);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user