/** * Rules Routes * Manage transformation rules */ const express = require('express'); module.exports = (pool) => { const router = express.Router(); // List all rules for a source router.get('/source/:source_name', async (req, res, next) => { try { const result = await pool.query( 'SELECT * FROM rules WHERE source_name = $1 ORDER BY sequence, name', [req.params.source_name] ); res.json(result.rows); } catch (err) { next(err); } }); // Get single rule router.get('/:id', async (req, res, next) => { try { const result = await pool.query( 'SELECT * FROM rules WHERE id = $1', [req.params.id] ); if (result.rows.length === 0) { return res.status(404).json({ error: 'Rule not found' }); } res.json(result.rows[0]); } catch (err) { next(err); } }); // Create rule router.post('/', async (req, res, next) => { try { const { source_name, name, field, pattern, output_field, enabled, sequence } = req.body; if (!source_name || !name || !field || !pattern || !output_field) { return res.status(400).json({ error: 'Missing required fields: source_name, name, field, pattern, output_field' }); } const result = await pool.query( `INSERT INTO rules (source_name, name, field, pattern, output_field, enabled, sequence) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *`, [source_name, name, field, pattern, output_field, enabled !== false, sequence || 0] ); res.status(201).json(result.rows[0]); } catch (err) { if (err.code === '23505') { // Unique violation return res.status(409).json({ error: 'Rule already exists for this source' }); } if (err.code === '23503') { // Foreign key violation return res.status(404).json({ error: 'Source not found' }); } next(err); } }); // Update rule router.put('/:id', async (req, res, next) => { try { const { name, field, pattern, output_field, enabled, sequence } = req.body; const result = await pool.query( `UPDATE rules SET name = COALESCE($2, name), field = COALESCE($3, field), pattern = COALESCE($4, pattern), output_field = COALESCE($5, output_field), enabled = COALESCE($6, enabled), sequence = COALESCE($7, sequence) WHERE id = $1 RETURNING *`, [req.params.id, name, field, pattern, output_field, enabled, sequence] ); if (result.rows.length === 0) { return res.status(404).json({ error: 'Rule not found' }); } res.json(result.rows[0]); } catch (err) { next(err); } }); // Delete rule router.delete('/:id', async (req, res, next) => { try { const result = await pool.query( 'DELETE FROM rules WHERE id = $1 RETURNING id, name', [req.params.id] ); if (result.rows.length === 0) { return res.status(404).json({ error: 'Rule not found' }); } res.json({ success: true, deleted: result.rows[0] }); } catch (err) { next(err); } }); return router; };