mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
testing 127.0.0.1 issue
Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
@@ -12,6 +12,9 @@
|
||||
* Derivation rules:
|
||||
* unit → completed when ALL its non-deleted lessons have a completed row for this user
|
||||
* course → completed when ALL its non-deleted units have a completed row for this user
|
||||
* AND, if the course has a course assessment, the user has passed it.
|
||||
* A course with no assessment built yet can never reach 'completed' here —
|
||||
* reading alone isn't course completion.
|
||||
*
|
||||
* Author: Kenneth Obsequio (@lash0000)
|
||||
* Date Created: Jun. 21, 2026
|
||||
@@ -22,6 +25,24 @@ const sequelize = require('../config/db.config');
|
||||
const CourseReadingProgress = require('../models/courses/course_reading_progress.mdl');
|
||||
const Lesson = require('../models/courses/lessons.mdl');
|
||||
const Unit = require('../models/courses/units.mdl');
|
||||
const CourseAssessment = require('../models/courses/course_assessment.mdl');
|
||||
const QuizAttempt = require('../models/courses/quiz_attempt.mdl');
|
||||
|
||||
// A course only counts as fully complete once it has a built assessment AND the user passed it.
|
||||
async function hasPassedCourseAssessment(userId, courseId, t) {
|
||||
const assessment = await CourseAssessment.findOne({
|
||||
where: { course_id: courseId },
|
||||
attributes: ['assessment_id'],
|
||||
transaction: t,
|
||||
});
|
||||
if (!assessment) return false;
|
||||
|
||||
const passedAttempt = await QuizAttempt.findOne({
|
||||
where: { user_id: userId, assessment_id: assessment.assessment_id, passed: true },
|
||||
transaction: t,
|
||||
});
|
||||
return !!passedAttempt;
|
||||
}
|
||||
|
||||
// ─── Core UPSERT ─────────────────────────────────────────────────────────────
|
||||
|
||||
@@ -74,7 +95,8 @@ async function deriveUnitStatus(userId, courseId, unitId, t) {
|
||||
return completedCount === lessons.length ? 'completed' : 'in_progress';
|
||||
}
|
||||
|
||||
// Course is completed when every non-deleted unit under it has a completed row for this user.
|
||||
// Course is completed when every non-deleted unit under it has a completed row for this user
|
||||
// AND the course's assessment (if one has been built) has been passed by this user.
|
||||
async function deriveCourseStatus(userId, courseId, t) {
|
||||
const units = await Unit.findAll({
|
||||
where: { course_id: courseId },
|
||||
@@ -95,7 +117,11 @@ async function deriveCourseStatus(userId, courseId, t) {
|
||||
transaction: t,
|
||||
});
|
||||
|
||||
return completedCount === units.length ? 'completed' : 'in_progress';
|
||||
const allUnitsRead = completedCount === units.length;
|
||||
if (!allUnitsRead) return 'in_progress';
|
||||
|
||||
const assessmentPassed = await hasPassedCourseAssessment(userId, courseId, t);
|
||||
return assessmentPassed ? 'completed' : 'in_progress';
|
||||
}
|
||||
|
||||
// ─── Main entry point ─────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user