36 lines
1.1 KiB
JavaScript
36 lines
1.1 KiB
JavaScript
// Leaderboard routes: GET /api/leaderboard?type=level|gold|kills&page=1
|
|
const zod = require('zod');
|
|
const { AppError } = require('../utils/errors');
|
|
const { requireAuth } = require('../middleware/session');
|
|
const { getLeaderboard } = require('../services/leaderboardService');
|
|
|
|
function wrap(fn) {
|
|
return (req, res, next) => Promise.resolve(fn(req, res, next)).catch(next);
|
|
}
|
|
|
|
const VALID_TYPES = ['level', 'gold', 'kills'];
|
|
|
|
/**
|
|
* GET /api/leaderboard — return ranked leaderboard entries.
|
|
*/
|
|
async function handleLeaderboard(req, res) {
|
|
const parsed = zod.strictObject({
|
|
type: zod.enum(VALID_TYPES),
|
|
page: zod.coerce.number().int().min(1).default(1),
|
|
limit: zod.coerce.number().int().min(1).max(50).default(50),
|
|
}).safeParse(req.query);
|
|
if (!parsed.success) {
|
|
throw new AppError('VALIDATION_ERROR', 'Request validation failed.', 400);
|
|
}
|
|
|
|
const { type, page, limit } = parsed.data;
|
|
const result = getLeaderboard(type, page, limit);
|
|
res.json({ ok: true, data: result });
|
|
}
|
|
|
|
module.exports = {
|
|
routes: {
|
|
getLeaderboard: wrap(handleLeaderboard),
|
|
},
|
|
};
|