From a52574c90ed5ca88c43d06f6b326fb9df620fa6e Mon Sep 17 00:00:00 2001 From: Jake1152 Date: Thu, 12 Sep 2024 23:20:19 +0900 Subject: [PATCH 1/8] =?UTF-8?q?init:=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/user.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/routes/user.js b/src/routes/user.js index 1f47cbf..69aa66e 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -20,6 +20,8 @@ const { resetPassword, mypage, } = require("../controllers/userController"); +const { StatusCodes } = require("http-status-codes"); +const { COOKIE_OPTION } = require("../constant/constant"); router.post( "/join", @@ -83,4 +85,14 @@ router.put( resetPassword ); +router.delete("/", isAuthenticated, (req, res, next) => { + // const user = undefined; + try { + res.clearCookie("token", COOKIE_OPTION); + return res.status(StatusCodes.NO_CONTENT).end(); + } catch (err) { + console.error(err); + } +}); + module.exports = router; From 7b57c99c64dc0f4a06bcfac501ebcc703e06bdac Mon Sep 17 00:00:00 2001 From: Jake1152 Date: Thu, 12 Sep 2024 23:25:51 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4,=20controller=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - endpoint 수정 /users => /users/account --- src/controllers/userController.js | 23 +++++++++++++++++++++++ src/routes/user.js | 13 ++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/controllers/userController.js b/src/controllers/userController.js index e19ce1b..d52aa40 100644 --- a/src/controllers/userController.js +++ b/src/controllers/userController.js @@ -303,6 +303,28 @@ const mypage = async (req, res, next) => { } }; +/** 회원탈퇴 + * 유저 정보를 토큰에서 뽑아냄 + * + * 뽑아낸 유저 정보를 가지고 아래 테이블들에서 삭제 진행 + * - user + * - solved_quizzes + * TO BE + * - 무한 퀴즈 챌린지, 유저 데이터 + * + * # 고려사항 + * - 탈퇴한 유저의 기록은 지울 것인가? + */ +const removeUserAccount = (req, res, next) => { + // const user = undefined; + try { + res.clearCookie("token", COOKIE_OPTION); + return res.status(StatusCodes.NO_CONTENT).end(); + } catch (err) { + console.error(err); + } +}; + module.exports = { join, checkLoginId, @@ -312,4 +334,5 @@ module.exports = { isAvailablePassword, resetPassword, mypage, + removeUserAccount, }; diff --git a/src/routes/user.js b/src/routes/user.js index 69aa66e..6432181 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -19,9 +19,8 @@ const { isCurrentPassword, resetPassword, mypage, + removeUserAccount, } = require("../controllers/userController"); -const { StatusCodes } = require("http-status-codes"); -const { COOKIE_OPTION } = require("../constant/constant"); router.post( "/join", @@ -85,14 +84,6 @@ router.put( resetPassword ); -router.delete("/", isAuthenticated, (req, res, next) => { - // const user = undefined; - try { - res.clearCookie("token", COOKIE_OPTION); - return res.status(StatusCodes.NO_CONTENT).end(); - } catch (err) { - console.error(err); - } -}); +router.delete("/account", isAuthenticated, removeUserAccount); module.exports = router; From 07d0691af90c800c7e4ec93db10182f16ebb9d3e Mon Sep 17 00:00:00 2001 From: Jake1152 Date: Fri, 13 Sep 2024 10:27:48 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20getUserNumIdByToken()=20service=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/quizController.js | 2 +- src/controllers/userController.js | 25 +++++++++++++----- src/services/jwtService.js | 43 ------------------------------- src/services/userService.js | 34 +++++++++++++++++++++++- 4 files changed, 53 insertions(+), 51 deletions(-) diff --git a/src/controllers/quizController.js b/src/controllers/quizController.js index cdb6ab4..de4ec7d 100644 --- a/src/controllers/quizController.js +++ b/src/controllers/quizController.js @@ -79,7 +79,7 @@ const saveQuizResult = async (req, res, next) => { const payload = await verifyToken(token); const userId = payload.id; - // TODO: getUserNumId service 만들어서 사용 + // TODO: getUserNumIdByToken service 만들어서 사용 const getUserIdResult = await pool.query(userQuery.getUserId, userId); const userNumId = getUserIdResult[0][0]?.id; diff --git a/src/controllers/userController.js b/src/controllers/userController.js index d52aa40..ee7a9b3 100644 --- a/src/controllers/userController.js +++ b/src/controllers/userController.js @@ -10,6 +10,7 @@ const { gerRankInfo } = require("../services/rankService.js"); const { convertHashPassword, generateSalt, + getUserNumIdByToken, } = require("../services/userService.js"); const { verifyToken } = require("../services/jwtService.js"); @@ -264,13 +265,19 @@ const resetPassword = async (req, res, next) => { "solvedCount": 30// 지금까지 푼 문제 수 } */ +// src/controllers/userController.js const mypage = async (req, res, next) => { try { const token = req.cookies?.token; const payload = await verifyToken(token); const userId = payload.id; - const getUserIdResult = await pool.query(userQuery.getUserId, userId); - const userNumId = getUserIdResult[0][0]?.id; + const userIdResult = await pool.query(userQuery.getUserId, userId); + console.log("userIdResult : ", userIdResult); + console.log("userIdResult[0] : ", userIdResult[0]); + console.log("userIdResult[0][0] : ", userIdResult[0][0]); + const userNumId = userIdResult[0][0]?.id; + + console.log("userNumId : ", userNumId); if (!userNumId) { throw createHttpError( @@ -309,19 +316,25 @@ const mypage = async (req, res, next) => { * 뽑아낸 유저 정보를 가지고 아래 테이블들에서 삭제 진행 * - user * - solved_quizzes + * - score * TO BE * - 무한 퀴즈 챌린지, 유저 데이터 * * # 고려사항 * - 탈퇴한 유저의 기록은 지울 것인가? */ -const removeUserAccount = (req, res, next) => { - // const user = undefined; +// src/controllers/userController.js +const removeUserAccount = async (req, res, next) => { try { - res.clearCookie("token", COOKIE_OPTION); + const token = req.cookies?.token; + const userNumId = await getUserNumIdByToken(token); + console.log("## userNumId : ", userNumId); + + // res.clearCookie("token", COOKIE_OPTION); return res.status(StatusCodes.NO_CONTENT).end(); } catch (err) { - console.error(err); + console.error("removeUserAccount : ", err); + next(err); } }; diff --git a/src/services/jwtService.js b/src/services/jwtService.js index 7a66315..dc85c6a 100644 --- a/src/services/jwtService.js +++ b/src/services/jwtService.js @@ -23,47 +23,4 @@ const verifyToken = async (token) => { } }; -/* -const verifyToken = async (token) => { - try { - const decoded = jwt.verify(token, process.env.JWT_PRIVATE_KEY); - return decoded; - } catch (err) { - if (err.name === "TokenExpiredError") { - throw createHttpError(StatusCodes.UNAUTHORIZED, "토큰이 만료되었습니다."); - } else { - throw createHttpError( - StatusCodes.UNAUTHORIZED, - "토큰 인증에 실패 하셨습니다." - ); - } - } -}; -*/ - -/** -const verifyToken = async (token) => { - return await new Promise((resolve, reject) => { - jwt.verify(token, process.env.JWT_PRIVATE_KEY, (err, decoded) => { - if (err) { - if (err.name === "TokenExpiredError") { - reject( - createHttpError(StatusCodes.UNAUTHORIZED, "토큰이 만료되었습니다.") - ); - } else { - reject( - createHttpError( - StatusCodes.UNAUTHORIZED, - "토큰 인증에 실패 하셨습니다." - ) - ); - } - } else { - resolve(decoded); - } - }); - }); -}; - */ - module.exports = { verifyToken }; diff --git a/src/services/userService.js b/src/services/userService.js index 5300754..3cb3481 100644 --- a/src/services/userService.js +++ b/src/services/userService.js @@ -1,3 +1,4 @@ +// src/services/userService.js const crypto = require("crypto"); const { @@ -6,6 +7,11 @@ const { DIGEST_ALGORITHM, ENCODING_STYLE, } = require("../constant/constant.js"); +const { verifyToken } = require("./jwtService.js"); +const { pool } = require("../db/mysqldb.js"); +const userQuery = require("../queries/userQuery.js"); +const createHttpError = require("http-errors"); +const { StatusCodes } = require("http-status-codes"); const generateSalt = () => { return crypto.randomBytes(SALT_BYTE_SEQUENCE_SIZE).toString(ENCODING_STYLE); @@ -25,4 +31,30 @@ const convertHashPassword = (password, salt) => { return hashPassword; }; -module.exports = { convertHashPassword, generateSalt }; +const getUserNumIdByToken = async (token) => { + try { + const payload = await verifyToken(token); + const userId = payload.id; + const userIdResult = await pool + .promise() + .query(userQuery.getUserId, userId); + const userNumId = userIdResult[0][0]?.id; + + if (!userNumId) { + throw createHttpError( + StatusCodes.NOT_FOUND, + "사용자 정보를 찾을 수 없습니다." + ); + } + + return userNumId; + } catch (err) { + console.error("Fatal: 유저의 아이디를 찾을 수 없습니다."); + throw createHttpError( + StatusCodes.NOT_FOUND, + "사용자 정보를 찾을 수 없습니다." + ); + } +}; + +module.exports = { convertHashPassword, generateSalt, getUserNumIdByToken }; From b3ba22693d5fd285f4b05e640c0f9cf09d98f7fa Mon Sep 17 00:00:00 2001 From: Jake1152 Date: Fri, 13 Sep 2024 11:13:07 +0900 Subject: [PATCH 4/8] =?UTF-8?q?fix:=20mysql=20promise,=20near=20ranker=20?= =?UTF-8?q?=EC=9D=B4=EC=8A=88=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - mysql/promise로 require 받은 것, query(), promise().query() 이슈 처리 - 내가 1등인 경우 near ranker 로직에 에러 있던 것 수정 --- src/db/mysqldb.js | 5 +++-- src/services/rankService.js | 14 +++++++++----- src/services/userService.js | 6 ++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/db/mysqldb.js b/src/db/mysqldb.js index 5da544d..50b57eb 100644 --- a/src/db/mysqldb.js +++ b/src/db/mysqldb.js @@ -1,7 +1,8 @@ // mysql 모듈 소환 -const mysqldb = require("mysql2/promise"); +// import { createPool } from "mysql2/promise"; +const { createPool } = require("mysql2/promise"); -const pool = mysqldb.createPool({ +const pool = createPool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, diff --git a/src/services/rankService.js b/src/services/rankService.js index fb76d81..6a94dc2 100644 --- a/src/services/rankService.js +++ b/src/services/rankService.js @@ -98,6 +98,7 @@ const topThreeRankerInfo = async (scoreInfos) => { }; }; +// TODO: SQL로 순위도 가져오도록 수정 const nearThreeRankerInfo = async (scoreInfos, myScoreInfoIdx) => { // myScoreInfoIdx 인근 +- 1 // 내가 1등인 경우 1,2,3등 @@ -105,8 +106,11 @@ const nearThreeRankerInfo = async (scoreInfos, myScoreInfoIdx) => { let nearThreeUserNumIds = []; // 내가 1등인 경우 if (myScoreInfoIdx === 0) { - result["nearRankers"] = topUserRanks; - result["nearRankersCount"] = topUserRanks.length; + const topRankers = await topThreeRankerInfo(scoreInfos); + + return { + nearRankers: topRankers["topRankers"], + }; } else { let idx = myScoreInfoIdx - 1; @@ -123,7 +127,7 @@ const nearThreeRankerInfo = async (scoreInfos, myScoreInfoIdx) => { userQuery.getThreeUsersInfoQuery(nearThreeUserNumIds); const userInfosQueryResult = await pool.query(query, params); const userInfos = userInfosQueryResult[0]; - let nearThreRanks = []; + let nearThreeRanks = []; idx = myScoreInfoIdx - 1; // 현재 내 순위가 마지막이고 전체 유저 수가 3명 이상일 때 @@ -135,7 +139,7 @@ const nearThreeRankerInfo = async (scoreInfos, myScoreInfoIdx) => { const userId = scoreInfos[idx]["user_id"]; const userInfo = userInfos.find((user) => user.id === userId); if (userInfo) { - nearThreRanks.push({ + nearThreeRanks.push({ id: userInfo["user_id"], rank: idx + 1, score: scoreInfos[idx]["total_score"], @@ -145,7 +149,7 @@ const nearThreeRankerInfo = async (scoreInfos, myScoreInfoIdx) => { } } return { - nearRankers: nearThreRanks, + nearRankers: nearThreeRanks, }; } }; diff --git a/src/services/userService.js b/src/services/userService.js index 3cb3481..ef43bbb 100644 --- a/src/services/userService.js +++ b/src/services/userService.js @@ -8,7 +8,7 @@ const { ENCODING_STYLE, } = require("../constant/constant.js"); const { verifyToken } = require("./jwtService.js"); -const { pool } = require("../db/mysqldb.js"); +const pool = require("../db/mysqldb.js"); const userQuery = require("../queries/userQuery.js"); const createHttpError = require("http-errors"); const { StatusCodes } = require("http-status-codes"); @@ -35,9 +35,7 @@ const getUserNumIdByToken = async (token) => { try { const payload = await verifyToken(token); const userId = payload.id; - const userIdResult = await pool - .promise() - .query(userQuery.getUserId, userId); + const userIdResult = await pool.query(userQuery.getUserId, userId); const userNumId = userIdResult[0][0]?.id; if (!userNumId) { From 31d22b6d44c2b3af4800826d9593cb8e730cce43 Mon Sep 17 00:00:00 2001 From: Jake1152 Date: Fri, 13 Sep 2024 12:13:33 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/userController.js | 56 +++++++++++++++++++++++++++++-- src/queries/quizQuery.js | 1 + src/queries/scoreQuery.js | 5 +-- src/queries/userQuery.js | 1 + 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/controllers/userController.js b/src/controllers/userController.js index ee7a9b3..48c9d5c 100644 --- a/src/controllers/userController.js +++ b/src/controllers/userController.js @@ -4,6 +4,7 @@ const createHttpError = require("http-errors"); const pool = require("../db/mysqldb"); const userQuery = require("../queries/userQuery.js"); const scoreQuery = require("../queries/scoreQuery.js"); +const quizQuery = require("../queries/quizQuery.js"); const { COOKIE_OPTION } = require("../constant/constant.js"); const { gerRankInfo } = require("../services/rankService.js"); @@ -328,9 +329,60 @@ const removeUserAccount = async (req, res, next) => { try { const token = req.cookies?.token; const userNumId = await getUserNumIdByToken(token); - console.log("## userNumId : ", userNumId); + const findUserInfoQuery = `SELECT * FROM user WHERE id = ?`; + const findUserInfoQueryResult = await pool.query( + findUserInfoQuery, + userNumId + ); + + console.log( + "findUserInfoQueryResult[0][0] : ", + findUserInfoQueryResult[0][0] + ); + + const findUserScoreInfoQuery = `SELECT * FROM score WHERE user_id = ?`; + const findUserScoreInfoQueryResult = await pool.query( + findUserScoreInfoQuery, + userNumId + ); + + console.log( + "findUserScoreInfoQueryResult[0][0] : ", + findUserScoreInfoQueryResult[0][0] + ); + + const findSolvedQuizHistoryQuery = `SELECT * FROM solved_quizzes WHERE user_id = ?`; + const findSolvedQuizHistoryQueryResult = await pool.query( + findSolvedQuizHistoryQuery, + userNumId + ); + + console.log( + "findSolvedQuizHistoryQueryResult[0][0] : ", + findSolvedQuizHistoryQueryResult[0][0] + ); + + const connection = await pool.getConnection(); + try { + await connection.beginTransaction(); + + // user, score, solved_quizzes 테이블 속 계정 삭제 + await connection.query(scoreQuery.removeUserScoreHistory, userNumId); + await connection.query(quizQuery.removeUserSolvedQuizHistory, userNumId); + // user id를 FK로 가진 테이블의 데이터들부터 삭제한 뒤에 user 테이블에서 유저 정보 삭제 + await connection.query(userQuery.removeUserAccount, userNumId); + + await connection.commit(); + } catch (err) { + console.error("회원 탈퇴 트렌젝션 쿼리 에러 ,", err); + await connection.rollback(); + next(err); + } finally { + connection.release(); + } + + res.clearCookie("token", COOKIE_OPTION); - // res.clearCookie("token", COOKIE_OPTION); return res.status(StatusCodes.NO_CONTENT).end(); } catch (err) { console.error("removeUserAccount : ", err); diff --git a/src/queries/quizQuery.js b/src/queries/quizQuery.js index 52d6541..7b7eb76 100644 --- a/src/queries/quizQuery.js +++ b/src/queries/quizQuery.js @@ -14,3 +14,4 @@ exports.updateQuizStatistics = `UPDATE quiz_accuracy_statistics \ SET correct_people_count = correct_people_count + ?, \ total_attempts_count_before_correct = total_attempts_count_before_correct + ? \ WHERE quiz_id = ?`; +exports.removeUserSolvedQuizHistory = `DELETE FROM solved_quizzes WHERE user_id = ?`; diff --git a/src/queries/scoreQuery.js b/src/queries/scoreQuery.js index c186495..12d2595 100644 --- a/src/queries/scoreQuery.js +++ b/src/queries/scoreQuery.js @@ -18,7 +18,4 @@ exports.getRankingPagesInfo = `SELECT u.user_id AS id, \ ON u.id = s.user_id LIMIT ? \ OFFSET ?`; -// UPDATE your_table_name -// SET correct_people_count = correct_people_count + 0, -// total_attempts_count_before_correct = total_attempts_count_before_correct + 1 -// WHERE quiz_id = 1; +exports.removeUserScoreHistory = `DELETE FROM score WHERE user_id = ?`; diff --git a/src/queries/userQuery.js b/src/queries/userQuery.js index 88cd7dd..95f1d4f 100644 --- a/src/queries/userQuery.js +++ b/src/queries/userQuery.js @@ -4,6 +4,7 @@ exports.getUserInfo = `SELECT user_id, password, salt FROM user WHERE user_id = exports.getUserPasswordInfo = `SELECT password, salt FROM user WHERE user_id = ?`; exports.resetPassword = `UPDATE user SET password = ?, salt = ? WHERE user_id = ?`; exports.getThreeUsersInfo = `SELECT user_id, id FROM user WHERE id IN (?, ?, ?)`; +exports.removeUserAccount = `DELETE FROM user WHERE id = ?`; // Function to dynamically generate query for up to 3 user IDs exports.getThreeUsersInfoQuery = (ids) => { From 4908d77cf1eb2eb00e78fe9f99dd10f20d0c3a57 Mon Sep 17 00:00:00 2001 From: Jake1152 Date: Fri, 13 Sep 2024 12:13:53 +0900 Subject: [PATCH 6/8] =?UTF-8?q?fix:=20=ED=80=B4=EC=A6=88=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20api=20=EB=AF=B8=EB=93=A4=EC=9B=A8=EC=96=B4,=20?= =?UTF-8?q?=ED=8A=B8=EB=9E=9C=EC=A0=9D=EC=85=98=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 같은 동작을 하는 validator, trim 미들웨어 삭제 - 트랜젝션 코드 내에서 await를 하지 않고 query를 써서 발생하는 에러 잡지 못하는 이슈 수정 --- src/controllers/quizController.js | 5 +++-- src/routes/quiz.js | 3 --- src/validators/quizValidators.js | 9 +++++++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/controllers/quizController.js b/src/controllers/quizController.js index de4ec7d..f7502c8 100644 --- a/src/controllers/quizController.js +++ b/src/controllers/quizController.js @@ -112,9 +112,9 @@ const saveQuizResult = async (req, res, next) => { // 이전에 맞힌 적이 없다면 if (isSolved == false) { // 문제 풀었음을 표기 solved_quizzes - connection.query(quizQuery.recordQuizSolved, [quizId, userNumId]); + await connection.query(quizQuery.recordQuizSolved, [quizId, userNumId]); // 통계 데이터를 반영 quiz_accuracy_statistics; - connection.query(quizQuery.updateQuizStatistics, [ + await connection.query(quizQuery.updateQuizStatistics, [ solvedQuizCount, totalQuizCount, quizId, @@ -132,6 +132,7 @@ const saveQuizResult = async (req, res, next) => { return res.status(StatusCodes.NO_CONTENT).end(); } catch (err) { + console.error("퀴즈 결과 저장 쿼리 에러 ,", err); next(err); } }; diff --git a/src/routes/quiz.js b/src/routes/quiz.js index f61300d..6962592 100644 --- a/src/routes/quiz.js +++ b/src/routes/quiz.js @@ -7,7 +7,6 @@ const { saveQuizResult, } = require("../controllers/quizController"); const trimMiddleware = require("../middlewares/trimMiddleware"); -const validationMiddleware = require("../middlewares/validationMiddleware"); const quizValidators = require("../validators/quizValidators.js"); router.get("/", generateQuiz); @@ -15,9 +14,7 @@ router.get("/:quizId/mark", markQuizAnswer); router.post( "/result", isAuthenticated, - trimMiddleware, quizValidators.saveQuizResult, - validationMiddleware, saveQuizResult ); diff --git a/src/validators/quizValidators.js b/src/validators/quizValidators.js index f971306..3528c4b 100644 --- a/src/validators/quizValidators.js +++ b/src/validators/quizValidators.js @@ -56,6 +56,15 @@ const quizValidators = { .withMessage("맞춘 총 점수는 문자열이 아닌 정수여야 합니다.") .isInt({ min: 0 }) .withMessage("맞춘 총 점수는 0 이상의 정수여야 합니다."), + body("quizId") + .exists() + .withMessage("퀴즈ID가 존재해야 합니다.") + .notEmpty() + .withMessage("퀴즈ID는 비어 있을 수 없습니다.") + .custom(ensureInt) + .withMessage("퀴즈ID는 문자열이 아닌 정수여야 합니다.") + .isInt({ min: 0 }) + .withMessage("퀴즈ID는 0 이상의 정수여야 합니다."), ], }; From c7d04672c4258cf6350a5b4266b8e119a8f34493 Mon Sep 17 00:00:00 2001 From: Jake1152 Date: Fri, 13 Sep 2024 12:17:48 +0900 Subject: [PATCH 7/8] =?UTF-8?q?fix:=20=ED=80=B4=EC=A6=88=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=ED=8A=B8=EB=9E=9C=EC=A0=9D=EC=85=98,=20=EC=A0=84?= =?UTF-8?q?=EB=B6=80=20await=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/quizController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/quizController.js b/src/controllers/quizController.js index f7502c8..4867aa8 100644 --- a/src/controllers/quizController.js +++ b/src/controllers/quizController.js @@ -121,7 +121,7 @@ const saveQuizResult = async (req, res, next) => { ]); } - connection.commit(); + await connection.commit(); } catch (error) { console.error("퀴즈 결과 저장 트렌젝션 쿼리 에러 ,", err); await connection.rollback(); @@ -132,7 +132,7 @@ const saveQuizResult = async (req, res, next) => { return res.status(StatusCodes.NO_CONTENT).end(); } catch (err) { - console.error("퀴즈 결과 저장 쿼리 에러 ,", err); + console.error("퀴즈 결과 저장 트렌젝션 쿼리 에러 ,", err); next(err); } }; From 3ea235d6b90a6f0084b4a494d08a84dbde88e581 Mon Sep 17 00:00:00 2001 From: Jake1152 Date: Fri, 13 Sep 2024 12:27:29 +0900 Subject: [PATCH 8/8] =?UTF-8?q?fix:=20=ED=80=B4=EC=A6=88=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20api,=20=EB=A7=9E=ED=9E=8C=20=EA=B2=BD=EC=9A=B0?= =?UTF-8?q?=EB=A7=8C=20=ED=95=B4=EA=B2=B0=ED=95=9C=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=EB=A1=9C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/quizController.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/controllers/quizController.js b/src/controllers/quizController.js index 4867aa8..6fd77f6 100644 --- a/src/controllers/quizController.js +++ b/src/controllers/quizController.js @@ -112,7 +112,11 @@ const saveQuizResult = async (req, res, next) => { // 이전에 맞힌 적이 없다면 if (isSolved == false) { // 문제 풀었음을 표기 solved_quizzes - await connection.query(quizQuery.recordQuizSolved, [quizId, userNumId]); + if (solvedQuizCount === 1) + await connection.query(quizQuery.recordQuizSolved, [ + quizId, + userNumId, + ]); // 통계 데이터를 반영 quiz_accuracy_statistics; await connection.query(quizQuery.updateQuizStatistics, [ solvedQuizCount,