import express from 'express'; import pool from '../database.js'; const router = express.Router(); // GET all violation rules router.get('/', async (req, res) => { try { const [rows] = await pool.execute(` SELECT id, code, description, category, score, default_sanction FROM violation_rules ORDER BY category, score DESC `); res.json(rows); } catch (error) { console.error('Error fetching violation rules:', error); res.status(500).json({ error: 'Failed to fetch violation rules' }); } }); // POST create new violation rule router.post('/', async (req, res) => { try { const { code, description, category, score, defaultSanction } = req.body; // Check if code already exists const [existing] = await pool.execute( 'SELECT id FROM violation_rules WHERE code = ?', [code] ); if (existing.length > 0) { return res.status(400).json({ status: 'error', error: `Kode "${code}" sudah digunakan` }); } const [result] = await pool.execute(` INSERT INTO violation_rules (code, description, category, score, default_sanction) VALUES (?, ?, ?, ?, ?) `, [code, description, category, score, defaultSanction || null]); res.json({ status: 'success', id: result.insertId, message: 'Jenis pelanggaran berhasil ditambahkan' }); } catch (error) { console.error('Error creating violation rule:', error); res.status(500).json({ status: 'error', error: 'Failed to create violation rule' }); } }); // PUT update violation rule router.put('/:id', async (req, res) => { try { const { code, description, category, score, defaultSanction } = req.body; const { id } = req.params; // Check if code already exists for other rules const [existing] = await pool.execute( 'SELECT id FROM violation_rules WHERE code = ? AND id != ?', [code, id] ); if (existing.length > 0) { return res.status(400).json({ status: 'error', error: `Kode "${code}" sudah digunakan` }); } await pool.execute(` UPDATE violation_rules SET code = ?, description = ?, category = ?, score = ?, default_sanction = ? WHERE id = ? `, [code, description, category, score, defaultSanction || null, id]); res.json({ status: 'success', message: 'Jenis pelanggaran berhasil diperbarui' }); } catch (error) { console.error('Error updating violation rule:', error); res.status(500).json({ status: 'error', error: 'Failed to update violation rule' }); } }); // DELETE violation rule router.delete('/:id', async (req, res) => { try { await pool.execute('DELETE FROM violation_rules WHERE id = ?', [req.params.id]); res.json({ status: 'success', message: 'Jenis pelanggaran berhasil dihapus' }); } catch (error) { console.error('Error deleting violation rule:', error); res.status(500).json({ status: 'error', error: 'Failed to delete violation rule' }); } }); // POST import bulk violation rules router.post('/import', async (req, res) => { try { const { rules } = req.body; let success = 0; let failed = 0; const errors = []; for (const rule of rules) { try { const { code, description, category, score, defaultSanction } = rule; // Insert or update if code exists await pool.execute(` INSERT INTO violation_rules (code, description, category, score, default_sanction) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE description = VALUES(description), category = VALUES(category), score = VALUES(score), default_sanction = VALUES(default_sanction) `, [code, description, category, score, defaultSanction || null]); success++; } catch (e) { failed++; errors.push(`${rule.code}: ${e.message}`); } } res.json({ status: 'success', success, failed, errors }); } catch (error) { console.error('Error importing violation rules:', error); res.status(500).json({ status: 'error', error: 'Failed to import violation rules' }); } }); export default router;