61 lines
2.1 KiB
JavaScript
61 lines
2.1 KiB
JavaScript
var express = require('express');
|
|
const {ObjectId} = require("mongodb");
|
|
var router = express.Router();
|
|
|
|
// 랭킹 조회
|
|
router.get("/", async function (req, res, next) {
|
|
try {
|
|
if(!req.session.isAuthenticated) {
|
|
return res.status(403).send("로그인이 필요합니다.");
|
|
}
|
|
|
|
var database = req.app.get('database');
|
|
var users = database.collection('users');
|
|
|
|
|
|
// 요청 유저 정보 확인
|
|
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();
|
|
|
|
// 승률 계산 및 정렬
|
|
var result = sameRatingUsers.map((user) => {
|
|
const totalGames = (user.win || 0) + (user.lose || 0);
|
|
const winRate = totalGames > 0 ? ((user.win || 0) / totalGames * 100) : 0;
|
|
|
|
return {
|
|
nickname: user.nickname,
|
|
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; // 승률 내림차순 정렬
|
|
});
|
|
|
|
console.log(userRating);
|
|
console.log(result);
|
|
res.json({
|
|
rating: userRating,
|
|
leaderboardDatas : result ?? []
|
|
});
|
|
} catch(err) {
|
|
console.error(err);
|
|
res.status(500).send("서버 오류가 발생했습니다.");
|
|
}
|
|
})
|
|
|
|
module.exports = router; |