프로젝트
개인정보-컴플라이언스-웹애플리케이션(7) - (자가진단 설문 결과) 백엔드 코드
알럽유
2025. 1. 26. 18:05
728x90
반응형
이 코드는 자가진단 점수 계산, 결과 저장 및 조회를 처리하는 여러 함수로 구성되어 있습니다.
import pool from "../db/connection.js";
// 점수 및 등급 계산 함수
const calculateAssessmentScore = async (systemId) => {
console.log("Calculating score for systemId:", systemId);
const queryQuantitative = `SELECT response FROM quantitative WHERE system_id = ?`;
const queryQualitative = `SELECT response FROM qualitative WHERE system_id = ?`;
try {
const [quantitativeResults] = await pool.query(queryQuantitative, [
systemId,
]);
const [qualitativeResults] = await pool.query(queryQualitative, [systemId]);
console.log("Quantitative results:", quantitativeResults);
console.log("Qualitative results:", qualitativeResults);
let score = 0;
quantitativeResults.forEach((item) => {
if (item.response === "이행") score += 1;
else if (item.response === "자문 필요") score += 0.3;
});
qualitativeResults.forEach((item) => {
if (item.response === "자문필요") score += 0.3;
});
console.log("Calculated score:", score);
let grade = "D";
if (score >= 80) grade = "S";
else if (score >= 60) grade = "A";
else if (score >= 40) grade = "B";
else if (score >= 20) grade = "C";
console.log("Calculated grade:", grade);
return { score, grade };
} catch (error) {
console.error("점수 계산 실패:", error.message);
throw error;
}
};
// 자가진단 완료 처리
const completeSelfTest = async (req, res) => {
const { systemId, userId } = req.body;
if (!systemId || !userId) {
return res.status(400).json({
message: "유효하지 않은 요청입니다. systemId와 userId를 확인하세요.",
});
}
console.log("completeSelfTest called with:", { systemId, userId });
try {
// ✅ 1️⃣ `assessment_id`를 `self_assessment`에서 조회
const [selfAssessmentResult] = await pool.query(
"SELECT id FROM self_assessment WHERE system_id = ? AND user_id = ?",
[systemId, userId]
);
if (selfAssessmentResult.length === 0) {
return res.status(404).json({
message: "자가진단 입력 데이터가 없습니다.",
});
}
const assessmentId = selfAssessmentResult[0].id; // 조회한 자가진단 입력 ID
console.log("✅ Retrieved assessment_id:", assessmentId);
// ✅ 2️⃣ 점수 및 등급 계산
const { score, grade } = await calculateAssessmentScore(systemId);
console.log("Calculated score and grade:", { score, grade });
// ✅ 3️⃣ `assessment_id` 포함하여 결과 저장
const query = `
INSERT INTO assessment_result (system_id, user_id, assessment_id, score, feedback_status, grade)
VALUES (?, ?, ?, ?, '전문가 자문이 반영되기전입니다', ?)
ON DUPLICATE KEY UPDATE
score = VALUES(score),
grade = VALUES(grade),
feedback_status = '전문가 자문이 반영되기전입니다'
`;
const values = [systemId, userId, assessmentId, score, grade];
console.log("Executing query:", query, "with values:", values);
await pool.query(query, values);
res.status(200).json({
message: "자가진단 결과가 성공적으로 저장되었습니다.",
score,
grade,
});
} catch (error) {
console.error("자가진단 완료 실패:", error.message);
res.status(500).json({
message: "서버 내부 오류 발생",
error: error.message,
});
}
};
// 결과 조회 처리
const getAssessmentResults = async (req, res) => {
const { userId, systemId } = req.query;
console.log("Received query parameters:", { userId, systemId });
if (!userId || !systemId) {
return res.status(400).json({
message: "유효하지 않은 요청입니다. userId와 systemId를 확인하세요.",
});
}
const query = `
SELECT ar.id, ar.system_id, ar.score, ar.feedback_status, ar.grade, ar.completed_at,
s.name AS system_name
FROM assessment_result ar
JOIN systems s ON ar.system_id = s.id
WHERE ar.user_id = ? AND ar.system_id = ?
ORDER BY ar.completed_at DESC
LIMIT 1
`;
const values = [userId, systemId];
try {
const [results] = await pool.query(query, values);
console.log("Query results:", results);
if (results.length === 0) {
return res.status(404).json({
message: "결과가 존재하지 않습니다.",
});
}
res.status(200).json(results);
} catch (error) {
console.error("Error fetching assessment results:", error.message);
res.status(500).json({
message: "서버 내부 오류 발생",
error: error.message,
});
}
};
const getAssessmentStatuses = async (req, res) => {
try {
const query = `
SELECT system_id, COUNT(*) > 0 AS is_completed
FROM assessment_result
GROUP BY system_id
`;
const [results] = await pool.query(query);
// 결과를 객체 형태로 변환
const statusMap = results.reduce((acc, row) => {
acc[row.system_id] = row.is_completed;
return acc;
}, {});
res.status(200).json(statusMap);
} catch (error) {
console.error("진단 상태 조회 실패:", error.message);
res.status(500).json({
message: "서버 오류로 진단 상태를 가져오지 못했습니다.",
error: error.message,
});
}
};
export { completeSelfTest, getAssessmentResults, getAssessmentStatuses };
1. calculateAssessmentScore 정량 / 정성 데이터를 기반으로 점수 및 등급 계산
const calculateAssessmentScore = async (systemId) => {
console.log("Calculating score for systemId:", systemId);
const queryQuantitative = `SELECT response FROM quantitative WHERE system_id = ?`;
const queryQualitative = `SELECT response FROM qualitative WHERE system_id = ?`;
try {
const [quantitativeResults] = await pool.query(queryQuantitative, [
systemId,
]);
const [qualitativeResults] = await pool.query(queryQualitative, [systemId]);
console.log("Quantitative results:", quantitativeResults);
console.log("Qualitative results:", qualitativeResults);
let score = 0;
quantitativeResults.forEach((item) => {
if (item.response === "이행") score += 1;
else if (item.response === "자문 필요") score += 0.3;
});
qualitativeResults.forEach((item) => {
if (item.response === "자문필요") score += 0.3;
});
console.log("Calculated score:", score);
let grade = "D";
if (score >= 80) grade = "S";
else if (score >= 60) grade = "A";
else if (score >= 40) grade = "B";
else if (score >= 20) grade = "C";
console.log("Calculated grade:", grade);
return { score, grade };
} catch (error) {
console.error("점수 계산 실패:", error.message);
throw error;
}
};
const calculateAssessmentScore = async (systemId) => {
console.log("Calculating score for systemId:", systemId);
const queryQuantitative = `SELECT response FROM quantitative WHERE system_id = ?`;
const queryQualitative = `SELECT response FROM qualitative WHERE system_id = ?`;
quantitative와 qualitative 테이블에서 response 컬럼 데이터를 가져옵니다.
quantitative: 정량 데이터.
qualitative: 정성 데이터.
const [quantitativeResults] = await pool.query(queryQuantitative, [systemId]);
const [qualitativeResults] = await pool.query(queryQualitative, [systemId]);
console.log("Quantitative results:", quantitativeResults);
console.log("Qualitative results:", qualitativeResults);
정량 및 정성 데이터를 조회한 결과를 배열 형태로 반환합니다.
let score = 0;
quantitativeResults.forEach((item) => {
if (item.response === "이행") score += 1;
else if (item.response === "자문 필요") score += 0.3;
});
qualitativeResults.forEach((item) => {
if (item.response === "자문필요") score += 0.3;
});
console.log("Calculated score:", score);
정량 데이터 계산:
이행: 점수 1 추가.
자문 필요: 점수 0.3 추가.
미이행은 점수를 추가하지 않습니다.
정성 데이터 계산:
자문필요: 점수 0.3 추가.
2. completeSelfTest 자가진단 완료 처리
const completeSelfTest = async (req, res) => {
const { systemId, userId } = req.body;
if (!systemId || !userId) {
return res.status(400).json({
message: "유효하지 않은 요청입니다. systemId와 userId를 확인하세요.",
});
}
console.log("completeSelfTest called with:", { systemId, userId });
try {
// ✅ 1️⃣ `assessment_id`를 `self_assessment`에서 조회
const [selfAssessmentResult] = await pool.query(
"SELECT id FROM self_assessment WHERE system_id = ? AND user_id = ?",
[systemId, userId]
);
if (selfAssessmentResult.length === 0) {
return res.status(404).json({
message: "자가진단 입력 데이터가 없습니다.",
});
}
const assessmentId = selfAssessmentResult[0].id; // 조회한 자가진단 입력 ID
console.log("✅ Retrieved assessment_id:", assessmentId);
// ✅ 2️⃣ 점수 및 등급 계산
const { score, grade } = await calculateAssessmentScore(systemId);
console.log("Calculated score and grade:", { score, grade });
// ✅ 3️⃣ `assessment_id` 포함하여 결과 저장
const query = `
INSERT INTO assessment_result (system_id, user_id, assessment_id, score, feedback_status, grade)
VALUES (?, ?, ?, ?, '전문가 자문이 반영되기전입니다', ?)
ON DUPLICATE KEY UPDATE
score = VALUES(score),
grade = VALUES(grade),
feedback_status = '전문가 자문이 반영되기전입니다'
`;
const values = [systemId, userId, assessmentId, score, grade];
console.log("Executing query:", query, "with values:", values);
await pool.query(query, values);
res.status(200).json({
message: "자가진단 결과가 성공적으로 저장되었습니다.",
score,
grade,
});
} catch (error) {
console.error("자가진단 완료 실패:", error.message);
res.status(500).json({
message: "서버 내부 오류 발생",
error: error.message,
});
}
};
const [selfAssessmentResult] = await pool.query(
"SELECT id FROM self_assessment WHERE system_id = ? AND user_id = ?",
[systemId, userId]
);
if (selfAssessmentResult.length === 0) {
return res.status(404).json({
message: "자가진단 입력 데이터가 없습니다.",
});
}
const assessmentId = selfAssessmentResult[0].id;
자가진단 입력 데이터 조회
self_assessment 테이블에서 system_id와 user_id를 기준으로 자가진단 데이터를 찾습니다.
const query = `
INSERT INTO assessment_result (system_id, user_id, assessment_id, score, feedback_status, grade)
VALUES (?, ?, ?, ?, '전문가 자문이 반영되기전입니다', ?)
ON DUPLICATE KEY UPDATE
score = VALUES(score),
grade = VALUES(grade),
feedback_status = '전문가 자문이 반영되기전입니다'
`;
const values = [systemId, userId, assessmentId, score, grade];
assessment_result 테이블에 결과를 저장합니다.
ON DUPLICATE KEY UPDATE:동일한 system_id와 user_id가 있으면 점수(score)와 등급(grade)을 업데이트합니다.
3. getAssessmentResults 자가진단 결과 조회
const getAssessmentResults = async (req, res) => {
const { userId, systemId } = req.query;
console.log("Received query parameters:", { userId, systemId });
if (!userId || !systemId) {
return res.status(400).json({
message: "유효하지 않은 요청입니다. userId와 systemId를 확인하세요.",
});
}
const query = `
SELECT ar.id, ar.system_id, ar.score, ar.feedback_status, ar.grade, ar.completed_at,
s.name AS system_name
FROM assessment_result ar
JOIN systems s ON ar.system_id = s.id
WHERE ar.user_id = ? AND ar.system_id = ?
ORDER BY ar.completed_at DESC
LIMIT 1
`;
const values = [userId, systemId];
try {
const [results] = await pool.query(query, values);
console.log("Query results:", results);
if (results.length === 0) {
return res.status(404).json({
message: "결과가 존재하지 않습니다.",
});
}
res.status(200).json(results);
} catch (error) {
console.error("Error fetching assessment results:", error.message);
res.status(500).json({
message: "서버 내부 오류 발생",
error: error.message,
});
}
};
const query = `
SELECT ar.id, ar.system_id, ar.score, ar.feedback_status, ar.grade, ar.completed_at,
s.name AS system_name
FROM assessment_result ar
JOIN systems s ON ar.system_id = s.id
WHERE ar.user_id = ? AND ar.system_id = ?
ORDER BY ar.completed_at DESC
LIMIT 1
`;
assessment_result 테이블에서 결과를 가져옵니다.
JOIN systems를 통해 시스템 이름(system_name)을 추가로 가져옵니다.
정렬 및 제한:
최신 결과만 반환하기 위해 ORDER BY ar.completed_at DESC LIMIT 1을 사용합니다.