143 lines
4.6 KiB
JavaScript
143 lines
4.6 KiB
JavaScript
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;
|