2024-09-13 13:03:35 +00:00
|
|
|
import response from "../../response.js";
|
|
|
|
|
import models from "../../models/index.js";
|
|
|
|
|
import { createMonitoring } from "../monitoringControllers/monitoring.js";
|
|
|
|
|
|
|
|
|
|
export const getStdLearnings = async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
const stdLearning = await models.StdLearning.findAll();
|
|
|
|
|
response(200, stdLearning, "Success", res);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log(error);
|
|
|
|
|
response(500, null, "Error retrieving student learning data!", res);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const getStdLearningById = async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
const { id } = req.params;
|
|
|
|
|
const stdLearning = await models.StdLearning.findByPk(id);
|
|
|
|
|
|
|
|
|
|
if (!stdLearning) {
|
|
|
|
|
return response(404, null, "Student learning data not found", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
response(200, stdLearning, "Success", res);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
response(500, null, "Internal Server Error", res);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const createStdLearning = async (req, res) => {
|
|
|
|
|
const { ID_LEVEL } = req.body;
|
|
|
|
|
|
|
|
|
|
if (!req.user) {
|
|
|
|
|
return response(401, null, "User not authenticated", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const ID = req.user.ID;
|
|
|
|
|
|
|
|
|
|
try {
|
2024-09-30 03:20:31 +00:00
|
|
|
if (req.stdLearning) {
|
|
|
|
|
return response(
|
|
|
|
|
200,
|
|
|
|
|
req.stdLearning,
|
|
|
|
|
"Student Learning data found and reused",
|
|
|
|
|
res
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-13 13:03:35 +00:00
|
|
|
const level = await models.Level.findByPk(ID_LEVEL);
|
|
|
|
|
if (!level) {
|
|
|
|
|
return response(404, null, "Level not found", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const newStdLearning = await models.StdLearning.create({
|
|
|
|
|
ID,
|
|
|
|
|
ID_LEVEL,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
response(
|
|
|
|
|
201,
|
|
|
|
|
newStdLearning,
|
|
|
|
|
"Student Learning data created successfully",
|
|
|
|
|
res
|
|
|
|
|
);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log(error);
|
|
|
|
|
response(500, null, "Internal Server Error", res);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const updateStdLearningById = async (req, res) => {
|
|
|
|
|
const { id } = req.params;
|
|
|
|
|
const { FEEDBACK_STUDENT } = req.body;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const stdLearning = await models.StdLearning.findByPk(id, {
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Level,
|
|
|
|
|
as: "level",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!stdLearning) {
|
|
|
|
|
return response(404, null, "Student Learning record not found", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stdLearning.STUDENT_FINISH = new Date();
|
|
|
|
|
stdLearning.SCORE = req.body.SCORE;
|
|
|
|
|
stdLearning.NEXT_LEARNING = req.body.NEXT_LEARNING;
|
|
|
|
|
stdLearning.IS_PASS = req.body.IS_PASS;
|
|
|
|
|
|
|
|
|
|
if (FEEDBACK_STUDENT) {
|
|
|
|
|
stdLearning.FEEDBACK_STUDENT = FEEDBACK_STUDENT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await stdLearning.save();
|
|
|
|
|
|
|
|
|
|
const level6 = await models.Level.findOne({
|
|
|
|
|
where: {
|
|
|
|
|
NAME_LEVEL: "Level 6",
|
|
|
|
|
ID_TOPIC: stdLearning.level.ID_TOPIC,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!level6) {
|
|
|
|
|
return response(404, null, "Level 6 not found", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
stdLearning.level.ID_LEVEL === level6.ID_LEVEL &&
|
|
|
|
|
stdLearning.IS_PASS === 1
|
|
|
|
|
) {
|
|
|
|
|
req.body.ID_STUDENT_LEARNING = id;
|
|
|
|
|
|
|
|
|
|
const existingMonitoring = await models.Monitoring.findOne({
|
|
|
|
|
where: { ID_STUDENT_LEARNING: id },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!existingMonitoring) {
|
|
|
|
|
const newMonitoring = await createMonitoring(req);
|
|
|
|
|
|
|
|
|
|
const { level, ...responseData } = stdLearning.toJSON();
|
|
|
|
|
|
|
|
|
|
const combinedPayload = {
|
|
|
|
|
...responseData,
|
|
|
|
|
MONITORING: newMonitoring,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return response(
|
|
|
|
|
200,
|
|
|
|
|
combinedPayload,
|
|
|
|
|
"Student Learning record updated and monitoring created successfully",
|
|
|
|
|
res
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
const monitoringToDelete = await models.Monitoring.findOne({
|
|
|
|
|
where: { ID_STUDENT_LEARNING: id },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (monitoringToDelete) {
|
|
|
|
|
await monitoringToDelete.destroy();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { level, ...responseData } = stdLearning.toJSON();
|
|
|
|
|
|
|
|
|
|
response(
|
|
|
|
|
200,
|
|
|
|
|
responseData,
|
|
|
|
|
"Student Learning record updated successfully",
|
|
|
|
|
res
|
|
|
|
|
);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log(error);
|
|
|
|
|
response(500, null, "Internal Server Error", res);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2024-09-23 06:16:02 +00:00
|
|
|
export const learningScoreByStdLearningId = async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
if (!req.user) {
|
|
|
|
|
return response(401, null, "User not authenticated", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { ID } = req.user;
|
|
|
|
|
const { stdLearningId } = req.params;
|
|
|
|
|
|
|
|
|
|
const stdLearning = await models.StdLearning.findOne({
|
|
|
|
|
where: {
|
|
|
|
|
ID_STUDENT_LEARNING: stdLearningId,
|
|
|
|
|
ID: ID,
|
|
|
|
|
},
|
|
|
|
|
include: [
|
2024-09-30 01:59:36 +00:00
|
|
|
{
|
|
|
|
|
model: models.Level,
|
|
|
|
|
as: "level",
|
|
|
|
|
attributes: ["ID_LEVEL", "NAME_LEVEL"],
|
|
|
|
|
},
|
2024-09-23 06:16:02 +00:00
|
|
|
{
|
|
|
|
|
model: models.Level,
|
|
|
|
|
as: "nextLevel",
|
2024-09-30 01:59:36 +00:00
|
|
|
attributes: ["NAME_LEVEL"],
|
2024-09-23 06:16:02 +00:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
model: models.User,
|
|
|
|
|
as: "learningUser",
|
|
|
|
|
attributes: ["NAME_USERS"],
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Student,
|
|
|
|
|
as: "students",
|
|
|
|
|
attributes: ["NISN"],
|
2024-09-25 03:57:47 +00:00
|
|
|
},
|
|
|
|
|
],
|
2024-09-23 06:16:02 +00:00
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!stdLearning) {
|
|
|
|
|
return response(
|
|
|
|
|
404,
|
|
|
|
|
null,
|
|
|
|
|
"No matching learning data found for this user",
|
|
|
|
|
res
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!stdLearning.NEXT_LEARNING || !stdLearning.nextLevel) {
|
|
|
|
|
return response(200, null, "No next learning level found", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const nextLearningData = {
|
|
|
|
|
ID_STUDENT_LEARNING: stdLearning.ID_STUDENT_LEARNING,
|
|
|
|
|
NAME_USERS: stdLearning.learningUser.NAME_USERS,
|
|
|
|
|
NISN: stdLearning.learningUser.students
|
|
|
|
|
? stdLearning.learningUser.students.NISN
|
|
|
|
|
: null,
|
2024-09-30 01:59:36 +00:00
|
|
|
ID_LEVEL: stdLearning.level ? stdLearning.level.ID_LEVEL : null,
|
2024-09-30 03:20:31 +00:00
|
|
|
CURRENT_LEVEL_NAME: stdLearning.level
|
|
|
|
|
? stdLearning.level.NAME_LEVEL
|
|
|
|
|
: null,
|
2024-09-23 06:16:02 +00:00
|
|
|
SCORE: stdLearning.SCORE,
|
|
|
|
|
NEXT_LEARNING: stdLearning.NEXT_LEARNING,
|
|
|
|
|
NEXT_LEARNING_NAME: stdLearning.nextLevel.NAME_LEVEL,
|
2024-09-30 01:59:36 +00:00
|
|
|
IS_PASS: stdLearning.IS_PASS,
|
2024-09-23 06:16:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return response(200, nextLearningData, "Success", res);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log(error);
|
|
|
|
|
return response(500, null, "Internal Server Error", res);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2024-09-13 13:03:35 +00:00
|
|
|
export const learningHistory = async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
if (!req.user) {
|
|
|
|
|
return response(401, null, "User not authenticated", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { ID } = req.user;
|
|
|
|
|
|
|
|
|
|
const stdLearnings = await models.StdLearning.findAll({
|
|
|
|
|
where: {
|
|
|
|
|
ID: ID,
|
|
|
|
|
},
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Level,
|
|
|
|
|
as: "level",
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Topic,
|
|
|
|
|
as: "levelTopic",
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Section,
|
|
|
|
|
as: "topicSection",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const result = await Promise.all(
|
|
|
|
|
stdLearnings.map(async (learning) => {
|
|
|
|
|
let nextLevelName = null;
|
|
|
|
|
if (learning.NEXT_LEARNING) {
|
|
|
|
|
const nextLevel = await models.Level.findOne({
|
|
|
|
|
where: { ID_LEVEL: learning.NEXT_LEARNING },
|
|
|
|
|
});
|
|
|
|
|
if (nextLevel) {
|
|
|
|
|
nextLevelName = nextLevel.NAME_LEVEL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
SCORE: learning.SCORE,
|
|
|
|
|
CURRENT_LEVEL: learning.level.NAME_LEVEL,
|
|
|
|
|
NEXT_LEVEL: nextLevelName,
|
|
|
|
|
STUDENT_FINISH: learning.STUDENT_FINISH,
|
|
|
|
|
TOPIC_NAME: learning.level.levelTopic.NAME_TOPIC,
|
|
|
|
|
SECTION_NAME: learning.level.levelTopic.topicSection.NAME_SECTION,
|
|
|
|
|
};
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
response(200, result, "Success", res);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log(error);
|
|
|
|
|
response(500, null, "Internal Server Error", res);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const learningHistoryBySectionId = async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
if (!req.user) {
|
|
|
|
|
return response(401, null, "User not authenticated", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { ID } = req.user;
|
|
|
|
|
const { sectionId } = req.params;
|
|
|
|
|
|
|
|
|
|
const stdLearnings = await models.StdLearning.findAll({
|
|
|
|
|
where: {
|
|
|
|
|
ID: ID,
|
|
|
|
|
},
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Level,
|
|
|
|
|
as: "level",
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Topic,
|
|
|
|
|
as: "levelTopic",
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Section,
|
|
|
|
|
as: "topicSection",
|
|
|
|
|
where: { ID_SECTION: sectionId },
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!stdLearnings.length) {
|
|
|
|
|
return response(
|
|
|
|
|
404,
|
|
|
|
|
null,
|
|
|
|
|
"No learning history found for the specified section",
|
|
|
|
|
res
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const result = await Promise.all(
|
|
|
|
|
stdLearnings.map(async (learning) => {
|
|
|
|
|
let nextLevelName = null;
|
|
|
|
|
if (learning.NEXT_LEARNING) {
|
|
|
|
|
const nextLevel = await models.Level.findOne({
|
|
|
|
|
where: { ID_LEVEL: learning.NEXT_LEARNING },
|
|
|
|
|
});
|
|
|
|
|
if (nextLevel) {
|
|
|
|
|
nextLevelName = nextLevel.NAME_LEVEL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
SCORE: learning.SCORE,
|
|
|
|
|
CURRENT_LEVEL: learning.level.NAME_LEVEL,
|
|
|
|
|
NEXT_LEVEL: nextLevelName,
|
|
|
|
|
STUDENT_FINISH: learning.STUDENT_FINISH,
|
|
|
|
|
TOPIC_NAME: learning.level.levelTopic.NAME_TOPIC,
|
|
|
|
|
SECTION_NAME: learning.level.levelTopic.topicSection.NAME_SECTION,
|
|
|
|
|
};
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
response(200, result, "Success", res);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.log(error);
|
|
|
|
|
response(500, null, "Internal Server Error", res);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const learningHistoryByTopicId = async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
if (!req.user) {
|
|
|
|
|
return response(401, null, "User not authenticated", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { ID } = req.user;
|
|
|
|
|
const { topicId } = req.params;
|
|
|
|
|
|
|
|
|
|
if (!topicId) {
|
|
|
|
|
return response(400, null, "Topic ID is required", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const stdLearnings = await models.StdLearning.findAll({
|
|
|
|
|
where: {
|
|
|
|
|
ID: ID,
|
|
|
|
|
},
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Level,
|
|
|
|
|
as: "level",
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Topic,
|
|
|
|
|
as: "levelTopic",
|
|
|
|
|
where: { ID_TOPIC: topicId },
|
|
|
|
|
include: [
|
|
|
|
|
{
|
|
|
|
|
model: models.Section,
|
|
|
|
|
as: "topicSection",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const result = await Promise.all(
|
|
|
|
|
stdLearnings.map(async (learning) => {
|
|
|
|
|
let nextLevelName = null;
|
|
|
|
|
if (learning.NEXT_LEARNING) {
|
|
|
|
|
const nextLevel = await models.Level.findOne({
|
|
|
|
|
where: { ID_LEVEL: learning.NEXT_LEARNING },
|
|
|
|
|
});
|
|
|
|
|
if (nextLevel) {
|
|
|
|
|
nextLevelName = nextLevel.NAME_LEVEL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
SCORE: learning.SCORE,
|
|
|
|
|
CURRENT_LEVEL: learning.level.NAME_LEVEL,
|
|
|
|
|
NEXT_LEVEL: nextLevelName,
|
|
|
|
|
STUDENT_FINISH: learning.STUDENT_FINISH,
|
|
|
|
|
TOPIC_NAME: learning.level.levelTopic.NAME_TOPIC,
|
|
|
|
|
SECTION_NAME: learning.level.levelTopic.topicSection.NAME_SECTION,
|
|
|
|
|
};
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
response(200, result, "Success", res);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error(error);
|
|
|
|
|
response(500, null, "Internal Server Error", res);
|
|
|
|
|
}
|
|
|
|
|
};
|
2024-09-25 03:57:47 +00:00
|
|
|
|
|
|
|
|
export const getLastCreatedStdLearningByLevelId = async (req, res) => {
|
|
|
|
|
try {
|
|
|
|
|
if (!req.user) {
|
|
|
|
|
return response(401, null, "User not authenticated", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { ID } = req.user;
|
|
|
|
|
const { levelId } = req.params;
|
|
|
|
|
|
|
|
|
|
if (!levelId) {
|
|
|
|
|
return response(400, null, "Level ID is required", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const latestStdLearning = await models.StdLearning.findOne({
|
|
|
|
|
where: {
|
|
|
|
|
ID: ID,
|
|
|
|
|
ID_LEVEL: levelId,
|
|
|
|
|
},
|
|
|
|
|
order: [["STUDENT_START", "DESC"]],
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!latestStdLearning) {
|
|
|
|
|
return response(404, null, "No StdLearning data found", res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
response(200, latestStdLearning, "Success", res);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error(error);
|
|
|
|
|
response(500, null, "Internal Server Error", res);
|
|
|
|
|
}
|
|
|
|
|
};
|