add changes

This commit is contained in:
AD2025
2025-11-12 23:06:27 +02:00
parent c664d0a341
commit ec6534fcc2
42 changed files with 11854 additions and 299 deletions

View File

@@ -4,37 +4,333 @@ const userController = require('../controllers/user.controller');
const { verifyToken } = require('../middleware/auth.middleware');
/**
* @route GET /api/users/:userId/dashboard
* @desc Get user dashboard with stats, recent sessions, and category performance
* @access Private (User - own dashboard only)
* @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);
/**
* @route GET /api/users/:userId/history
* @desc Get user quiz history with pagination, filtering, and sorting
* @query page - Page number (default: 1)
* @query limit - Items per page (default: 10, max: 50)
* @query category - Filter by category ID
* @query status - Filter by status (completed, timeout, abandoned)
* @query startDate - Filter by start date (ISO 8601)
* @query endDate - Filter by end date (ISO 8601)
* @query sortBy - Sort by field (date, score) (default: date)
* @query sortOrder - Sort order (asc, desc) (default: desc)
* @access Private (User - own history only)
* @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);
/**
* @route PUT /api/users/:userId
* @desc Update user profile
* @body username - New username (optional)
* @body email - New email (optional)
* @body currentPassword - Current password (required if changing password)
* @body newPassword - New password (optional)
* @body profileImage - Profile image URL (optional)
* @access Private (User - own profile only)
* @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;