const express = require('express'); const router = express.Router(); const userController = require('../controllers/user.controller'); const { verifyToken } = require('../middleware/auth.middleware'); /** * @swagger * /users/{userId}/dashboard: * get: * summary: Get user dashboard with statistics and recent activity * tags: [Users] * security: * - bearerAuth: [] * parameters: * - in: path * name: userId * required: true * schema: * type: integer * description: User ID * responses: * 200: * description: Dashboard data retrieved successfully * content: * application/json: * schema: * type: object * properties: * stats: * type: object * properties: * totalQuizzes: * type: integer * example: 25 * completedQuizzes: * type: integer * example: 20 * averageScore: * type: number * example: 85.5 * totalTimeSpent: * type: integer * description: Total time in minutes * example: 120 * recentSessions: * type: array * items: * $ref: '#/components/schemas/QuizSession' * categoryPerformance: * type: array * items: * type: object * properties: * categoryName: * type: string * quizCount: * type: integer * averageScore: * type: number * 401: * $ref: '#/components/responses/UnauthorizedError' * 403: * description: Can only access own dashboard * 404: * $ref: '#/components/responses/NotFoundError' */ router.get('/:userId/dashboard', verifyToken, userController.getUserDashboard); /** * @swagger * /users/{userId}/history: * get: * summary: Get user quiz history with pagination and filtering * tags: [Users] * security: * - bearerAuth: [] * parameters: * - in: path * name: userId * required: true * schema: * type: integer * description: User ID * - in: query * name: page * schema: * type: integer * default: 1 * description: Page number * - in: query * name: limit * schema: * type: integer * default: 10 * maximum: 50 * description: Items per page * - in: query * name: category * schema: * type: integer * description: Filter by category ID * - in: query * name: status * schema: * type: string * enum: [completed, timeout, abandoned] * description: Filter by quiz status * - in: query * name: startDate * schema: * type: string * format: date-time * description: Filter by start date (ISO 8601) * - in: query * name: endDate * schema: * type: string * format: date-time * description: Filter by end date (ISO 8601) * - in: query * name: sortBy * schema: * type: string * enum: [date, score] * default: date * description: Sort by field * - in: query * name: sortOrder * schema: * type: string * enum: [asc, desc] * default: desc * description: Sort order * responses: * 200: * description: Quiz history retrieved successfully * content: * application/json: * schema: * type: object * properties: * quizzes: * type: array * items: * $ref: '#/components/schemas/QuizSession' * pagination: * type: object * properties: * currentPage: * type: integer * totalPages: * type: integer * totalItems: * type: integer * itemsPerPage: * type: integer * 401: * $ref: '#/components/responses/UnauthorizedError' * 403: * description: Can only access own history */ router.get('/:userId/history', verifyToken, userController.getQuizHistory); /** * @swagger * /users/{userId}: * put: * summary: Update user profile * tags: [Users] * security: * - bearerAuth: [] * parameters: * - in: path * name: userId * required: true * schema: * type: integer * description: User ID * requestBody: * content: * application/json: * schema: * type: object * properties: * username: * type: string * minLength: 3 * maxLength: 50 * email: * type: string * format: email * currentPassword: * type: string * description: Required if changing password * newPassword: * type: string * minLength: 6 * profileImage: * type: string * responses: * 200: * description: Profile updated successfully * 401: * $ref: '#/components/responses/UnauthorizedError' * 403: * description: Can only update own profile */ router.put('/:userId', verifyToken, userController.updateUserProfile); /** * @swagger * /users/{userId}/bookmarks: * get: * summary: Get user's bookmarked questions * tags: [Bookmarks] * security: * - bearerAuth: [] * parameters: * - in: path * name: userId * required: true * schema: * type: integer * - in: query * name: page * schema: * type: integer * default: 1 * - in: query * name: limit * schema: * type: integer * default: 10 * maximum: 50 * - in: query * name: category * schema: * type: integer * description: Filter by category ID * - in: query * name: difficulty * schema: * type: string * enum: [easy, medium, hard] * - in: query * name: sortBy * schema: * type: string * enum: [date, difficulty] * default: date * - in: query * name: sortOrder * schema: * type: string * enum: [asc, desc] * default: desc * responses: * 200: * description: Bookmarks retrieved successfully * content: * application/json: * schema: * type: object * properties: * bookmarks: * type: array * items: * $ref: '#/components/schemas/Bookmark' * pagination: * type: object * 401: * $ref: '#/components/responses/UnauthorizedError' * post: * summary: Add a question to bookmarks * tags: [Bookmarks] * security: * - bearerAuth: [] * parameters: * - in: path * name: userId * required: true * schema: * type: integer * requestBody: * required: true * content: * application/json: * schema: * type: object * required: * - questionId * properties: * questionId: * type: integer * description: Question ID to bookmark * notes: * type: string * description: Optional notes about the bookmark * responses: * 201: * description: Bookmark added successfully * 401: * $ref: '#/components/responses/UnauthorizedError' * 409: * description: Question already bookmarked * * /users/{userId}/bookmarks/{questionId}: * delete: * summary: Remove a question from bookmarks * tags: [Bookmarks] * security: * - bearerAuth: [] * parameters: * - in: path * name: userId * required: true * schema: * type: integer * - in: path * name: questionId * required: true * schema: * type: integer * responses: * 200: * description: Bookmark removed successfully * 401: * $ref: '#/components/responses/UnauthorizedError' * 404: * description: Bookmark not found */ router.get('/:userId/bookmarks', verifyToken, userController.getUserBookmarks); router.post('/:userId/bookmarks', verifyToken, userController.addBookmark); router.delete('/:userId/bookmarks/:questionId', verifyToken, userController.removeBookmark); module.exports = router;