const express = require("express"); const Badge = require("../models/Badge"); const UserBadge = require("../models/UserBadge"); const auth = require("../middleware/auth"); const { asyncHandler } = require("../middleware/errorHandler"); const { getUserBadgeProgress } = require("../services/gamificationService"); const router = express.Router(); /** * GET /api/badges * Get all available badges */ router.get( "/", asyncHandler(async (req, res) => { const badges = await Badge.find().sort({ order: 1, rarity: 1 }); res.json(badges); }) ); /** * GET /api/badges/progress * Get current user's badge progress (requires authentication) */ router.get( "/progress", auth, asyncHandler(async (req, res) => { const progress = await getUserBadgeProgress(req.user.id); res.json(progress); }) ); /** * GET /api/users/:userId/badges * Get badges earned by a specific user */ router.get( "/users/:userId", asyncHandler(async (req, res) => { const { userId } = req.params; const userBadges = await UserBadge.find({ user: userId }) .populate("badge") .sort({ earnedAt: -1 }); res.json( userBadges.map((ub) => ({ badge: ub.badge, earnedAt: ub.earnedAt, progress: ub.progress, })) ); }) ); /** * GET /api/badges/:badgeId * Get a specific badge by ID */ router.get( "/:badgeId", asyncHandler(async (req, res) => { const { badgeId } = req.params; const badge = await Badge.findById(badgeId); if (!badge) { return res.status(404).json({ msg: "Badge not found" }); } res.json(badge); }) ); module.exports = router;