const { MenuCategory, Menu } = require('../models/associations'); const categoryController = { // Get all categories getAllCategories: async (req, res) => { try { const { include_menus = 'false' } = req.query; const options = { order: [['ordre', 'ASC'], ['nom', 'ASC']] }; if (include_menus === 'true') { options.include = [{ model: Menu, as: 'menus', attributes: ['id', 'nom', 'prix', 'disponible'] }]; } const categories = await MenuCategory.findAll(options); res.json({ success: true, data: categories }); } catch (error) { console.error('Error fetching categories:', error); res.status(500).json({ success: false, message: 'Erreur lors de la récupération des catégories', error: error.message }); } }, // Get category by ID getCategoryById: async (req, res) => { try { const { id } = req.params; const category = await MenuCategory.findByPk(id, { include: [{ model: Menu, as: 'menus', attributes: ['id', 'nom', 'prix', 'disponible'] }] }); if (!category) { return res.status(404).json({ success: false, message: 'Catégorie non trouvée' }); } res.json({ success: true, data: category }); } catch (error) { console.error('Error fetching category:', error); res.status(500).json({ success: false, message: 'Erreur lors de la récupération de la catégorie', error: error.message }); } }, // Create category createCategory: async (req, res) => { try { const { nom, description, ordre = 0, actif = true } = req.body; if (!nom) { return res.status(400).json({ success: false, message: 'Le nom de la catégorie est requis' }); } const category = await MenuCategory.create({ nom, description, ordre, actif }); res.status(201).json({ success: true, message: 'Catégorie créée avec succès', data: category }); } catch (error) { console.error('Error creating category:', error); if (error.name === 'SequelizeUniqueConstraintError') { return res.status(400).json({ success: false, message: 'Une catégorie avec ce nom existe déjà' }); } res.status(500).json({ success: false, message: 'Erreur lors de la création de la catégorie', error: error.message }); } }, // Update category updateCategory: async (req, res) => { try { const { id } = req.params; const { nom, description, ordre, actif } = req.body; const category = await MenuCategory.findByPk(id); if (!category) { return res.status(404).json({ success: false, message: 'Catégorie non trouvée' }); } await category.update({ nom: nom !== undefined ? nom : category.nom, description: description !== undefined ? description : category.description, ordre: ordre !== undefined ? ordre : category.ordre, actif: actif !== undefined ? actif : category.actif }); res.json({ success: true, message: 'Catégorie mise à jour avec succès', data: category }); } catch (error) { console.error('Error updating category:', error); res.status(500).json({ success: false, message: 'Erreur lors de la mise à jour de la catégorie', error: error.message }); } }, // Delete category deleteCategory: async (req, res) => { try { const { id } = req.params; const category = await MenuCategory.findByPk(id); if (!category) { return res.status(404).json({ success: false, message: 'Catégorie non trouvée' }); } // Check if category has menus const menuCount = await Menu.count({ where: { categorie_id: id } }); if (menuCount > 0) { return res.status(400).json({ success: false, message: `Impossible de supprimer la catégorie. Elle contient ${menuCount} menu(s)` }); } await category.destroy(); res.json({ success: true, message: 'Catégorie supprimée avec succès' }); } catch (error) { console.error('Error deleting category:', error); res.status(500).json({ success: false, message: 'Erreur lors de la suppression de la catégorie', error: error.message }); } } }; module.exports = categoryController;