Merge pull request #2 from Degulleo/DO-17-서버-리더보드-조화-기능-추가
리더보드 조회 기능 추가
This commit is contained in:
commit
2b16048333
@ -1,4 +1,5 @@
|
|||||||
var express = require('express');
|
var express = require('express');
|
||||||
|
const {ObjectId} = require("mongodb");
|
||||||
var router = express.Router();
|
var router = express.Router();
|
||||||
|
|
||||||
// 랭킹 조회
|
// 랭킹 조회
|
||||||
@ -11,20 +12,44 @@ router.get("/", async function (req, res, next) {
|
|||||||
var database = req.app.get('database');
|
var database = req.app.get('database');
|
||||||
var users = database.collection('users');
|
var users = database.collection('users');
|
||||||
|
|
||||||
var allUsers = await users
|
|
||||||
.find({ }, { projection: { username:1, nickname: 1, score: 1 } })
|
// 요청 유저 정보 확인
|
||||||
.sort({ score: -1 }) // 점수가 높은 순으로 정렬
|
var userId = req.session.userId;
|
||||||
|
const user = await users.findOne({_id: ObjectId.createFromHexString(userId) });
|
||||||
|
var userRating = user.rating;
|
||||||
|
|
||||||
|
// 동일한 rating을 가진 유저들만 필터링
|
||||||
|
var sameRatingUsers = await users
|
||||||
|
.find({ rating: userRating }, { projection: { nickname: 1, score: 1, win: 1, lose: 1, profileImageIndex:1, rating: 1 } })
|
||||||
.toArray();
|
.toArray();
|
||||||
|
|
||||||
var result = allUsers.map((user) => (
|
// 승률 계산 및 정렬
|
||||||
{
|
var result = sameRatingUsers.map((user) => {
|
||||||
username: user.username,
|
const totalGames = (user.win || 0) + (user.lose || 0);
|
||||||
|
const winRate = totalGames > 0 ? ((user.win || 0) / totalGames * 100) : 0;
|
||||||
|
|
||||||
|
return {
|
||||||
nickname: user.nickname,
|
nickname: user.nickname,
|
||||||
score: user.score || 0,
|
score: user.score || 0,
|
||||||
}
|
win: user.win || 0,
|
||||||
))
|
lose: user.lose || 0,
|
||||||
|
winRate: parseFloat(winRate.toFixed(2)), // 소수점 2자리까지 표시
|
||||||
|
totalGames: totalGames,
|
||||||
|
imageindex: user.profileImageIndex,
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.sort((a, b) => {
|
||||||
|
// 승률이 같은 경우 총 게임 수가 많은 사람이 위에 오도록 정렬
|
||||||
|
if (b.winRate === a.winRate) {
|
||||||
|
return b.totalGames - a.totalGames;
|
||||||
|
}
|
||||||
|
return b.winRate - a.winRate; // 승률 내림차순 정렬
|
||||||
|
});
|
||||||
|
|
||||||
res.json({ leaderboardDatas : result ?? [] });
|
res.json({
|
||||||
|
rating: userRating,
|
||||||
|
leaderboardDatas : result ?? []
|
||||||
|
});
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
res.status(500).send("서버 오류가 발생했습니다.");
|
res.status(500).send("서버 오류가 발생했습니다.");
|
||||||
|
@ -5,7 +5,7 @@ const {ObjectId} = require("mongodb");
|
|||||||
var saltRounds = 10;
|
var saltRounds = 10;
|
||||||
|
|
||||||
var ResponseType = {
|
var ResponseType = {
|
||||||
INVALID_USERNAME: 0,
|
INVALID_EMAIL: 0,
|
||||||
INVALID_PASSWORD: 1,
|
INVALID_PASSWORD: 1,
|
||||||
SUCCESS: 2
|
SUCCESS: 2
|
||||||
}
|
}
|
||||||
@ -37,7 +37,7 @@ router.post('/signup', async function (req, res, next) {
|
|||||||
|
|
||||||
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: email})
|
const existingUser = await users.findOne({email: email})
|
||||||
if(existingUser){
|
if(existingUser){
|
||||||
return res.status(409).send("이미 존재하는 사용자입니다.")
|
return res.status(409).send("이미 존재하는 사용자입니다.")
|
||||||
}
|
}
|
||||||
@ -55,7 +55,8 @@ router.post('/signup', async function (req, res, next) {
|
|||||||
rating: 18,
|
rating: 18,
|
||||||
score:0,
|
score:0,
|
||||||
win:0,
|
win:0,
|
||||||
lose:0
|
lose:0,
|
||||||
|
coin: 1000
|
||||||
});
|
});
|
||||||
|
|
||||||
res.status(201).send("사용자가 성공적으로 생성되었습니다.");
|
res.status(201).send("사용자가 성공적으로 생성되었습니다.");
|
||||||
@ -90,18 +91,20 @@ router.post("/signin", async function (req, res, next) {
|
|||||||
req.session.profileImageIndex = existingUser.profileImageIndex || 0;
|
req.session.profileImageIndex = existingUser.profileImageIndex || 0;
|
||||||
req.session.rating = existingUser.rating;
|
req.session.rating = existingUser.rating;
|
||||||
req.session.score = existingUser.score;
|
req.session.score = existingUser.score;
|
||||||
|
req.session.coin = existingUser.coin;
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
result: ResponseType.SUCCESS,
|
result: ResponseType.SUCCESS,
|
||||||
imageindex: existingUser.imageindex,
|
imageindex: existingUser.imageindex,
|
||||||
rating: existingUser.rating,
|
rating: existingUser.rating,
|
||||||
score: existingUser.score,
|
score: existingUser.score,
|
||||||
|
coin: existingUser.coin,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
res.json({result : ResponseType.INVALID_PASSWORD});
|
res.json({result : ResponseType.INVALID_PASSWORD});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
res.json({result : ResponseType.INVALID_USERNAME});
|
res.json({result : ResponseType.INVALID_EMAIL});
|
||||||
}
|
}
|
||||||
}catch (err){
|
}catch (err){
|
||||||
console.log("로그인 중 오류 발생 : ", err);
|
console.log("로그인 중 오류 발생 : ", err);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user