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.
 

193 lines
5.7 KiB

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;