You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
589 lines
16 KiB
589 lines
16 KiB
const express = require('express');
|
|
const router = express.Router();
|
|
const menuCategoryController = require('../controllers/menuCategoryController');
|
|
|
|
/**
|
|
* @swagger
|
|
* components:
|
|
* schemas:
|
|
* MenuCategory:
|
|
* type: object
|
|
* required:
|
|
* - nom
|
|
* properties:
|
|
* id:
|
|
* type: integer
|
|
* description: Auto-generated ID
|
|
* nom:
|
|
* type: string
|
|
* maxLength: 100
|
|
* description: Category name
|
|
* description:
|
|
* type: string
|
|
* description: Category description
|
|
* ordre:
|
|
* type: integer
|
|
* default: 0
|
|
* description: Display order
|
|
* actif:
|
|
* type: boolean
|
|
* default: true
|
|
* description: Active status
|
|
* created_at:
|
|
* type: string
|
|
* format: date-time
|
|
* description: Creation timestamp
|
|
* updated_at:
|
|
* type: string
|
|
* format: date-time
|
|
* description: Last update timestamp
|
|
* example:
|
|
* id: 1
|
|
* nom: "Entrées"
|
|
* description: "Plats d'entrée"
|
|
* ordre: 1
|
|
* actif: true
|
|
* created_at: "2024-01-01T10:00:00Z"
|
|
* updated_at: "2024-01-01T10:00:00Z"
|
|
*
|
|
* MenuCategoryInput:
|
|
* type: object
|
|
* required:
|
|
* - nom
|
|
* properties:
|
|
* nom:
|
|
* type: string
|
|
* maxLength: 100
|
|
* description: Category name
|
|
* description:
|
|
* type: string
|
|
* description: Category description
|
|
* ordre:
|
|
* type: integer
|
|
* default: 0
|
|
* description: Display order
|
|
* actif:
|
|
* type: boolean
|
|
* default: true
|
|
* description: Active status
|
|
* example:
|
|
* nom: "Desserts"
|
|
* description: "Desserts et pâtisseries"
|
|
* ordre: 3
|
|
* actif: true
|
|
*
|
|
* Error:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: false
|
|
* message:
|
|
* type: string
|
|
* example: "Error message"
|
|
* error:
|
|
* type: string
|
|
* example: "Detailed error information"
|
|
*/
|
|
|
|
/**
|
|
* @swagger
|
|
* tags:
|
|
* name: Menu Categories
|
|
* description: Menu category management endpoints
|
|
*/
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories:
|
|
* get:
|
|
* summary: Get all menu categories
|
|
* tags: [Menu Categories]
|
|
* parameters:
|
|
* - in: query
|
|
* name: page
|
|
* schema:
|
|
* type: integer
|
|
* default: 1
|
|
* description: Page number for pagination
|
|
* - in: query
|
|
* name: limit
|
|
* schema:
|
|
* type: integer
|
|
* default: 10
|
|
* description: Number of items per page
|
|
* - in: query
|
|
* name: search
|
|
* schema:
|
|
* type: string
|
|
* description: Search term for category name or description
|
|
* - in: query
|
|
* name: actif
|
|
* schema:
|
|
* type: boolean
|
|
* description: Filter by active status
|
|
* - in: query
|
|
* name: sort_by
|
|
* schema:
|
|
* type: string
|
|
* enum: [nom, ordre, created_at]
|
|
* default: ordre
|
|
* description: Field to sort by
|
|
* - in: query
|
|
* name: sort_order
|
|
* schema:
|
|
* type: string
|
|
* enum: [ASC, DESC]
|
|
* default: ASC
|
|
* description: Sort order
|
|
* responses:
|
|
* 200:
|
|
* description: List of menu categories retrieved successfully
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* data:
|
|
* type: object
|
|
* properties:
|
|
* categories:
|
|
* type: array
|
|
* items:
|
|
* $ref: '#/components/schemas/MenuCategory'
|
|
* pagination:
|
|
* type: object
|
|
* properties:
|
|
* currentPage:
|
|
* type: integer
|
|
* totalPages:
|
|
* type: integer
|
|
* totalItems:
|
|
* type: integer
|
|
* itemsPerPage:
|
|
* type: integer
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.get('/', menuCategoryController.getAllCategories);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories/active:
|
|
* get:
|
|
* summary: Get all active menu categories (simplified)
|
|
* tags: [Menu Categories]
|
|
* responses:
|
|
* 200:
|
|
* description: List of active menu categories
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* data:
|
|
* type: array
|
|
* items:
|
|
* $ref: '#/components/schemas/MenuCategory'
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.get('/active', menuCategoryController.getActiveCategories);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories/stats:
|
|
* get:
|
|
* summary: Get menu categories statistics
|
|
* tags: [Menu Categories]
|
|
* responses:
|
|
* 200:
|
|
* description: Categories statistics
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* data:
|
|
* type: object
|
|
* properties:
|
|
* total:
|
|
* type: integer
|
|
* description: Total number of categories
|
|
* active:
|
|
* type: integer
|
|
* description: Number of active categories
|
|
* inactive:
|
|
* type: integer
|
|
* description: Number of inactive categories
|
|
* totalMenus:
|
|
* type: integer
|
|
* description: Total number of menus across all categories
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.get('/stats', menuCategoryController.getCategoryStats);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories/{id}:
|
|
* get:
|
|
* summary: Get menu category by ID
|
|
* tags: [Menu Categories]
|
|
* parameters:
|
|
* - in: path
|
|
* name: id
|
|
* required: true
|
|
* schema:
|
|
* type: integer
|
|
* description: Category ID
|
|
* responses:
|
|
* 200:
|
|
* description: Menu category found
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* data:
|
|
* $ref: '#/components/schemas/MenuCategory'
|
|
* 404:
|
|
* description: Category not found
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.get('/:id', menuCategoryController.getCategoryById);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories/{id}/menus:
|
|
* get:
|
|
* summary: Get all menus in a category
|
|
* tags: [Menu Categories]
|
|
* parameters:
|
|
* - in: path
|
|
* name: id
|
|
* required: true
|
|
* schema:
|
|
* type: integer
|
|
* description: Category ID
|
|
* - in: query
|
|
* name: actif
|
|
* schema:
|
|
* type: boolean
|
|
* description: Filter menus by active status
|
|
* responses:
|
|
* 200:
|
|
* description: Menus in category retrieved successfully
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* data:
|
|
* type: object
|
|
* properties:
|
|
* category:
|
|
* $ref: '#/components/schemas/MenuCategory'
|
|
* menus:
|
|
* type: array
|
|
* items:
|
|
* type: object
|
|
* 404:
|
|
* description: Category not found
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.get('/:id/menus', menuCategoryController.getCategoryMenus);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories:
|
|
* post:
|
|
* summary: Create a new menu category
|
|
* tags: [Menu Categories]
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/MenuCategoryInput'
|
|
* responses:
|
|
* 201:
|
|
* description: Category created successfully
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* message:
|
|
* type: string
|
|
* example: "Catégorie créée avec succès"
|
|
* data:
|
|
* $ref: '#/components/schemas/MenuCategory'
|
|
* 400:
|
|
* description: Validation error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.post('/', menuCategoryController.createCategory);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories/{id}:
|
|
* put:
|
|
* summary: Update menu category
|
|
* tags: [Menu Categories]
|
|
* parameters:
|
|
* - in: path
|
|
* name: id
|
|
* required: true
|
|
* schema:
|
|
* type: integer
|
|
* description: Category ID
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/MenuCategoryInput'
|
|
* responses:
|
|
* 200:
|
|
* description: Category updated successfully
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* message:
|
|
* type: string
|
|
* example: "Catégorie mise à jour avec succès"
|
|
* data:
|
|
* $ref: '#/components/schemas/MenuCategory'
|
|
* 400:
|
|
* description: Validation error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 404:
|
|
* description: Category not found
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.put('/:id', menuCategoryController.updateCategory);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories/{id}/toggle-status:
|
|
* patch:
|
|
* summary: Toggle category active status
|
|
* tags: [Menu Categories]
|
|
* parameters:
|
|
* - in: path
|
|
* name: id
|
|
* required: true
|
|
* schema:
|
|
* type: integer
|
|
* description: Category ID
|
|
* responses:
|
|
* 200:
|
|
* description: Status toggled successfully
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* message:
|
|
* type: string
|
|
* example: "Statut mis à jour avec succès"
|
|
* data:
|
|
* $ref: '#/components/schemas/MenuCategory'
|
|
* 404:
|
|
* description: Category not found
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.patch('/:id/toggle-status', menuCategoryController.toggleCategoryStatus);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories/reorder:
|
|
* patch:
|
|
* summary: Reorder categories
|
|
* tags: [Menu Categories]
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* categories:
|
|
* type: array
|
|
* items:
|
|
* type: object
|
|
* properties:
|
|
* id:
|
|
* type: integer
|
|
* ordre:
|
|
* type: integer
|
|
* example:
|
|
* - id: 1
|
|
* ordre: 1
|
|
* - id: 2
|
|
* ordre: 2
|
|
* responses:
|
|
* 200:
|
|
* description: Categories reordered successfully
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* message:
|
|
* type: string
|
|
* example: "Ordre des catégories mis à jour avec succès"
|
|
* 400:
|
|
* description: Validation error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.patch('/reorder', menuCategoryController.reorderCategories);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/menu-categories/{id}:
|
|
* delete:
|
|
* summary: Delete menu category
|
|
* tags: [Menu Categories]
|
|
* parameters:
|
|
* - in: path
|
|
* name: id
|
|
* required: true
|
|
* schema:
|
|
* type: integer
|
|
* description: Category ID
|
|
* responses:
|
|
* 200:
|
|
* description: Category deleted successfully
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* success:
|
|
* type: boolean
|
|
* example: true
|
|
* message:
|
|
* type: string
|
|
* example: "Catégorie supprimée avec succès"
|
|
* 400:
|
|
* description: Cannot delete category with associated menus
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 404:
|
|
* description: Category not found
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
* 500:
|
|
* description: Server error
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* $ref: '#/components/schemas/Error'
|
|
*/
|
|
router.delete('/:id', menuCategoryController.deleteCategory);
|
|
|
|
module.exports = router;
|
|
|