/** * @copyright 2026 NHCarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { FastifyPluginAsync } from "fastify"; import type { LeaderboardResponse, SuggestionsLeaderboard, LikesLeaderboard, CommentsLeaderboard, OverallLeaderboard, } from "@library/shared-types"; import { LeaderboardService } from "../../services/leaderboard.service"; const leaderboardRoutes: FastifyPluginAsync = async (app) => { const leaderboardService = new LeaderboardService(); /** * Get all leaderboards at once. */ app.get<{ Querystring: { limit?: number }; Reply: LeaderboardResponse; }>("/", async (request) => { const limit = request.query.limit && request.query.limit > 0 ? Math.min(request.query.limit, 100) : 25; return leaderboardService.getAllLeaderboards(limit); }); /** * Get top users by suggestions. */ app.get<{ Querystring: { limit?: number }; Reply: SuggestionsLeaderboard[]; }>("/suggestions", async (request) => { const limit = request.query.limit && request.query.limit > 0 ? Math.min(request.query.limit, 100) : 25; return leaderboardService.getTopSuggestions(limit); }); /** * Get top users by likes. */ app.get<{ Querystring: { limit?: number }; Reply: LikesLeaderboard[]; }>("/likes", async (request) => { const limit = request.query.limit && request.query.limit > 0 ? Math.min(request.query.limit, 100) : 25; return leaderboardService.getTopLikes(limit); }); /** * Get top users by comments. */ app.get<{ Querystring: { limit?: number }; Reply: CommentsLeaderboard[]; }>("/comments", async (request) => { const limit = request.query.limit && request.query.limit > 0 ? Math.min(request.query.limit, 100) : 25; return leaderboardService.getTopComments(limit); }); /** * Get overall leaderboard. */ app.get<{ Querystring: { limit?: number }; Reply: OverallLeaderboard[]; }>("/overall", async (request) => { const limit = request.query.limit && request.query.limit > 0 ? Math.min(request.query.limit, 100) : 25; return leaderboardService.getOverallLeaderboard(limit); }); }; export default leaderboardRoutes;