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; // 승률 내림차순 정렬 }); res.json({ rating: userRating, leaderboardDatas : result ?? [] }); } catch(err) { console.error(err); res.status(500).send("서버 오류가 발생했습니다."); } }) module.exports = router;