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