133 lines
4.7 KiB
JavaScript
133 lines
4.7 KiB
JavaScript
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;
|