Merge branch 'main' into quest

This commit is contained in:
Lin, Hung-Shin authored and GitHub committed 2023-11-23 23:40:03 +08:00
commit 93e2485dee
18 files changed
+315 -29

No files matched your search

@@ -0,0 +1,12 @@
import { asyncHandler } from '../../middleware/error.js'
import { leaderboard } from '../../models/userManager.js'
export default asyncHandler(async (req, res) => {
const users = await leaderboard()
const response = users.map((user) => ({
username: user.user.username,
completedQuests: user.completedQuests,
score: user.score * 1000,
}))
res.json(response)
})
+3
View File
@@ -7,6 +7,7 @@ import authRouter from './authRouter.js'
import authRequired from '../../middleware/authRequired.js'
import userRouter from './userRouter.js'
import config from '../../config.js'
import leaderboardController from '../controllers/leaderboardController.js'
const router = Router()
@@ -48,4 +49,6 @@ router.get('/bug-report', (req, res) => {
res.redirect(config.bugReportUrl)
})
router.get('/leaderboard', leaderboardController)
export default router
+43
View File
@@ -22,3 +22,46 @@ export async function createUser(username, email, { password, socialLogin }) {
return user
}
export function leaderboard() {
return UserProfile.aggregate([
{
$project: {
user: true, // Include the user field in the projection
completedQuests: {
$map: {
input: {
$filter: {
input: { $objectToArray: '$progress' }, // Convert the progress map to an array
as: 'prog',
cond: { $eq: ['$$prog.v.completed', true] }, // Filter for completed quests
},
},
as: 'completedProg',
in: '$$completedProg.k', // Extract the quest IDs
},
},
},
},
{
$addFields: {
score: { $size: '$completedQuests' }, // Calculate the size of the completedQuests array
},
},
{
$match: {
score: { $gt: 0 }, // Filter out users who haven't completed any quests
},
},
{ $sort: { score: -1 } },
{
$lookup: {
from: 'users',
localField: 'user',
foreignField: '_id',
as: 'user',
},
},
{ $unwind: '$user' },
])
}