| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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;
|