Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions controller/quizController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
const axios = require('axios');
const Quiz = require('../schema/quiz');
const mongoose = require('mongoose')
// 퀴즈 조회
exports.getQuiz = async (req, res) => {
const { id } = req.params;
const {index} = req.body
try {
const quiz = await Quiz.findOne({id});
if (quiz) {
const wordList = quiz.question

res.status(200).json({ words: wordList, index, id});
} else {
res.status(404).json({ message: "잘못된 요청입니다." });
}
} catch (err) {
res.status(500).json({ message: "서버 오류입니다.", error: err });
}
};

// 퀴즈 제출
exports.submitQuiz = async (req, res) => {
const { answer } = req.body;
const { id } = req.params;
const user = req.user;

try {
const quiz = await Quiz.findOne({id});
if (!quiz) {
return res.status(404).json({ message: "퀴즈가 없습니다." });
}
if (quiz.answer == answer) {
try {
const fruitResponse = await axios.post('http://localhost:8080/tree/fruit', user); // 절대 URL로 변경
res.status(200).json({
message: "정답입니다."
});
} catch (error) {
res.status(500).json({
message: "정답이지만 fruit API 요청 중 오류 발생.",
error: error.message
});
}
} else {
res.status(200).json({
message: "틀렸습니다.",
correctAnswer: quiz.answer
});
}
} catch (err) {
res.status(500).json({ message: "서버 오류입니다.", error: err });
}
};

//인덱스 잘라서 주기
69 changes: 66 additions & 3 deletions controller/userController.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,68 @@
const User = require("../schema/user"); // User 모델 가져오기
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");

exports.login = async(req, res, next) => {

}
exports.login = async (req, res) => {
const { username, password } = req.body;

try {
// 1. 사용자 찾기
const user = await User.findOne({ username });
if (!user) {
return res.status(400).json({ message: "Invalid username or password" });
}

// 2. 비밀번호 비교
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(400).json({ message: "Invalid username or password" });
}

// 3. JWT 토큰 발급
const token = jwt.sign(
{ username: user.username },
"your_jwt_secret", // 비밀키 (환경 변수로 관리하는 것이 좋습니다)
{ expiresIn: "1h" } // 토큰 유효기간
);

// 액세스 토큰을 Authorization 헤더에 추가
res.setHeader("Authorization", `Bearer ${accessToken}`);

// 4. 토큰 반환
return res.status(200).json({ token });

} catch (error) {
console.error(error);
res.status(500).json({ message: "Server error" });
}
};

exports.signup = async (req, res) => {
const { username, password } = req.body;

try {
// 1. 사용자 중복 검사
const existingUser = await User.findOne({ username });
if (existingUser) {
return res.status(400).json({ message: "Username already exists" });
}

// 2. 비밀번호 해싱
const hashedPassword = await bcrypt.hash(password, 10);

// 3. 새로운 사용자 생성 및 저장
const newUser = new User({
username,
password: hashedPassword
});

await newUser.save();

// 5. 응답으로 회원정보 반환
return res.status(201).json({ newUser });

} catch (error) {
console.error(error);
res.status(500).json({ message: "Server error" });
}
};
21 changes: 21 additions & 0 deletions controller/userInfoController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const axios = require('axios');
const User = require('../schema/user');
const mongoose = require('mongoose')
// 퀴즈 조회
exports.info = async (req, res) => {
const {userID} = req.body
try {

const user = await User.findOne({ userID : userID})
if (user) {
res.status(200).json({
name : user.username,
password : user.password,
nickname : user.nickname});
} else {
res.status(404).json({ message: "잘못된 요청입니다." });
}
} catch (err) {
res.status(500).json({ message: "서버 오류입니다.", error: err });
}
};
36 changes: 24 additions & 12 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,32 @@
const express = require("express")
const app = express()
// router import
const express = require("express");
const mongoose = require("mongoose");
const app = express();
require('dotenv').config();


// 미들웨어 설정
app.use(express.json());
app.use(cors());

// MongoDB 연결
mongoose.connect('mongodb://127.0.0.1:27017/youtube', {
// MongoDB 연결 (.env 파일에서 MongoDB URI 가져오기)
mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
}).then(() => {
console.log('MongoDB connected');
}).catch((err) => {
console.error('MongoDB connection error:', err);
});

// use router
app.use()
// 라우터 사용
const indexRouter = require("./routes/indexRouter");
const userRouter = require('./routes/userRouter');
const userInfoRouter = require('./routes/userInfoRouter')

app.listen(3000, () => {
console.log("server on in http://localhost:3000");

})
app.use("/", indexRouter);
app.use("/user", userRouter); // 예: /user 경로에서 userRouter 사용
app.use("/info", userInfoRouter)
// 서버 시작
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
26 changes: 26 additions & 0 deletions middlewares/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const jwt = require("jsonwebtoken");

//로그인했는지 검사
function authenticateJWT(req, res, next) {
const authHeader = req.headers.authorization;

if (authHeader) {
const token = authHeader.split(" ")[1];

jwt.verify(token, process.env.SECRETKEY, (err, user) => {
if (err) {
return res.sendStatus(403).send({ message: '토큰 검증 실패' }); // Forbidden: Invalid token
}
if(!allowedRoles.includes(user.role)) {
return res.status(403).send({ message: '권한이 없습니다.' });
}

req.user = user;
next(); // 토큰이 유효한 경우, 다음 미들웨어나 라우트 핸들러로 이동
});
} else {
res.sendStatus(401); // Unauthorized: No token provided
}
}

module.exports = { authenticateJWT };
Loading