// 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), }, };