From 157b2002498fbad28218e9ae801468abb6995581 Mon Sep 17 00:00:00 2001 From: elangptra Date: Thu, 10 Oct 2024 10:31:44 +0700 Subject: [PATCH] refactor: level model --- controllers/contentControllers/level.js | 64 +++++++++++++++++-------- controllers/usersControllers/user.js | 2 +- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/controllers/contentControllers/level.js b/controllers/contentControllers/level.js index 36f0952..316bb8b 100644 --- a/controllers/contentControllers/level.js +++ b/controllers/contentControllers/level.js @@ -272,6 +272,7 @@ export const getLevelsByTopicId = async (req, res) => { .json({ message: "No levels found for the given topic." }); } + // Mencari pembelajaran terakhir yang selesai const lastCompletedLearning = await models.StdLearning.findOne({ where: { ID: ID, @@ -287,23 +288,29 @@ export const getLevelsByTopicId = async (req, res) => { order: [["STUDENT_FINISH", "DESC"]], }); - const nextLearningLevel = lastCompletedLearning?.NEXT_LEARNING - ? await models.Level.findOne({ - where: { - ID_LEVEL: lastCompletedLearning.NEXT_LEARNING, - IS_DELETED: 0, - }, - attributes: ["ID_LEVEL", "NAME_LEVEL"], - }) - : null; + let currentLearningLevel = null; + // Jika ada pembelajaran yang selesai, kita dapat memeriksa level berikutnya dari NEXT_LEARNING + if (lastCompletedLearning?.NEXT_LEARNING) { + currentLearningLevel = await models.Level.findOne({ + where: { + ID_LEVEL: lastCompletedLearning.NEXT_LEARNING, + IS_DELETED: 0, + }, + attributes: ["ID_LEVEL", "NAME_LEVEL"], + }); + } + + const nextLearningLevel = currentLearningLevel; + + // Memasukkan level berikutnya (jika ada) ke dalam UNLOCKED_LEVELS const unlockedLevels = lastCompletedLearning ? await models.Level.findAll({ where: { ID_TOPIC: idTopic, IS_DELETED: 0, [models.Op.or]: [ - { NAME_LEVEL: { [models.Op.lt]: nextLearningLevel.NAME_LEVEL } }, + { NAME_LEVEL: { [models.Op.lt]: nextLearningLevel?.NAME_LEVEL } }, { NAME_LEVEL: "Pretest" }, ], }, @@ -312,6 +319,13 @@ export const getLevelsByTopicId = async (req, res) => { }) : [{ NAME_LEVEL: "Pretest" }]; + const unlockedLevelNames = unlockedLevels.map((lvl) => lvl.NAME_LEVEL); + + // Menambahkan level berikutnya ke dalam UNLOCKED_LEVELS jika belum termasuk + if (nextLearningLevel && !unlockedLevelNames.includes(nextLearningLevel.NAME_LEVEL)) { + unlockedLevelNames.push(nextLearningLevel.NAME_LEVEL); + } + const levelsWithScore = levels.map((level) => { const SCORE = level.stdLearning && level.stdLearning.length > 0 @@ -330,13 +344,25 @@ export const getLevelsByTopicId = async (req, res) => { delete levelJSON.levelTopic; delete levelJSON.levelTopic?.topicSection; - return { - NAME_SECTION, - NAME_TOPIC, - ...levelJSON, - ID_STUDENT_LEARNING, - SCORE, - }; + const isUnlocked = unlockedLevelNames.includes(levelJSON.NAME_LEVEL); + + if (isUnlocked) { + return { + NAME_SECTION, + NAME_TOPIC, + ...levelJSON, + ID_STUDENT_LEARNING, + SCORE, + IS_PRETEST: levelJSON.NAME_LEVEL === "Pretest" ? 1 : 0, + }; + } else { + return { + ID_LEVEL: levelJSON.ID_LEVEL, + NAME_LEVEL: levelJSON.NAME_LEVEL, + IS_PRETEST: levelJSON.NAME_LEVEL === "Pretest" ? 1 : 0, + SCORE, + }; + } }); const sortedLevels = levelsWithScore.sort((a, b) => { @@ -361,10 +387,10 @@ export const getLevelsByTopicId = async (req, res) => { ? nextLearningLevel.NAME_LEVEL : null, FINISHED_AT: lastCompletedLearning.STUDENT_FINISH, - UNLOCKED_LEVELS: unlockedLevels.map((lvl) => lvl.NAME_LEVEL), + UNLOCKED_LEVELS: unlockedLevelNames, } : { - UNLOCKED_LEVELS: ["Pretest"], + UNLOCKED_LEVELS: unlockedLevelNames, }, levels: sortedLevels, }; diff --git a/controllers/usersControllers/user.js b/controllers/usersControllers/user.js index fe6d680..19e8ec3 100644 --- a/controllers/usersControllers/user.js +++ b/controllers/usersControllers/user.js @@ -119,9 +119,9 @@ export const getStudents = async (req, res) => { const formattedStudents = students.map((student) => ({ ID: student.ID, + NISN: student.students.NISN, NAME_USERS: student.NAME_USERS, EMAIL: student.EMAIL, - NISN: student.students.NISN, NAME_CLASS: student.students.studentClass.NAME_CLASS, ROLE: student.ROLE, }));