user API 기본 구성 완성

This commit is contained in:
fiore 2025-03-12 11:14:45 +09:00
parent c901886241
commit 9eb46f734f

View File

@ -19,19 +19,25 @@ router.get('/', function(req, res, next) {
// 회원 가입 // 회원 가입
router.post('/signup', async function (req, res, next) { router.post('/signup', async function (req, res, next) {
try { try {
var username = req.body.username; var email = req.body.email;
var password = req.body.password; var password = req.body.password;
var nickname = req.body.nickname; var nickname = req.body.nickname;
var profileImageIndex = req.body.imageindex ?? 0; var profileImageIndex = req.body.imageindex ?? 0;
// 입력값 검증 // 입력값 검증
if( !username || !password || !nickname ){ if( !email || !password || !nickname ){
return res.status(400).send("모든 필드를 입력하세요.") return res.status(400).send("모든 필드를 입력하세요.")
} }
// 이메일 형식 검증
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
return res.status(400).send("유효한 이메일 주소를 입력하세요.");
}
var database = req.app.get('database'); var database = req.app.get('database');
var users = database.collection('users'); var users = database.collection('users');
const existingUser = await users.findOne({username: username}) const existingUser = await users.findOne({username: email})
if(existingUser){ if(existingUser){
return res.status(409).send("이미 존재하는 사용자입니다.") return res.status(409).send("이미 존재하는 사용자입니다.")
} }
@ -42,12 +48,14 @@ router.post('/signup', async function (req, res, next) {
// 신규 유저를 DB에 저장 // 신규 유저를 DB에 저장
await users.insertOne({ await users.insertOne({
username: username, email: email,
password: hash, password: hash,
nickname: nickname, nickname: nickname,
profileImageIndex: profileImageIndex, profileImageIndex: profileImageIndex,
rating: 18, rating: 18,
score:0 score:0,
win:0,
lose:0
}); });
res.status(201).send("사용자가 성공적으로 생성되었습니다."); res.status(201).send("사용자가 성공적으로 생성되었습니다.");
@ -61,23 +69,23 @@ router.post('/signup', async function (req, res, next) {
// 로그인 // 로그인
router.post("/signin", async function (req, res, next) { router.post("/signin", async function (req, res, next) {
try { try {
var username = req.body.username; var email = req.body.email;
var password = req.body.password; var password = req.body.password;
var database = req.app.get('database'); var database = req.app.get('database');
var users = database.collection('users'); var users = database.collection('users');
// 입력값 검증 // 입력값 검증
if (!username || !password) { if (!email || !password) {
return res.status(400).send("모든 필드를 입력해주세요."); return res.status(400).send("모든 필드를 입력해주세요.");
} }
const existingUser = await users.findOne({username: username}); const existingUser = await users.findOne({email: email});
if(existingUser){ if(existingUser){
var compareResult = bcrypt.compareSync(password, existingUser.password); var compareResult = bcrypt.compareSync(password, existingUser.password);
if(compareResult){ if(compareResult){
req.session.isAuthenticated = true; req.session.isAuthenticated = true;
req.session.userId = existingUser._id.toString(); req.session.userId = existingUser._id.toString();
req.session.username = existingUser.username; req.session.email = existingUser.email;
req.session.nickname = existingUser.nickname; req.session.nickname = existingUser.nickname;
req.session.profileImageIndex = existingUser.profileImageIndex || 0; req.session.profileImageIndex = existingUser.profileImageIndex || 0;
req.session.rating = existingUser.rating; req.session.rating = existingUser.rating;
@ -113,17 +121,17 @@ router.post("/signout", async function (req, res, next) {
}); });
// 점수 추가 // 점수 추가
router.post("/addscore", async function (req, res, next) { router.post("/score-update", async function (req, res, next) {
try { try {
if(!req.session.isAuthenticated) { if(!req.session.isAuthenticated) {
return res.status(400).send("로그인이 필요합니다."); return res.status(400).send("로그인이 필요합니다.");
} }
var userId = req.session.userId; var userId = req.session.userId;
var addScore = req.body.score; var isWin = req.body.isWin;
// 점수 유효성 검사 // 점수 유효성 검사
if(!addScore || isNaN(addScore)) { if(!isWin || isNaN(isWin) || isWin > 1 || isWin < -1) {
return res.status(400).send("유효한 점수를 입력해주세요."); return res.status(400).send("유효한 점수를 입력해주세요.");
} }
@ -132,8 +140,16 @@ router.post("/addscore", async function (req, res, next) {
var findUser = await users.findOne({_id: ObjectId.createFromHexString(userId) }); var findUser = await users.findOne({_id: ObjectId.createFromHexString(userId) });
var userRating = findUser.rating; var userRating = findUser.rating;
var userScore = findUser.score + addScore; var userScore = findUser.score + isWin;
var winCount = findUser.win;
var loseCount = findUser.lose;
if (isWin > 0) {
winCount += 1;
} else {
loseCount += 1;
}
// 급수에 따른 필요 승급 포인트 결정 // 급수에 따른 필요 승급 포인트 결정
let requiredPoints; let requiredPoints;
@ -173,6 +189,8 @@ router.post("/addscore", async function (req, res, next) {
$set: { $set: {
rating: Number(userRating), rating: Number(userRating),
score: Number(userScore), score: Number(userScore),
win: winCount,
lose: loseCount,
updatedAt: new Date() updatedAt: new Date()
} }
} }
@ -186,6 +204,8 @@ router.post("/addscore", async function (req, res, next) {
message: "점수가 성공적으로 업데이트되었습니다.", message: "점수가 성공적으로 업데이트되었습니다.",
rating: Number(userRating), rating: Number(userRating),
score: Number(userScore), score: Number(userScore),
win: Number(winCount),
lose: Number(loseCount),
}); });
} catch(err) { } catch(err) {
@ -214,7 +234,6 @@ router.get("/score", async function (req, res, next) {
res.json({ res.json({
id: user._id.toString(), id: user._id.toString(),
username: user.username,
nickname: user.nickname, nickname: user.nickname,
rating: user.rating, rating: user.rating,
score: Number(user.score) || 0, score: Number(user.score) || 0,