Files
crowdlending-app/backend/src/routes/categories.js
T
2026-06-13 14:57:15 +02:00

66 lines
2.1 KiB
JavaScript

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;