const express = require('express'); const pool = require('../db'); const { authMiddleware } = require('../auth'); const router = express.Router(); router.use(authMiddleware); const DEFAULT_CATEGORIES = [ { value: 'eau', label: 'Eau', icon: '💧' }, { value: 'gaz', label: 'Gaz', icon: '🔥' }, { value: 'electricite', label: 'Électricité', icon: '⚡' }, { value: 'entretien', label: 'Entretien / Réparations', icon: '🔧' }, { value: 'ascenseur', label: 'Ascenseur', icon: '🛗' }, { value: 'ordures', label: 'Ordures ménagères', icon: '🗑️' }, { value: 'assurance', label: 'Assurance', icon: '🛡️' }, { value: 'autre', label: 'Autre', icon: '📦' }, ]; // Seed default categories for a user if none exist async function ensureDefaults(userId) { const count = (await pool.query('SELECT COUNT(*) FROM charge_categories WHERE user_id = $1', [userId])).rows[0].count; if (parseInt(count) === 0) { for (let i = 0; i < DEFAULT_CATEGORIES.length; i++) { const c = DEFAULT_CATEGORIES[i]; await pool.query( 'INSERT INTO charge_categories (user_id, value, label, icon, sort_order) VALUES ($1, $2, $3, $4, $5)', [userId, c.value, c.label, c.icon, i] ); } } } // GET /api/categories - List all categories for user router.get('/', async (req, res) => { await ensureDefaults(req.userId); const rows = (await pool.query( 'SELECT * FROM charge_categories WHERE user_id = $1 ORDER BY sort_order, id', [req.userId] )).rows; res.json(rows); }); // POST /api/categories - Create a new category router.post('/', async (req, res) => { const { value, label, icon } = req.body; if (!value || !label) return res.status(400).json({ error: 'Valeur et libellé requis' }); // Check uniqueness const existing = (await pool.query( 'SELECT id FROM charge_categories WHERE user_id = $1 AND value = $2', [req.userId, value] )).rows[0]; if (existing) return res.status(400).json({ error: 'Cette valeur existe déjà' }); const maxOrder = (await pool.query( 'SELECT COALESCE(MAX(sort_order), 0) + 1 as next FROM charge_categories WHERE user_id = $1', [req.userId] )).rows[0].next; const result = await pool.query( 'INSERT INTO charge_categories (user_id, value, label, icon, sort_order) VALUES ($1, $2, $3, $4, $5) RETURNING *', [req.userId, value, label, icon || '📦', maxOrder] ); res.status(201).json(result.rows[0]); }); // PUT /api/categories/reorder - Reorder categories (must be before /:id) router.put('/reorder', async (req, res) => { const { order } = req.body; if (!Array.isArray(order)) return res.status(400).json({ error: 'Tableau d\'ordre requis' }); for (let i = 0; i < order.length; i++) { await pool.query( 'UPDATE charge_categories SET sort_order = $1 WHERE id = $2 AND user_id = $3', [i, order[i], req.userId] ); } res.json({ success: true }); }); // PUT /api/categories/:id - Update a category router.put('/:id', async (req, res) => { const { label, icon } = req.body; const cat = (await pool.query( 'SELECT id FROM charge_categories WHERE id = $1 AND user_id = $2', [req.params.id, req.userId] )).rows[0]; if (!cat) return res.status(404).json({ error: 'Catégorie non trouvée' }); await pool.query( 'UPDATE charge_categories SET label = $1, icon = $2 WHERE id = $3', [label, icon || '📦', req.params.id] ); res.json({ success: true }); }); // DELETE /api/categories/:id - Delete a category router.delete('/:id', async (req, res) => { const cat = (await pool.query( 'SELECT * FROM charge_categories WHERE id = $1 AND user_id = $2', [req.params.id, req.userId] )).rows[0]; if (!cat) return res.status(404).json({ error: 'Catégorie non trouvée' }); // Check if category is in use const inUse = (await pool.query( 'SELECT COUNT(*) FROM charges WHERE user_id = $1 AND category = $2', [req.userId, cat.value] )).rows[0].count; if (parseInt(inUse) > 0) { return res.status(400).json({ error: `Impossible de supprimer : ${inUse} charge(s) utilisent cette catégorie` }); } await pool.query('DELETE FROM charge_categories WHERE id = $1', [req.params.id]); res.json({ success: true }); }); module.exports = router;