add changes
This commit is contained in:
336
routes/user.routes.js
Normal file
336
routes/user.routes.js
Normal file
@@ -0,0 +1,336 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user