const express = require('express'); const router = express.Router(); const quizController = require('../controllers/quiz.controller'); const { verifyToken } = require('../middleware/auth.middleware'); const { verifyGuestToken } = require('../middleware/guest.middleware'); /** * Middleware to handle both authenticated users and guests * Tries user auth first, then guest auth */ const authenticateUserOrGuest = async (req, res, next) => { // Try to verify user token first const authHeader = req.headers['authorization']; if (authHeader && authHeader.startsWith('Bearer ')) { try { await new Promise((resolve, reject) => { verifyToken(req, res, (err) => { if (err) reject(err); else resolve(); }); }); if (req.user) { return next(); } } catch (error) { // User auth failed, continue to guest auth } } // Try to verify guest token const guestToken = req.headers['x-guest-token']; if (guestToken) { try { await new Promise((resolve, reject) => { verifyGuestToken(req, res, (err) => { if (err) reject(err); else resolve(); }); }); if (req.guestId) { return next(); } } catch (error) { // Guest auth also failed } } // Neither authentication method worked return res.status(401).json({ success: false, message: 'Authentication required. Please login or start a guest session.' }); }; /** * @route POST /api/quiz/start * @desc Start a new quiz session * @access Private (User or Guest) * @body { * categoryId: uuid (required), * questionCount: number (1-50, default 10), * difficulty: 'easy' | 'medium' | 'hard' | 'mixed' (default 'mixed'), * quizType: 'practice' | 'timed' | 'exam' (default 'practice') * } */ router.post('/start', authenticateUserOrGuest, quizController.startQuizSession); /** * @route POST /api/quiz/submit * @desc Submit an answer for a quiz question * @access Private (User or Guest) * @body { * quizSessionId: uuid (required), * questionId: uuid (required), * userAnswer: string (required), * timeSpent: number (optional, seconds) * } */ router.post('/submit', authenticateUserOrGuest, quizController.submitAnswer); /** * @route POST /api/quiz/complete * @desc Complete a quiz session and get final results * @access Private (User or Guest) * @body { * sessionId: uuid (required) * } */ router.post('/complete', authenticateUserOrGuest, quizController.completeQuizSession); /** * @route GET /api/quiz/session/:sessionId * @desc Get quiz session details with questions and answers * @access Private (User or Guest) * @params { * sessionId: uuid (required) * } */ router.get('/session/:sessionId', authenticateUserOrGuest, quizController.getSessionDetails); /** * @route GET /api/quiz/review/:sessionId * @desc Review completed quiz with all answers, explanations, and visual feedback * @access Private (User or Guest) * @params { * sessionId: uuid (required) * } */ router.get('/review/:sessionId', authenticateUserOrGuest, quizController.reviewQuizSession); module.exports = router;