testing 127.0.0.1 issue

Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-07-07 13:39:46 +08:00
parent 095a0d4b3c
commit 062f3b7cfa
11 changed files with 262 additions and 123 deletions
+28 -2
View File
@@ -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 ─────────────────────────────────────────────────────────