const express = require('express'); const router = express.Router(); const categoryController = require('../controllers/category.controller'); const authMiddleware = require('../middleware/auth.middleware'); const { cacheCategories, cacheSingleCategory, invalidateCacheMiddleware, invalidateCache } = require('../middleware/cache'); /** * @swagger * /categories: * get: * summary: Get all active categories * description: Guest users see only guest-accessible categories, authenticated users see all * tags: [Categories] * security: [] * responses: * 200: * description: Categories retrieved successfully * content: * application/json: * schema: * type: array * items: * $ref: '#/components/schemas/Category' * 500: * description: Server error * post: * summary: Create new category * tags: [Categories] * security: * - bearerAuth: [] * requestBody: * required: true * content: * application/json: * schema: * type: object * required: * - name * properties: * name: * type: string * example: JavaScript Fundamentals * description: * type: string * example: Core JavaScript concepts and syntax * requiresAuth: * type: boolean * default: false * isActive: * type: boolean * default: true * responses: * 201: * description: Category created successfully * 401: * $ref: '#/components/responses/UnauthorizedError' * 403: * $ref: '#/components/responses/ForbiddenError' * * /categories/{id}: * get: * summary: Get category details with question preview and stats * tags: [Categories] * security: [] * parameters: * - in: path * name: id * required: true * schema: * type: integer * description: Category ID * responses: * 200: * description: Category details retrieved successfully * content: * application/json: * schema: * $ref: '#/components/schemas/Category' * 404: * $ref: '#/components/responses/NotFoundError' * put: * summary: Update category * tags: [Categories] * security: * - bearerAuth: [] * parameters: * - in: path * name: id * required: true * schema: * type: integer * requestBody: * content: * application/json: * schema: * type: object * properties: * name: * type: string * description: * type: string * requiresAuth: * type: boolean * isActive: * type: boolean * responses: * 200: * description: Category updated successfully * 401: * $ref: '#/components/responses/UnauthorizedError' * 403: * $ref: '#/components/responses/ForbiddenError' * 404: * $ref: '#/components/responses/NotFoundError' * delete: * summary: Delete category (soft delete) * tags: [Categories] * security: * - bearerAuth: [] * parameters: * - in: path * name: id * required: true * schema: * type: integer * responses: * 200: * description: Category deleted successfully * 401: * $ref: '#/components/responses/UnauthorizedError' * 403: * $ref: '#/components/responses/ForbiddenError' * 404: * $ref: '#/components/responses/NotFoundError' */ router.get('/', authMiddleware.optionalAuth, cacheCategories, categoryController.getAllCategories); router.get('/:id', authMiddleware.optionalAuth, cacheSingleCategory, categoryController.getCategoryById); router.post('/', authMiddleware.verifyToken, authMiddleware.isAdmin, invalidateCacheMiddleware(() => invalidateCache.category()), categoryController.createCategory); router.put('/:id', authMiddleware.verifyToken, authMiddleware.isAdmin, invalidateCacheMiddleware((req) => invalidateCache.category(req.params.id)), categoryController.updateCategory); router.delete('/:id', authMiddleware.verifyToken, authMiddleware.isAdmin, invalidateCacheMiddleware((req) => invalidateCache.category(req.params.id)), categoryController.deleteCategory); module.exports = router;