오늘의 목표
더보기
✔️ 팀프로젝트 진행
⏱️ 오늘의 일정
9:00 ~ 21:00 팀프로젝트 진행
📜 팀프로젝트 진행
9:00 ~ 21:00 팀프로젝트 진행
팀프로젝트를 진행했다.
저번주 주말에 랭킹 조회를 구현했다.
랭킹 전체 조회
rankingRouter.get('/Ranking/AllCheck', async (req, res, next) => {
// rankingScore 컬럼을 기준으로 내림차순한 전체 데이터 값들을 가져옴
const currentRankings = await prisma.ranking.findMany({
orderBy: {
rankingScore: 'desc'
}
});
return res.status(200).json({ ... currentRankings });
});
ranking Table에 들어있는 값을 전부 읽어온다.
rankingScore 값을 기준으로 내림차순해서 클라이언트에게 전달한다.
특정 유저 랭킹 조회
rankingRouter.get('/Ranking/SingleCheck/:userId', async (req, res, next) => {
const { userId } = req.params;
const userRanking = await prisma.ranking.findFirst({
where: {
userId: +userId
}
})
return res.status(200).json({ userRanking });
});
조회하고자 하는 유저의 id값을 받아서 ranking table에 읽어온 후 클라이언트에게 전달한다.
DBRankingChangeScore ( 순위 변동 계산 )
export async function DBRankingChangeScore() {
const currentRankings = await prisma.ranking.findMany({
orderBy: {
rankingScore: 'desc'
}
});
// 순서대로 순회하며 랭킹 설정
let rank = 1;
currentRankings.map((currentRanking) => {
currentRanking.rank = rank;
rank++;
});
// 순위 변동 계산
for (let pRankKey in previousRankings) {
const pRankData = previousRankings[pRankKey];
for (let cRankKey in currentRankings) {
const cRankData = currentRankings[cRankKey];
if (pRankData.userId == cRankData.userId) {
const rankChangeScore = pRankData.rank - cRankData.rank;
cRankData.rankChangeScore = rankChangeScore;
break;
}
}
}
const rankingTableUpdateFinish = async (tx) => {
// ranking Table에 순위와 순위 변동을 기록
await Promise.all(
currentRankings.map(async (currentRanking) => {
await tx.ranking.update({
where: {
userId: currentRanking.userId
},
data: {
rank: currentRanking.rank,
rankChangeScore: currentRanking.rankChangeScore
}
})
})
);
};
await executeTransaction(rankingTableUpdateFinish);
// 현재 시점 순위 변동 저장
previousRankings = currentRankings;
}
이전 ranking table의 값과 DBRankingChangeScore을 호출했을 때의 ranking table의 값을 비교해서 순위변동을 계산하고,
DB에 저장한다.
app.js
DBRankingChangeScore();
setInterval(() => {
DBRankingChangeScore();
}, process.env.RANKING_RANK_CHANGE_TIME);
서버가 켜질때, 우선 DBRankingChangeScore()를 호출해서 랭킹 데이터를 최신화 시켜준다.
서버에서 정한 일정 시간마다 DBRankingChangeScore()를 호출해서 순위를 계산해준다.
프론트엔드는 아래와 같이 구성했다.
'내일배움캠프' 카테고리의 다른 글
[내일배움캠프][TIL] 34일차 - 팀 변경 (0) | 2024.09.26 |
---|---|
[내일배움캠프] 33일차 - 팀프로젝트 최종점검 (0) | 2024.09.24 |
[내일배움캠프][TIL] 31일차 - 팀 프로젝트 (0) | 2024.09.20 |
[내일배움캠프][TIL] 30일차 - 팀 프로젝트 (0) | 2024.09.19 |
[내일배움캠프][TIL] 29일차 - 팀 프로젝트 시작 (5) | 2024.09.14 |