import { Router } from 'express'; import { z } from 'zod'; import db from '../db/index.js'; import { HttpError } from '../middleware/errorHandler.js'; const router = Router(); const DEFAULT_CATEGORIES = [ 'Crowdfunding immobilier', 'Dette privée', 'Immobilier fractionné', 'P2P Crowdlending', ]; /** Insère les catégories par défaut si l'utilisateur n'en a aucune. */ function seedDefaults(userId) { const { n } = db .prepare('SELECT COUNT(*) AS n FROM categories_plateforme WHERE user_id=?') .get(userId); if (n === 0) { const ins = db.prepare( 'INSERT OR IGNORE INTO categories_plateforme (user_id, nom) VALUES (?,?)' ); db.transaction((uid) => { for (const nom of DEFAULT_CATEGORIES) ins.run(uid, nom); })(userId); } } /* GET /api/categories — liste (avec auto-seed au premier appel) */ router.get('/', (req, res) => { seedDefaults(req.user.id); const rows = db .prepare('SELECT id, nom FROM categories_plateforme WHERE user_id=? ORDER BY nom') .all(req.user.id); res.json(rows); }); /* POST /api/categories — créer une catégorie */ router.post('/', (req, res, next) => { try { const { nom } = z.object({ nom: z.string().min(1).max(100) }).parse(req.body); const r = db .prepare('INSERT INTO categories_plateforme (user_id, nom) VALUES (?,?)') .run(req.user.id, nom.trim()); res.status(201).json({ id: r.lastInsertRowid, nom: nom.trim() }); } catch (e) { next(e); } }); /* DELETE /api/categories/:id — supprimer (bloqué si utilisée) */ router.delete('/:id', (req, res, next) => { try { const { n } = db .prepare('SELECT COUNT(*) AS n FROM plateforme_categories WHERE categorie_id=?') .get(req.params.id); if (n > 0) throw new HttpError(409, `Catégorie utilisée par ${n} plateforme(s) — retirez-la d'abord.`); const r = db .prepare('DELETE FROM categories_plateforme WHERE id=? AND user_id=?') .run(req.params.id, req.user.id); if (r.changes === 0) throw new HttpError(404, 'Not found'); res.status(204).end(); } catch (e) { next(e); } }); export default router;